Obliczanie pierwiastka funkcji metodą Stefensona

0

Witam
Mam zadanie wyznaczyć pierwiastek (miejsce zerowe) równania sin(x/4)-ln(x) = 0 metodą stefensona. W treści zadania jest jeszcze podany wzór (w załączniku).
Udało mi się stworzyć coś takiego. Prosze o pomoc bo projekt "na wczoraj"

#include <cmath>
#include <cstdio>
#include <iostream>

using namespace std;
double f(double x)
	{
	return -log(x)+sin(x/4);
	}
int main()
{
        double x ;
        int i = 1;
        for( x = 0 ; f(x) >= 0.000001 ; i++)
        	{
        	cout << "x = " << x << "   " << f(x) << endl;
			x = x - (f(x))/(f(x+f(x))-f(x));
        	}
        
        cout << "Po " << i << " iteracji x= " << x <<endl;
        return 0;
}
1

Zacznij od takiego x, żeby log był określony. Przykładowo, x=1.0.

Poza tym - chyba masz wzór spaprany. Poniżej mój (działający) kod:

#include <math.h>
#include <stdio.h>

#define EPS 1e-5

double
f(double x)
{

	return (-log(x)+sin(x / 4.0));
}

int
main()
{
	double x;
	x = 1.0;

	for(x = 1.0; fabs(f(x)) >= EPS;)
		x = x - f(x) * f(x) / (f(x + f(x)) - f(x));

	printf("f(%.15lf) = %.15lf\n", x, f(x));
	return 0;
}
0

Dziękuję Ci bardzo. Faktycznie po podstawieniu twojego wzoru i zmianie początkowej wartości x na 1 wszystko śmiga.

1

Tam jeszcze był jeden błąd - w warunku for-a. Jak piszesz kod, który znajduje miejsca zerowe, to bardzo często wzory typu Newton-Raphson oscylują wokół miejsca zerowego z dodatniej i ujemnej strony. Musisz mieć tam fabs, żeby nie przerwać pętli za wcześnie, gdy funkcja f osiągnie wartość ujemną, ale nadal daleką od 0.

0

Pomyślałem o tym jak przeanalizowałem twój kod. Dziękuję bardzo za pomoc.

Temat uważam za wyczerpany w związku z czym proszę o zamknięcie wątku.

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