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 »  |