Intervallhalbierung
> restart;
Es soll eine Nullstelle der folgenden Funktion bestimmt werden:
> f:= x -> x^3 + x^2 - 2*x - 1;
> plot(f(x), x = -3..2.5,
size =[350, 350],
font = [Courier, 10],
labelfont = [Courier, 12, italic],
labels = ["x", "f(x)"]);
size =[350, 350],
font = [Courier, 10],
labelfont = [Courier, 12, italic],
labels = ["x", "f(x)"]);
Halbierung des Intervalls [l, r], und zwar so, dass die Vorzeichen von f(l) und f(m) bzw. von f(m) und f(r) verschieden voneinander sind:
> IH:= proc (l, r)
local m;
m:= (l + r)/2;
if signum(f(l))*signum(f(m)) = -1 then
RETURN ([l, m])
else
RETURN ([m, r]);
fi:
end:
m:= (l + r)/2;
if signum(f(l))*signum(f(m)) = -1 then
RETURN ([l, m])
else
RETURN ([m, r]);
fi:
end:
Definition des Startintervalls:
> J[neu]:= [-2.0, -1]:
Sukzessive Intervallhalbierung liefert eine Intervallschachtelung:
> while ((J[neu][2] - J[neu][1]) > 10E-7) do
J[alt]:= J[neu]:
J[neu]:= IH(J[alt][1], J[alt][2]):
printf("%s%f%s%f%s\n", "[", J[neu][1], ", ", J[neu][2], "]");
od:
J[neu]:= IH(J[alt][1], J[alt][2]):
printf("%s%f%s%f%s\n", "[", J[neu][1], ", ", J[neu][2], "]");
od:
[-2.000000, -1.500000] | |
[-2.000000, -1.750000] | |
[-1.875000, -1.750000] | |
[-1.812500, -1.750000] | |
[-1.812500, -1.781250] | |
[-1.812500, -1.796875] | |
[-1.804688, -1.796875] | |
[-1.804688, -1.800781] | |
[-1.802734, -1.800781] | |
[-1.802734, -1.801758] | |
[-1.802246, -1.801758] | |
[-1.802002, -1.801758] | |
[-1.802002, -1.801880] | |
[-1.801941, -1.801880] | |
[-1.801941, -1.801910] | |
[-1.801941, -1.801926] | |
[-1.801941, -1.801933] | |
[-1.801941, -1.801937] | |
[-1.801939, -1.801937] | |
[-1.801938, -1.801937] |