Metoda siecznych C++
Ostatnio zmodyfikowano 2016-12-10 18:53
ws89 Temat założony przez niniejszego użytkownika |
Metoda siecznych C++ » 2016-12-10 10:35:25 Witam, Mam napisać program w C++, który rozwiązuje równanie za pomocą metody siecznych. Napisałem takie coś, ale podobno jest źle. Możecie mi powiedzieć jak ma wyglądać metoda siecznych w C++ ? void sieczne( double x0, double x1 ) { double wx0, wx1, wx2, x2, ap1, ap2, bp1, bp2; cout << x0 << x1 << endl; ap1 = 5 * pow( x0, 4 ) + 3 * pow( x0, 2 ) - 1 - pow( 3, x0 ) * log( 3.0 ); bp1 = 5 * pow( x1, 4 ) + 3 * pow( x1, 2 ) - 1 - pow( 3, x1 ) * log( 3.0 ); ap2 = 20 * pow( x0, 3 ) + 6 * x0 - pow( 3, x0 ) * pow( log( 3.0 ), 2 ) -( pow( 3, x0 ) / x0 ); bp2 = 20 * pow( x1, 3 ) + 6 * x1 - pow( 3, x1 ) * pow( log( 3.0 ), 2 ) -( pow( 3, x1 ) / x1 ); wx0 = pow( x0, 5 ) + pow( x0, 3 ) - x0 + 0.7 - pow( 3, x0 ); wx1 = pow( x1, 5 ) + pow( x1, 3 ) - x1 + 0.7 - pow( 3, x1 ); if( ap1 * bp1 > 0 && ap2 * bp2 > 0 && wx0 * wx1 < 0 ) { Do { wx0 = pow( x0, 5 ) + pow( x0, 3 ) - x0 + 0.7 - pow( 3, x0 ); wx1 = pow( x1, 5 ) + pow( x1, 3 ) - x1 + 0.7 - pow( 3, x1 ); x2 = x1 - wx1 *(( x1 - x0 ) /( wx1 - wx0 ) ); wx2 = pow( x2, 5 ) + pow( x2, 3 ) - x2 + 0.7 - pow( 3, x2 ); cout << setprecision( 10 ) << "W punkcie " << x2 << " przyblizone wartosc pierwiastka wynosi " << wx2 << endl; wx0 = wx1; wx1 = wx2; x0 = x1; x1 = x2; } while( abs( wx2 ) >( 1 / pow( 10.0, 10 ) ) ); } else cout << "Ktoras pochodna zmienia znak w tym przedziale\n"; };
|
|
czaffik |
» 2016-12-10 18:53:00 Niby dobrze, zgodnie z tym co podają tutaj: http://eduinf.waw.pl/inf/alg/005_root/0012.php lub tutaj: http://eff10.internetdsl.tpnet.pl/programowanie/mz_fun/pages/regulafalsi.htm. Mógłbyś usunąć parę nadmiarowych przypisań, zwinąć kod odpowiadający za funkcję w funkcję cpp i wyglądało by nieco lepiej. Tylko pytanie dotyczące warunku wykonania kodu: if( ap1 * bp1 > 0 && ap2 * bp2 > 0 && wx0 * wx1 < 0 )
Skąd go wziełeś? Nie wiem czy poprawny czy nie, ale według info podanych w przytoczonej wyżej stronie warunek wygląda tak: fabs( fun( x0 ) - fun( x1 ) ) < e ||( fun( x0 ) * fun( x1 ) < 0
Po przekształceniach: double fun( double x ) { return pow( x, 3 ) *( x + sin( x * x - 1 ) - 1 ) - 1; }
void sieczne( double x0, double x1 ) { double wx0, wx1, wx2, x2; const double e = 0.0000000001; if( fabs( fun( x0 ) - fun( x1 ) ) < e ||( fun( x0 ) * fun( x1 ) < 0 ) { cout << "Niespelnione zalozenia poczatkowe" << endl; return; } wx0 = fun( x0 ); wx1 = fun( x1 ); do { wx0 = fun( x0 ); wx1 = fun( x1 ); x2 = x1 - wx1 *(( x1 - x0 ) /( wx1 - wx0 ) ); wx2 = fun( x2 ); if( wx2 < e ) { cout << setprecision( 10 ) << "W punkcie " << x2 << " przyblizone wartosc pierwiastka wynosi " << wx2 << endl; return; } x0 = x1; x1 = x2; } while( fabs( wx2 ) > e ); }
|
|
« 1 » |