Метод на разполовяването за решаване на уравнения

I. Въвеждаме и визуализираме функцията

(* дефиниране на функция: *)
f[x_]:=4(x^3)+5(x^2)-56x +Sin[x]-3
(* чертаем функцията: *)
Plot[f[x],{x,-10,10}]

II. Локализация

Plot[f[x],{x,2,4}]

f[2.]

f[4.]

извод: f(2)<0, f(4)>0. Следователно в двата края на интервала [2;4] функцията има противоположни знаци и в този интервал съществува корен.

III. Уточняване на корена

Използваме Mathematica само като калкулатор:

f[3.]

f[3.5]

f[3.25]

Съставяме програмен код, който реализира итерациите:

(* дефиниране на функция: *)
f[x_]:=4(x^3)+5(x^2)-56x +Sin[x]-3
a=2.;
b=4;
For[n=0,n≤ 30,n++,
m=((a+b)/2);
Print["n = ",n, " (Subscript[a, n]) = ",a, " (Subscript[b, n]) = ",b, " (Subscript[m, n]) = ",m , " fm= ", f[m]];
If[f[m]<0,a=m,b=m]

]

IV. Оценка на грешката

към програмния код добавяме изчисляване на текущата грешка:

(* дефиниране на функция: *)
f[x_]:=4(x^3)+5(x^2)-56x +Sin[x]-3
a=2.;
b=4;
For[n=0,n≤ 30,n++,
m=((a+b)/2);eps = ((b-a)/2);
Print["n = ",n, " (Subscript[a, n]) = ",a, " (Subscript[b, n]) = ",b, " (Subscript[m, n]) = ",m , " fm= ", f[m], " (Subscript[ϵ, n]) = ",eps];
If[f[m]<0,a=m,b=m]
]

добавяме стоп-критерий при достигане на необходима точност:

(* дефиниране на функция: *)
f[x_]:=4(x^3)+5(x^2)-56x +Sin[x]-3
a=2.;
b=4;
ne=(10^(-6));eps=1;
For[n=0,eps>ne,n++,
m=((a+b)/2);eps = ((b-a)/2);
Print["n = ",n, " (Subscript[a, n]) = ",a, " (Subscript[b, n]) = ",b, " (Subscript[m, n]) = ",m , " fm= ", f[m], " (Subscript[ϵ, n]) = ",eps];
If[f[m]<0,a=m,b=m]
]

предварително определяне на необходимия брой итерации за достигане на дадена точност:

Log2[((4.-2)/(10^(-6)))]-1

Log2[((4-2)/(10^(-6)))]-1

%//N