Metody numeryczne - metoda bisekcji - mathematica

Metody numeryczne - metoda bisekcji - mathematica
Remigiusz Drobinski
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:19
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

Kopiuj
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 :(

edytowany 3x, ostatnio: Remigiusz Drobinski
Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.9999226)
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:5015
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?


Remigiusz Drobinski
Tak, funkcja, początek przedziału, koniec przedziału, dokładność (chociaż dla całkowitych to bez znaczenia że jest po przecinku) i tak, powinno zwracać -2
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:5015
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:

Kopiuj
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.