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

2015-01-10 14:04
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

Pozostało 580 znaków

2015-01-10 14:32
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-10 14:41
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).

edytowany 1x, ostatnio: Xelenty, 2015-01-10 14:42
chyba dam Ci plusa za to "zastąpienie" :) - garai 2015-01-10 14:55

Pozostało 580 znaków

2015-01-10 14:49
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ć?

edytowany 1x, ostatnio: Xelenty, 2015-01-10 14:49

Pozostało 580 znaków

2015-01-10 14:57
0

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

Pozostało 580 znaków

2015-01-10 14:58
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.

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-10 15:02
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2015-01-10 15:10
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

edytowany 3x, ostatnio: Xelenty, 2015-01-10 15:17

Pozostało 580 znaków

2015-01-10 15:23
1
x = \frac{3}{x^2} + 1
edytowany 1x, ostatnio: some_ONE, 2015-01-10 15:27
Ale to równanie nie jest równoważne z pierwotnym. Powinno być 1-3/x^2 - bogdans 2015-01-10 16:06

Pozostało 580 znaków

2015-01-10 15:54
0

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

Pozostało 580 znaków

2015-01-10 15:56
1

Pewnie pętla się nie kończy.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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