Вопрос № 32. VBA-программа для решения нелинейных алгебраических уравнений методом касательных (Ньютона). Привести пример.
Пусть, дана ф-ция f(x)=0 на интервале [а; b]. Найти корни уравнения для данной функции с точностью ε = 1Е-4. Ф-ция имеет всего 1 корень на заданном отрезке, причём значения f’(x), f”(x) определены, непрерывны и сохраняют постоянные значения.
1. x0 = b. В точнее m к графику проводим касательную до пересечения с осью Ох. Х1 – первое приближение к корню.
2. Проводим из х1 перпендикуляр до пересечения с графиком. Через новую точку M снова проводим касательную до пересечения с Ох. Х2 – второе приближение к корню и т.д.
Итерационный процесс продолжается до тех пор, пока |хn – xn-1| < ε.
х1 =
f(x0) + f’(x0)( х1 - x0) = 0
f(x0) + f’(x0)• х1 – f’(x0)• (x0) = 0
f’(x0)• х1 = f’(x0)• (x0) - f(x0)
х1 = x0 – (f(x0) / f’(x0))
хn = xn-1 – (f(xn-1) / f’(xn))
Условие сходимости метода: f(a)•f”(a) > 0 (тогда соотв. выбираем a) или f(b)•f”(b) > 0 (тогда b).
Достоинства метода: если метод сходится, то количество итераций минимально. Скорость сходимости значительно выше, чем в других методах.
Недостатки: Необходимо пользоваться условиями сходимости; на каждом шаге берётся 1 производная.
Const dx = 0.1
Const eps = 1E-4
Function F (x As Double) As Double
F = (sin(x))^(1/2) + (cos(x))^(1/2) – 10*x
End Function
Function F1 (x As Double) As Double
F1 = 2*cos(x)*sin(x) – 2*cos(x)*sin(x)-10
End Function
Function F2 ( x As Double) As Double
F2 = ( F1(x + dx) – F1(x)) / dx
End Function
Sub Kasat (a As Double, b As Double., x As Double)
Dim x0 As Double
If F(b)*F2(b) > 0 Then
   x=b
Else x = a
End If
Cells(1, 1) = “пред. зн. X0”
Cells(1, 3) = “послед. зн. x”
p = 2’ номер строки
Do
x0 = x
x = x0 –F(x0) / F1(x0)
Cells(p, 1) = x0
Cells(p, 3) = x
p = p+1
Loop Until Abs(x – x0) < eps
End Sub
Sub My_Pr()
Dim a As Double, b As Double., x As Double
a = 0
b = 1
Kasat a, b, x
Cells(20, 1) = “корень = ”& Format (x, “0.0000”)
End Sub