Metoda Newtona
Ostatnio zmodyfikowano 2012-11-28 21:30
fokusiara Temat założony przez niniejszego użytkownika |
Metoda Newtona » 2012-11-26 15:29:47 Mam do napisania program, który metodą Newtona wyznacza z zadaną dokładnością (sigma=10^-6) miejsce zerowe funkcji f(x)=x-exp(-x) w przedziale <0,1>. Kolejne kroki algorytmu: 1) Sprawdzamy czy funkcja f(x) ma różne znaki na krańcach przedziału <a,b> tj. f(a)*f(b)<0. Jeżeli tak, to przechodzimy do punktu 2. 2) Wybieramy punkt startowy x1=a. 3) Jeżeli wybrany punkt spełnia warunek |f(x1)|<sigma to x1 jest miejscem zerowym funkcji. Jeżeli nie przechodzimy do punktu 4. 4) Obliczamy kolejny punkt startowy wg wzoru: xk+1=xk-f(xk)/f'(xk) i wracamy do punktu 3.
Warto nadmienić że programowania uczę się od niecałych dwóch miesięcy, od podstaw. I nie wiem czy warto żebym wklejała to co próbowałam zrobić. Pomoże mi ktoś jak pięknie poproszę? :) z góry dzięki ! |
|
DejaVu |
» 2012-11-26 16:43:34 Zadanie polega na samodzielnej implementacji podanego algorytmu. Jak już koniecznie szukasz 'pomocy' to proponuję najpierw poszukać w Google: |
|
crash |
» 2012-11-27 17:59:45 Jak nie wlepiasz żadnego kodu to znaczy, że na gotowca liczysz ;] Nie ma tak dobrze. to żaden wstyd wlepić kod, który nie działa |
|
fsg |
» 2012-11-28 20:38:36 Cześć mam ten sam problem. Znaczy kod już napisany co przesyłam, ale nie jestem przekonany czy dobrze to działa, a szczególnie wynik, bo spotkałem się z innymi niż moja odpowiedziami. #include <iostream> #include <cmath> #include <cstdlib>
using namespace std;
float funkcjaf( float x ) { return x - exp( - x ); }
float pochodnaf( float x ) { return 1 + exp( - x ); }
int main() { float a, b, d, x1; d = 0.000001; a = 0; b = 1; if( funkcjaf( a ) * funkcjaf( b ) < 0 ) { x1 = a; while( fabs( funkcjaf( x1 ) ) >= d ); { x1 = x1 - funkcjaf( x1 ) / pochodnaf( x1 ); } cout << "Miejscem zerowym funkcji f(x) jest: " << x1 << endl << endl; } else cout << "Nie spelniono zalozen." << endl; system( "pause" ); return 0; } |
|
ison |
» 2012-11-28 20:51:25 2 razy wczytujesz tę samą zmienną ale to akurat masz zakomentowane d = 1 / 100000; w tym przypadku d będzie równe 0 bo dzielisz całkowite liczby d = 0.00001f;
if( funkcjaf( a ) * funkcjaf( b ) < 0 )
x = a;
|
tu jeśli warunek nie będzie spełniony to x będzie zawierało jakieś śmieci bo nic mu nie przypisujesz |
|
fsg |
» 2012-11-28 21:30:44 Dzięki za odpowiedź, ale mam jeszcze jeden problem. Teraz kod wydaje się poprawny, ale nie rozumiem czemu działa tylko do momentu przypisania wartości, zarówno kiedy je narzucę z góry, jak także wtedy gdy wpisuje je do programu. Wydaje mi się, że nie chce mi przejść przez instrukcję warunkową. Przez to program nie kończy działania i okno muszę zamykać ręcznie.
Znalazłem błąd, to średnik po warunku pętli. |
|
« 1 » |