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

Metoda Newtona

Ostatnio zmodyfikowano 2012-11-28 21:30
Autor Wiadomość
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 !
P-69931
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:
Frazy, które należy wpisać w wyszukiwarkę google:
P-69939
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
P-69993
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.

C/C++
#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;
    //cout << "Podaj lewy kraniec przedzialu: "; cin >> a;
    //cout << "Podaj prawy kraniec przedzialu: "; cin >> b;
    a = 0;
    b = 1;
   
    if( funkcjaf( a ) * funkcjaf( b ) < 0 )
    {
        x1 = a;
       
        while( fabs( funkcjaf( x1 ) ) >= d );
       
        {
            x1 = x1 - funkcjaf( x1 ) / pochodnaf( 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;
}
P-70089
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;



C/C++
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
P-70090
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.
P-70091
« 1 »
  Strona 1 z 1