Вопрос №30. VBA-программа для решения нелинейных алгебраических уравнений методом половинного деления.
Пусть, дана ф-ция f(x)=0 на интервале [а; b]. Найти корни уравнения для данной функции с точностью ε = 1Е-4. Ф-ция имеет всего 1 корень на заданном отрезке, причём значения f’(x), f”(x) определены, непрерывны и сохраняют постоянные значения.
1. В качестве начального приближения к корню выбираем середину отрезка. x = (a + b)/2
2. Далее исследуем значение ф-ции в точках a, b, x. Если f(a)•f(x)<0, то корень находится на отрезке [a; x]. Тогда отрезок [x, b] отбрасываем, т.е. b=x.
3. Снова делим отрезок пополам…. Если… (см. п.2). Т.о., после каждой итерации отрезок, на котором расположен корень, сокращается вдвое, т.е. после k-ой итерации он сокращается в 2k раз.
4. и т.д. до тех пор, пока |b - a| < ε
Достоинство метода: им всегда можно найти корень для заданного уравнения на заданном интервале.
Недостаток: метод медленный, т.к. на каждом шаге интервал приходится делить пополам.
Const eps = 1E-4
Function F (x As Single) As Single
F = x^2 + 5*x – 9
End Function
Sub PolDel (a As Single, b As Single, ByRef x As Single)
Do
   x = (a + b)/2
   If F(a)*F(x) < 0 Then
   b = x
   Else
   a = x
   End If
Loop Until Abs(b – a) < eps
End Sub
Sub My_Pr
Dim a As Single, b As Single, x As Single
a = - 4
b = 4
‘Вызов процедуры
PolDel a, b, x
Cells (10, 1) = “корень =” & Format (x, “0.0000”)
End Sub