Program liczacy pierwiastek funkcji - nie zwraca wyniku
Ostatnio zmodyfikowano 2015-11-07 12:36
TandK Temat założony przez niniejszego użytkownika |
Program liczacy pierwiastek funkcji - nie zwraca wyniku » 2015-11-06 23:44:33 Dzien dobry wlasnie zaczalem "przygode" z c++. Stworzylem program do liczenia pierwiastkow funkcji (zalozeniem bylo zrobienie tego z uzyciem 2 funkcji) 1 miala liczyc jej wartosc, druga metoda bisekcji znalezc pierwiastek z zadanym przyblizeniem. Niestety od paru dni nie moge rozgryzc co jest zle, program sie kompiluje ale w konsoli nie zwraca wyniku. Bylbym wdzieczny za pomoc - w necie znalazlem podobne programy ale niestety zaden nie pomogl mi zrozumiec bledu Edit - zmienilem podana w przykladzie funkcje na prosta funkcje liniowa i wszystko liczy sie przy dowolnie zadanej dokladnosci - wiec chyba nie jest to wina kodu... rece mi opadaja, stracilem na to kupe czasu ktory moglem poswiecic na inne rzeczy i 0 efektow #include "iostream" #define _USE_MATH_DEFINES #include "math.h" #include "cmath" #include "conio.h" using namespace std;
float wartosc_funkcji( float x ) { float wartosc; wartosc =( exp( - 1.5 * x ) -( 0.3 * pow( x, 2 ) ) ); return wartosc; }
float funkcja_bisekcji( int a, int b, double dokladnosc ) { float c; int k = 0; if( wartosc_funkcji( a ) == 0 ) { c = a; } if( wartosc_funkcji( b ) == 0 ) { c = b; } else do { k = k++; c =( b - a ) / 2; if( wartosc_funkcji( c ) == 0 ) { break; } if( wartosc_funkcji( c ) < 0 ) { a = c; } else { b = c; } } while( abs( wartosc_funkcji( c ) ) > dokladnosc ); cout << "ilosc krokow !k! = " << k << endl; cout << "!!" << c; return c; }
int main() { float p, q; float dokladnosc; float miejsce_zerowe; cout << "Podaj dolna granice przedzialu: "; cin >> p; cout << "Podaj gorna granice przedzialu: "; cin >> q; cout << "Podaj dokladnosc: "; cin >> dokladnosc; cout << "Miejsce zerowe funkcji to x =" << funkcja_bisekcji( p, q, dokladnosc ) << endl; system( "pause" ); return 0; }
|
|
michal11 |
» 2015-11-07 00:03:20 Przede wszystkim twoja funkcja przyjmuje inty a ty przesyłasz floaty - czyli gubisz część ułamkową. k = k++; to jest nadmiarowe, wystarczy samo ++k; . Co to znaczy, że program nie zwraca wyniku ? Żadnego czy poprawnego ? |
|
carlosmay |
» 2015-11-07 00:19:08 do { k = k++; c =( b - a ) / 2; if( wartosc_funkcji( c ) == 0 ) { break; } if( wartosc_funkcji( c ) < 0 ) { a = c; } else { b = c; } } while( abs( wartosc_funkcji( c ) ) > dokladnosc );
tutaj się zapętla. |
|
j23 |
» 2015-11-07 10:48:09 if( wartosc_funkcji( c ) == 0 ) |
Z takim porównywaniem wartości zmiennoprzecinkowych bywa różnie, tzn. typ float/ double ma ograniczoną precyzję, więc wynik jakichś złożonych operacji może być w okolicach oczekiwanej wartości, dlatego warto przyjąć pewien margines błędu, np. tak: if( std::abs( wartosc_funkcji( c ) ) < std::numeric_limits < float >::epsilon() ) {...} |
|
TandK Temat założony przez niniejszego użytkownika |
» 2015-11-07 12:36:22 Ciagle nie potrafie tego rozgryzc, usunalem czesc if bo skoro licze miejsce zerowe z przyblizeniem to nie ma sensu liczyc wartosci na granicach przedzialu (niby czasem mozemy trafic na nie szybciej), w pewnym momencie pokazalo mi wynik i juz myslalem, ze jest ok ale zapetlilo sie przy kolejnym wykonaniu, petli sie na dokladnosci ponizej 0.41. To sa moje poczatki programowania i nie bardzo rozumiem sens zadan gdzie musze uwazac na jakies kruczki, siedze nad tym juz ladne kilka dni, nie wiem czy to problem w algorytmie czy w napisanym kodzie, ale moje morale i checi do dalszej pracy z c++ spadaja - HELP! Z tego co napisales rozumiem, ze jesli nie ma bledu w kodzie problem lezy po stronie warunku while w funkcji_bisekcja oto moj zmieniony kod: Edit - zmienilem podana w przykladzie funkcje na prosta funkcje liniowa i wszystko liczy sie przy dowolnie zadanej dokladnosci - wiec chyba nie jest to wina kodu... rece mi opadaja, stracilem na to kupe czasu ktory moglem poswiecic na inne rzeczy i 0 efektow #include "iostream" #define _USE_MATH_DEFINES #include "math.h" #include "cmath" #include "conio.h" using namespace std;
float wartosc_funkcji( float x ) { float wartosc; wartosc =( exp( - 1.5 * x ) -( 0.3 * pow( x, 2 ) ) ); return wartosc; }
float funkcja_bisekcji( float a, float b, float dokladnosc ) { float c; int k = 0; do { k = k++; c =( b + a ) / 2; if( wartosc_funkcji( c ) < 0 ) a = c; else b = c; } while( abs( wartosc_funkcji( c ) ) > dokladnosc ); cout << "ilosc krokow !k! = " << k << endl; cout << "parametr !c! pierwiastek = " << c << endl; return c; }
float main() { float p, q; float dokladnosc; float miejsce_zerowe; cout << "Podaj dolna granice przedzialu: "; cin >> p; cout << "Podaj gorna granice przedzialu: "; cin >> q; cout << "Podaj dokladnosc: "; cin >> dokladnosc; if(( wartosc_funkcji( p ) * wartosc_funkcji( q ) ) < 0 ) cout << "Miejsce zerowe funkcji x = " << funkcja_bisekcji( p, q, dokladnosc ); else cout << "Funkcja nie ma miejsca zerowego w podanym przedziale lub nie jest ciagla" << endl; system( "pause" ); return 0; }
|
|
« 1 » |