Obliczanie pierwiastka równania nieliniowego - Iteracja prosta - Błędny wynik

0

Witam,
Mam problem z działaniem prostego programu obliczającego pierwiastek funkcji nieliniowej z wykorzystaniem metody iteracji prostej.
Funkcja jest następująca:
Bez tytułu.png
f8e9bd257d.png

a kod programu wygląda tak:

#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"

double x1;                 // x1 - punkt poczatkowy, od ktorego rozpoczynamy obliczenia
double x2;                 // x2 - poszukiwany pierwiastek
double blad=0.001;        // blad - blad przyblizenia
double wynik;             // wynik - zmienna pomocnicza, jej wynik jest brany do warunku petli

double funkcja(double x) // wartosc przeksztalconej funkcji
{
    return pow(x,2)+3/x ;  // Przeksztalcona funkcja poczatkowa
}
int main()
{
    x1=1; // punkt poczatkowy
    do
    {
        x2=funkcja(x1); // wartosc pierwiastka
        wynik=fabs(x2-x1); // blad, petla jest wykonywana dopoki jest on wiekszy od bledu przyblizenia
        x1=x2; // nowa wartosc punktu startowego
    }
    while(wynik>=blad);
    printf("Poszukiwany pierwiastek to x= %lf",x2);

    getch();
    return 0;
} 

Wynik:
00bc9e09dd.png

Jak widać na wykresie jest pierwiastek w punkcie około -1, a wynik jest zupełnie inny.
Czy wie ktoś w czym leży problem?
Proszę o pomoc :)
Pozdrawiam

0

Może mnie oświecisz jakim cudem z: x3-x2+3 zrobiło się: x2+3/x ?

0

x3-x2+3=0
x2=x3+3 /x
x=x2+3/x

Przy czym równanie x=x2+3/x jest równaniem równoważnym otrzymanym po zastąpieniu równania wyjściowego f(x)=0 => x=q(x).

0

Ponadto po podstawieniu "na kartce" liczby początkowej, oraz kolejnych powstajcych liczby w pętli, różnica pierwiastków x1 i x2 rośnie i zbiega do nieskończoności, a nie do 0..
Wie ktoś jak temu zaradzić?

0

No nie wiem ale mogli byście pomóc, i powiedzieć co robię źle? :)

1
  1. Da się to co napisałeś zapisać prościej:
    
    #include <stdio.h>
    #include <math.h>

#define err 0.00001

double funkcja(double x) { return x*x+3/x; }

int main()
{
double x,nx;
for(nx=1,x=0;fabs(nx-x)>err;printf("x=%lf; nx=%lf;\n",x,nx)) nx=funkcja(x=nx);
printf("Poszukiwany pierwiastek to x=%lf\n",x);
return 0;
}


 przy czym od razu pokazuje czemu tak to działa.
2. Mam spore wątpliwości co do zbieżności tego algorytmu.
2

Metoda iteracji prostej wymaga by funkcja w równaniu (x^2+3/x) była zbliżająca. Będzie tak gdy moduł pochodnej tej funkcji jest < 1. Twoja funkcja nie spełnia tego założenia.

0

Wasza pomoc jest nieoceniona, już wiem gdzie tkwi problem, jednak przekształciłem to równanie początkowe na kilka sposobów (dołączając x, pierwiastkując) znacie może ten dobry sposób aby iteracja na mojej funkcji zaczęła działać?

lista nie działających przekształceń:
x2+3/x
sqrt(x3+3)
x3-x2+x+3

1
x = \frac{3}{x^2} + 1
0

Po wprowadzeniu innej funkcji, po włączeniu programu w konsoli nic sie nie wyświetla, co może być przyczyną?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0