Metody numeryczne - metoda bisekcji - mathematica

0

Witajcie, stworzyłem algorytm bisekcji w mathematice, jednak nie mogę znaleźć błędu logicznego dla zadanego przykładu. Mógłby ktoś zerknąć? Bym był bardzo wdzięczny i dziękuję za wszelaką pomoc <3

Clear[Zadanie1];

Zadanie1[f_, a_, b_, e_] := Module[{m},
   m = (a + b)/2;
   If[f (m) == 0, Print["Znaleziono pierwiastek"];
    Return[m]];
   While[Abs[f (a) - f (b)] > e,
     m = (a + b)/2;
     If[f (a)*f (m) < 1,
      b = m, a = m]]
    Return[m]];

f[x_]:=x+2

Zadanie1[f, -3, 2, 0.1]

Zwraca mi -1/2 :(

0

W ramach ustalenia szczegółów, na wejściu funkcja x + 2, a i b, to przedział, i ma w zwrócić pierwiastek w nim [tym przedziale], powinno być -2?

0

Próbowałeś mądrzej, ale ja bym to zrobił bardziej topornie, ale działająco:): dodać funkcję sign - zwraca znak, i wprowadzić licznik, po przekroczeniu, którego metoda nie da rady policzyć pierwiastka (może się tak zdarzyć, a licznik zależy od mocy obliczeniowej, czasu, etc.). Podaję w pseudokodzie, języka pana Wolframa nie znam:

fun f(x):
	return x + 2

fun sign(x):
	if x == 0: return 0
	if x < 0: return -1
	if x > 0: return 1

fun bisectionRoot(f, a, b, e):
	n = 0
	MAX = 1000
	while n < MAX:
		m = (a + b) / 2
		if (m == 0) or ((b - a) / 2) < e:
			return m
		n = n + 1
		if sign(f(m)) == sign(f(a)):
			a = m
		else:
			b = m
	return "couldn find root"

bisectionRoot(f, -3, 2, 0.000000001) # -> -1.999999999650754

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