Zadanie szkolne - Wyznaczanie miejsca zerowego funkcji metoda polowienia przedzialow
Ostatnio zmodyfikowano 2017-06-01 12:57
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 ########################################################## #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] |
|
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. |
|
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). |
|
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. |
|
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 :) 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;
|
|
« 1 » |