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

Program liczacy pierwiastek funkcji - nie zwraca wyniku

Ostatnio zmodyfikowano 2015-11-07 12:36
Autor Wiadomość
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

C/C++
#include "iostream"
#define _USE_MATH_DEFINES
#include "math.h"
#include "cmath"
#include "conio.h"
using namespace std;

float wartosc_funkcji( float x ) // Tu licze wartosc funkcji
{
    float wartosc;
   
    wartosc =( exp( - 1.5 * x ) -( 0.3 * pow( x, 2 ) ) );
    return wartosc;
}

float funkcja_bisekcji( int a, int b, double dokladnosc ) // Licze miejsce zerowe
{
    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;
}
P-139719
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 ?
P-139720
carlosmay
» 2015-11-07 00:19:08
C/C++
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.
P-139723
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() ) {...}
P-139734
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


C/C++
#include "iostream"
#define _USE_MATH_DEFINES
#include "math.h"
#include "cmath"
#include "conio.h"
using namespace std;

float wartosc_funkcji( float x ) // Tu licze wartosc funkcji
{
    float wartosc;
    wartosc =( exp( - 1.5 * x ) -( 0.3 * pow( x, 2 ) ) );
    return wartosc;
}

float funkcja_bisekcji( float a, float b, float dokladnosc ) // Licze miejsce zerowe
{
    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;
}
P-139740
« 1 »
  Strona 1 z 1