Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Metoda siecznych C++

Ostatnio zmodyfikowano 2016-12-10 18:53
Autor Wiadomość
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++ ?

C/C++
void sieczne( double x0, double x1 )
{
    // Deklaracje zmiennych.
    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 ) // Sprawdzenie zalożenia metody dla pierwszej iteracji.
    {
        Do // pętla przeprowadzająca kolejne sieczne.
        {
            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 ) ) ); // Warunek zakończenia pętli.
       
    }
    else
         cout << "Ktoras pochodna zmienia znak w tym przedziale\n";
   
};
 
P-154720
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:

C/C++
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:

C/C++
fabs( fun( x0 ) - fun( x1 ) ) < e ||( fun( x0 ) * fun( x1 ) < 0
 
Po przekształceniach:

C/C++
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 );
}
P-154739
« 1 »
  Strona 1 z 1