Вопрос № 33. VBA-программа для решения нелинейных алгебраических уравнений методом простых итераций. Привести пример.
Пусть, дана ф-ция f(x)=0 на интервале [а; b]. Найти корни уравнения для данной функции с точностью ε = 1Е-4. Ф-ция имеет всего 1 корень на заданном отрезке, причём значения f’(x), f”(x) определены, непрерывны и сохраняют постоянные значения.
Ф-цию f(x) = 0 можно преобразовать Леву. и правую часть можно умножать на одно и то же число λ, прибавлять или отнимать одно и то же число х. Т.о.:
x = x + λf(x), или, обозначив правую часть как φ(х), x = φ(х).
Условие сходимости метода: | φ’(х)| < 1.
1.Начальное приближение х0 к корню можно брать в точке a, точке b или на всём интервале [а; b].
2. В качестве следующего приближения х1 принимаем значение ф-ции в предыдущей точке интервала [а; b], т.е. точки х0 . х1 = φ(х0).
3. ---//--- х2 = φ(х1) …… хn = φ(хn-1).
Процесс продолжается до тех пор, пока |xn – xn-1| < ε.
Этот процесс последовательного вычисления приближенных значений к истинному значению корня называется методом итераций.
Увеличивая k (количество итераций) можно получить приближение, сколь угодно мало отличающееся от истинного значения корня.
Ряд сходящийся – с увеличением количества итераций можно приблизиться к корню с заданной точностью.
Ряд расходящийся – с увеличением количества итераций корень найти не возможно (мы всё дальше отдаляемся от него).
Достоинство метода: если ряд сходится, , сходимость очень высокая + простой подход.
Недостаток: необходимо помнить об условии сходимости.
Sin2x + Cos2x – 10x = 0
x = (Sin2x + Cos2x) / 10
Const eps = 1E-4
Function F(x As Double) As Double
F = (Sin(x))^2 + (Cos(x))^2 – 10*x
End Function
Function Fi (x As Double) As Double
Fi = ((Sin(x))^2+(Cos(x))^2) / 10
End Function
Sub Iter (a As Double, b As Double, x As Double)
Dim x0 As Double
x = b
Cells(1, 1) = “пред зн. x0”
Cells(1, 3) = “посл. зн. x”
p = 2
Do
x0 = x
x = Fi(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
Iter a, b, x
Cells(20, 1) = “корень =” & Format (x, “0.0000”)
End Sub