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

Локализация на корен

f[x_]:=((x^2)/4)-Sin[x];
Plot[f[x],{x,-10,10}]

Plot[f[x],{x,0,5}]

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

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

f[1.8]

f[2.]

Извод: Функцията има различни знаци в двата края на интервала [1,8;2], следователно в този интервал имаме корен.

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

f[1.9]

f[1.95]

Алгоритъм реализиращ метода

Clear[a,b,x,f,k];
f[x_]:=((x^2)/4)-Sin[x];
a=1.8; b=2;
For[k=0,k≤20,k++,
(* body *)
m= ((a+b)/2);
Print["k = ",k, ": a = ",SetPrecision[a,10], " b = ",SetPrecision[b,10], " m = ",SetPrecision[m,10], " f(m) = ",f[m]];
If[(* condition *) f[m]>0,
(* true *) b = m,
(* false *)a = m]
(* end For *)]

Оценка на грешката:

Колко итерации са необходими за достигане на грешка eps = 0.000001 ?

Log2[((2-1.8)/0.000001)]-1

Извод: Най-малкото цяло число по-голямо от полученото по-горе е 17, следоватално са ни необходими 17 итерации за достигане на исканата точност.

Clear[a,b,x,f,k,epsk];
f[x_]:=((x^2)/4)-Sin[x];
a=1.8; b=2;
For[k=0,k≤17,k++,
(* body *)
m= ((a+b)/2);
epsk =((b-a)/2);
Print["k = ",k, ": a = ",a, " b = ",b, " m = ",m, " f(m) = ",f[m], " (Subscript[ϵ, k]) = ",epsk];
If[(* condition *) f[m]>0,
(* true *) b = m,
(* false *)a = m]
(* end For *)]

Програма с използване на стоп-критерий при достигане на необходимата точност

Clear[a,b,x,f,k,epsk];
f[x_]:=((x^2)/4)-Sin[x];
a=1.8; b=2;
epsk = 10; (* задаваме голямо число, за да влезем за първи път в цикъла *)
For[k=0,epsk>(10^(-6)),k++,
(* body *)
m= ((a+b)/2);
epsk =((b-a)/2);
Print["k = ",k, ": a = ",a, " b = ",b, " m = ",m, " f(m) = ",f[m], " (Subscript[ϵ, k]) = ",epsk];
If[(* condition *) f[m]>0,
(* true *) b = m,
(* false *)a = m]
(* end For *)]