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

metoda bisekcji przekazywanie funkcji przez wskaźnik.

Ostatnio zmodyfikowano 2017-12-18 11:36
Autor Wiadomość
Roud
Temat założony przez niniejszego użytkownika
metoda bisekcji przekazywanie funkcji przez wskaźnik.
» 2017-12-17 18:09:45
Może mi ktoś pomóc? Nie bardzo rozumiem jak to zrobić. Wziąłem algorytm na bisekcje z internetu.

C/C++
#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

double f1( double * x )
{
    return 2 *( * x ) - 5;
}
double f2( double * x )
{
    return - 3 *( * x ) + 2;
}
double f3( double * x )
{
    return * x - 1;
}
double wypisz( double( * wsk )( double * x ), double * a, double * b )
{
    * a = - 100, * b = 100;
    double f0, mz, eps = 0.0001;
    double fa = wsk( a ), fb = wsk( b );
    if( fa * fb > 0 ) cout << "Funkcja nie spelnia zalozen\n";
    else
    {
        while( fabs( a - b ) > eps )
        {
            mz =( a + b ) / 2; f0 = wsk( mz );
            if( fabs( f0 ) < eps ) break;
           
            if( fa * f0 < 0 ) b = mz;
            else
            {
                a = mz; fa = f0;
            }
        }
        cout << "mz = " << mz << endl;
    }
}

int main()
{
    double * xp = new double;
    double * xk = new double;
    double( * wsk )( double * );
    cout << "1. 2x-5 2.-3x+2 3. x-1 ";
    int wybor;
    cin >> wybor;
    switch( wybor )
    {
    case 1: wsk = f1;
    case 2: wsk = f2;
    case 3: wsk = f3;
    }
    wypisz( wsk, xp, xk );
   
   
    return 0;
}
P-167959
Monika90
» 2017-12-17 18:30:23
Nie przekazuj parametrów typu double przez wskaźniki, to rozwiąże wiele twoich problemów.
P-167960
Roud
Temat założony przez niniejszego użytkownika
» 2017-12-17 18:46:39
cos takiego wyskakuje. O co chodzi? Dwóch zmiennych typu float* nie mozna dodawać?
32. invalid operands of types 'float*' and 'float*' to binary 'operator+'|
32. cannot convert 'float' to 'float*' in assignment|
33. no matching function for call to 'fabs(float*&)'|
P-167961
Monika90
» 2017-12-17 18:53:15
Nie przyszło mi do głowy, że jak napiszę nie używaj double* to zmienisz na float*. Chodziło o to żebyś w ogóle nie używał wskaźników, przekazuj double przez wartość. Wskaźników nie można dodawać, bo to nie ma sensu.
P-167962
Roud
Temat założony przez niniejszego użytkownika
» 2017-12-17 18:56:04
Ale muszę zrobić to przez wskaźniki.
P-167963
mateczek
» 2017-12-18 06:49:32
C/C++
int main()
{
    double * xp = new double; // nie korzystasz!!!
    double * xk = new double; // nie korzystasz !!!
    double( * wsk )( double * );
    cout << "1. 2x-5 2.-3x+2 3. x-1 ";
    int wybor;
    cin >> wybor;
    switch( wybor )
    {
    case 1: wsk = f1;
    case 2: wsk = f2;
    case 3: wsk = f3;
    }
    wypisz( wsk, xp, xk ); // po co tu xp?? xk?? skoro i tak z nich nie korzystasz ?? To jest bez sensu
   
   
    return 0;
}

poprawiłem tak by się kompilowało i uruchomiło co to liczy nie wnikałem

C/C++
#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

double f1( double * x )
{
    return 2 *( * x ) - 5;
}
double f2( double * x )
{
    return - 3 *( * x ) + 2;
}
double f3( double * x )
{
    return * x - 1;
}
void wypisz( double( * wsk )( double * x ) )
{
    double a = - 100, b = 100;
    double f0, mz, eps = 0.0001;
    double fa =( * wsk )( & a );
    double fb =( * wsk )( & b );
    if( fa * fb > 0 ) cout << "Funkcja nie spelnia zalozen\n";
    else
    {
        while( fabs( a - b ) > eps )
        {
            mz =( a + b ) / 2;
            f0 =( * wsk )( & mz );
            if( fabs( f0 ) < eps ) break;
           
            if( fa * f0 < 0 ) b = mz;
            else
            {
                a = mz; fa = f0;
            }
        }
        cout << "mz = " << mz << endl;
    }
}

int main()
{
    double( * wsk )( double * );
    cout << "1. 2x-5 2.-3x+2 3. x-1 ";
    int wybor;
    cin >> wybor;
    switch( wybor )
    {
    case 1: wsk = f1;
    case 2: wsk = f2;
    case 3: wsk = f3;
    }
    wypisz( wsk );
   
   
    return 0;
}

Jeśli interesuje cie takie działanie i chciałbyś to robić ładniej poczytaj o std::funcion i std::bind . Naprawdę zarąbista sprawa
P-167971
Roud
Temat założony przez niniejszego użytkownika
» 2017-12-18 09:53:41
Dziękuje bardzo. :) W case zabrakło break; dlatego liczyło troszkę źle.
P-167972
mateczek
» 2017-12-18 11:36:51
nie zwróciłem uwagi bo windowsowy kompilator mi to skompilował.

Poprawiona funkcja main()
C/C++
int main()
{
    double( * wsk )( double * );
    cout << "1. 2x-5 2.-3x+2 3. x-1 ";
    int wybor;
    cin >> wybor;
    switch( wybor )
    {
    case 1:
        wsk = & f1; // czasami trzeba tak !!!
        //choć teraz widzę że obie wersje  wsk=f1 i wsk=&f1 działają poprawnie. Jednak kiedyś miałem z tym problem na jednym z systemów
        break;
    case 2:
        wsk = & f2;
       
        break;
    case 3:
        wsk = & f3;
        break;
    }
    wypisz( wsk );
   
   
    return 0;
}
P-167973
« 1 »
  Strona 1 z 1