Metoda iteracji prostej

0

Mam zadanie żeby wyznaczać pierwiastki równania nieliniowego metodą iteracji prostej. Mam taką funkcję: ln(x) + sin(x/4) = 0
Każdy w grupie ma inną funkcję do policzenia ale mój kolega wykminił coś takiego dla swojej funkcji:

#include <math.h>
#include <stdio.h>
using namespace std;
double g(double x)
{
return (1/(pow((2.+x),2.)))-sin(x);
}
int main()
{
        double x=0.0, f, bl=1.0;
        const double BLAD=0.00001;
        int i=1;
        do
        {
        f=g(x);
        bl=fabs(x-f);
        printf("Po=%i  iteracji x=%f\n",i ,x);
        x=f;
        i++;
        }while(bl>=BLAD&&i<=34);
        return 0;
}

próbowałem zastosować to do mojej funkcji ale program zwraca: Po=2 iteracji x=inf

Bardzo bym prosił o wytłumaczenie dlaczego to nie działa? :)

0

U mnie działa poprawnie (na ideone zresztą też: http://ideone.com/cJb9xD) - jaki masz kompilator?

Plus dlaczego kod piszesz w C pomieszanym z C++?

  1. math.h -> cmath
  2. printf -> cout
0

dobra ale jak podstawiam w funkcji g coś takiego:

double g(double x)
{
return log(x) + sin(x/4);
} 

czyli mój przykład, to wtedy program nie daje dobrych wyników.

0

Masz funkcję f(x) = 0 - musisz ją przekształcić do formy x = g(x).

0

przekształcam i wychodzi: 1/x + 1/4*cos(x/4)
dobrze?

1

twoje f(x) wygląda tak

f(x)=log x + sin {\frac{x}{4}}

ty potrzebujesz tak przekształcić równanie:

f(x)=0

by uzyskać postać:

g(x)=x

możliwości jest kilka:

g(x)=log x + sin {\frac{x}{4}} + x g(x)=exp{-sin {\frac{x}{4}}} g(x)=4\cdot asin(-log x)

i cokolwiek innego.
Masz wybrać taką postać g(x), która zapewni ci zbieżność.
Skąd ci się wzięło: \frac{1}{x} + \frac{1}{4} cos {\frac{x}{4}}? Pewnie z pochodnej, ale pochodna nie ma tu nic do rzeczy.

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