metoda bisekcji przekazywanie funkcji przez wskaźnik.
Ostatnio zmodyfikowano 2017-12-18 11:36
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. #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; }
|
|
Monika90 |
» 2017-12-17 18:30:23 Nie przekazuj parametrów typu double przez wskaźniki, to rozwiąże wiele twoich problemów. |
|
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*&)'| |
|
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. |
|
Roud Temat założony przez niniejszego użytkownika |
» 2017-12-17 18:56:04 Ale muszę zrobić to przez wskaźniki. |
|
mateczek |
» 2017-12-18 06:49:32 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; } poprawiłem tak by się kompilowało i uruchomiło co to liczy nie wnikałem #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 |
|
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. |
|
mateczek |
» 2017-12-18 11:36:51 nie zwróciłem uwagi bo windowsowy kompilator mi to skompilował. Poprawiona funkcja main() 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; break; case 2: wsk = & f2; break; case 3: wsk = & f3; break; } wypisz( wsk ); return 0; } |
|
« 1 » |