Program działa w nieskończoność - miejsce zerowe funkcji

0

Witam. Jestem w trakcie pisania programu szukającego miejsca zerowe funkcji (z góry określonej). Mam jednak problem z metodą bisekcji. W pewnym momencie wartości a, b oraz x0 są sobie równe, przez co program wykonuje się nieskończoną ilość razy. Proszę o pomoc w odnalezieniu błędu.

Oto kod:

float f(float x)
{
	return ((exp(-2*x)-3)-x);
}

void bisekcja(float a, float b, float eps)
{
	float x0, f0, fa, fb;
	fa=f(a);
	fb=f(b);
	if (fa*fb>0)
		{
			printf("Rownanie nie spelnia zalozen!\n");
		}
	else
		{
			while (fabs(a-b)>eps)
				{
					x0=(a+b)/2;
					f0=f(x0);

					if (fabs(f0)<eps)
						{
							break;
						}
					if ((fa*f0)<0)
						{
							b=x0;
							/*fb=f0;*/
						}
					else {a=x0; /*fa=f0;*/}
		printf("%f\n", x0);
				}
			printf ("Miejsce zerowe: %f\n", x0);
		}

}
0

@hauleth: Dzięki za linki. W międzyczasie postanowiłem sprawdzić jeszcze jedną możliwość. Zmieniłem typ zmiennych z float na double. Teraz wszystko działa prawidłowo.

0
nojaniewiem napisał(a):

@hauleth: Dzięki za linki. W międzyczasie postanowiłem sprawdzić jeszcze jedną możliwość. Zmieniłem typ zmiennych z float na double. Teraz wszystko działa prawidłowo.

poczytaj też to http://gynvael.coldwind.pl/?id=374

0

Gdy wywołasz swoją funkcję np. z takimi parametrami:

bisekcja(-0.47, -0.46, 0.01);

to pętla while nie wykona ani jednej iteracji i wyświetli się niepoprawna wartość, ponieważ x0 nie została zainicjowana.

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