[C++] Wielomiany Laguerre'a
Ostatnio zmodyfikowano 2014-11-24 12:14
Saphira Temat założony przez niniejszego użytkownika |
[C++] Wielomiany Laguerre'a » 2014-11-17 01:48:50 Witam. Mam dosyć trudne zadanie do wykonania i kompletnie nie wiem, jak się za to zabrać. Mam policzyć pierwiastki pierwszych pięciu wielomianów Laguerre'a. Mam to zrobić na dwa sposoby - "sztywno" podać te wielomiany i policzyć metodą Newtona ich pierwiastki, oraz zrobić to samo, tylko że rekurencyjnie. Wzór, z którego korzystam tutaj to Ln+2(x) = (2n + 3 - x)Ln+1(x) - (n+1)^2 * Ln(x) dla n >= 0. Nie mam niestety nawet części kodu, ponieważ to zadanie mnie, delikatnie mówiąc, przerosło. Proszę o pomoc. |
|
darko202 |
» 2014-11-21 13:17:26 ale z czym masz problem ? z zrozumieniem zadania, rekurencją czy napisanym algorytmem
nie zajmowałem się tym nigdy, z materiałów znalezionych na https://www.google.pl/?gws_rd=ssl#q=wielomiany+laguerre'a
wywnioskowałem, że 1. masz w zadaniu algorytm Ln+2(x) = (2n + 3 - x)Ln+1(x) - (n+1)^2 * Ln(x) dla n >= 0.
co daje nam : L0(x) = 1 //z definicji L1(x) = 5-x L2(x) = (7-x)(5-x) - 9 itd. liczymy z definicji
pierwiastki to miejsca zerowe wielomianu (w rozwiązanie może być liczba zespoloną)
2. rekurencja jest masowo opisywana
3. co do algorytmu spojrzyj na http://www.algorytm.org/procedury-numeryczne/metoda-laguerre-a.html
|
|
Saphira Temat założony przez niniejszego użytkownika |
» 2014-11-22 13:15:08 Tylko, że właśnie mam za zadanie policzyć pierwiastki wielomianów Laguerre'a, a nie metodą Laguerre'a... Problem sprawia mi przepisanie wszystko na C++ |
|
darko202 |
» 2014-11-24 12:14:12 problem sprowadza się do znalezienia pierwiastków wielomianu np. dla W(X)=2x5+3x4−2x−3 pierwiastkami są: 1, -1 , 1.5, i, -i pierwsze podejście to http://www.matma.net.pl/wielomiany.php w C++ chcielibyśmy uzyskać coś takiego main { int wspolczynniki[ 6 ] = { - 3, - 2, 0, 0, 3, 2 }; Wielomian w; w.Dane( 5, wspolczynniki ); w.Print(); cout << " W(1) == " << w.Pierwiastek( 1 ) << "\n"; ... }
do tego potrzebowalibyśmy np. klasy const int MAX_STOPIEN = 6; class Wielomian { public: Wielomian( void ); void Dane( int stopien, int wyrazy[] ); void Print(); bool Pierwiastek( double liczba ); ~Wielomian( void ); private: int stopien; int wyrazy[ MAX_STOPIEN ]; };
#include "StdAfx.h" #include<iostream> #include "Wielomian.h" #include <cstdlib> using namespace std;
Wielomian::Wielomian( void ) { }
void Wielomian::Dane( int stop, int w[] ) { stopien = stop + 1; for( int i = 0; i < stopien; i++ ) { wyrazy[ i ] = w[ i ]; } }
bool Wielomian::Pierwiastek( double liczba ) { double x = 5, z = 1; for( int i = 0; i < stopien; i++ ) { z = 1; for( int j = 0; j < stopien; j++ ) { z = z * liczba; } x += wyrazy[ i ] * z; } if( x == 0 ) return true; else return false; }
void Wielomian::Print() { for( int i = stopien - 1; i > 0; i-- ) { cout << wyrazy[ i ] << "x^" << i << " + "; } }
Wielomian::~Wielomian( void ) { }
widać ze metodę Pierwiastek należy poprawić dla przypadków zespolonych gdzie i^2 = -1; np. Pierwiastek(double rzeczywista, double urojona); oraz popracować nad algorytmem typowania możliwych pierwiastków zgodnie z zasadami rozwiązywania układów równań. Ponieważ twój problem dotyczy ustalonych pierwiastków wielomianów Laguerre'a masz podaną definicję sprawdź czy są tam przypadki urojone |
|
« 1 » |