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

Zadanie szkolne - Wyznaczanie miejsca zerowego funkcji metoda polowienia przedzialow

Ostatnio zmodyfikowano 2017-06-01 12:57
Autor Wiadomość
diabelrokita
Temat założony przez niniejszego użytkownika
Zadanie szkolne - Wyznaczanie miejsca zerowego funkcji metoda polowienia przedzialow
» 2017-06-01 00:15:01
Witam !
Otóż program działa dobrze jeśli w podanym przedziale znajduje się jakikolwiek pierwiastek. Problem leży w tym że gdy go nie ma program podaje wartość tego miejsca na jednym z początkowych krańców przedziału. Próbowałem zapisać ten warunek rożnymi metodami ale nic nie pomaga. Pomocy !

KOD
##########################################################

C/C++
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <windows.h>

using namespace std;

double horner( float x, int n, int wsp[] )
{
    if( n == 0 )
         return wsp[ 0 ];
   
    return x * horner( x, n - 1, wsp ) + wsp[ n ];
}

double polowienie( double x1, double x2, double dokladnosc, int wsp[], int n )
{
    if( horner( x1, n, wsp ) == 0 ) return x1;
   
    if( horner( x2, n, wsp ) == 0 ) return x2;
   
    double s;
    while( x2 - x1 > dokladnosc )
    {
        s =( x1 + x2 ) / 2;
       
        if( horner( s, n, wsp ) == 0 ) return s;
       
        if( horner( s, n, wsp ) * horner( x1, n, wsp ) < 0 )
             x2 = s;
        else
             x1 = s;
       
    }
    return( x1 + x2 ) / 2;
}

int main()
{
    int n, i;
    double x1, x2;
    int * wsp;
    double dokladnosc = 0.00001;
    double wynik;
   
    cout << "Podaj poczatek przedzialu: ";
    cin >> x1;
    cout << "Podaj koniec przedzialu: ";
    cin >> x2;
   
   
    if( x1 > x2 || x1 == x2 )
    {
        cout << "Zle oznaczyles przedzial !";
        Sleep( 2000 );
        system( "cls" );
        main();
    }
   
   
    cout << "Ilu stopniowy wielomian ?";
    cin >> n;
   
   
    wsp = new int[ n + 1 ];
   
   
    for( i = 0; i <= n; i++ )
    {
        cout << "Podaj wspolczynnik przy " << n - i << " potedze: ";
        cin >> wsp[ i ];
    }
   
   
    wynik = polowienie( x1, x2, dokladnosc, wsp, n );
   
   
    if( wynik != x1 || wynik != x2 )
    {
        cout << "Miejsce zerowe funkcji wynosi: ";
        cout << fixed << setprecision( 5 ) << wynik;
    }
    else cout << "Brak miejsca zerowego w podanym przedziale";
   
   
    return 0;
}
###################################################[/i]
P-161891
pekfos
» 2017-06-01 01:03:18
Jeśli wynik wskazuje na miejsce zerowe, to pewnie wartość funkcji w tym punkcie jest bardzo bliska zeru.
P-161893
diabelrokita
Temat założony przez niniejszego użytkownika
» 2017-06-01 02:01:47
Otóż nie. Dla przykładu tworząc dowolną funkcje w aplikacji geogebra można dokładnie stwierdzić że tak nie jest. Nie wiem w którym miejscu popełniłem błąd (o ile popełniłem).
P-161897
pekfos
» 2017-06-01 02:08:23
Problem leży w tym że gdy go nie ma program podaje wartość tego miejsca na jednym z początkowych krańców przedziału. Próbowałem zapisać ten warunek rożnymi metodami ale nic nie pomaga.
Jeśli te błędnie wskazane miejsce nie jest miejscem zerowym, to pewnie wartość funkcji w tym punkcie nie jest bardzo bliska zeru.
P-161898
diabelrokita
Temat założony przez niniejszego użytkownika
» 2017-06-01 12:57:03
Ostatnia wskazówka byla bardzo pomocna . Bardzo dziekuje za pomoc pozdrawiam :)

C/C++
if( horner( wynik, n, wsp ) == 0 || round( abs( horner( wynik, n, wsp ) ) - dokladnosc ) == 0 )
{
    cout << "Miejsce zerowe funkcji wynosi: ";
    cout << fixed << setprecision( 5 ) << wynik;
}

else
     cout << "Brak miejsca zerowego w podanym przedziale";


return 0;
P-161919
« 1 »
  Strona 1 z 1