Программа представлена в книге В. П. Дьяконова “Справочник по алгоритмам и программам на языке Бэйсик для персональных ЭВМ” на стр.88. Эта программа позволяет найти все корни заданного уравнения на заданном отрезке. В алгоритме осуществляется итерационный метод подсчета значения функции при последовательном увеличении X и нахождения разности между соседними вычислениями. Если разность 2-х последовательных значений мала, то корень считается найденным с заданной точностью.
Метод Рыбакова также можно рассматривать как модификацию метода Ньютона при замене производной F'(xn) некоторым числом M>=F’(g), где g — значение X на отрезке [a, b], при котором F’(X) максимальна. При M>>F’(g) сходимость не нарушается, но замедляется. Метод Рыбакова удобен для поиска всех корней уравнения (4.4) на отрезке[а,b] с помощью следующего алгоритма [24].
- Задаем начальные значения X = X0 = a.
- Для каждой n-й итерации (n = 0, 1, 2, …) вычисляем
Xn+1=Xn+Abs(F(Xn))/M (4.10)
и проверяем условие Xn+1<b.(4.11)
Если (4.11) не выполняется, значит, найдены все корни. В противном случае проверяем выполнение условия (Xn+1-Xn)> е. Если оно выполняется, повторяем цикл вычислений по формуле (4.10). Если это условие не выполнено, значит, Xn+1 есть один из корней и значение Xn+1 выводится на печать. После этого переходим к выполнению следующего пункта.
- Задаем начальное приближение к очередному корню Х0 = Xn+1+e и, если Х0<b, идем к выполнению п. 2. Если X0>>b, вычисления считаем законченными.
Число итераций при реализации метода Рыбакова N=(b – а) *М/е. Функция F(х) на отрезке [а, b] может иметь производную с разрывами первого рода.
10 PRINT ‘НАХОЖДЕНИЕ ВСЕХ КОРНЕЙ УРАВНЕНИЯ F(X)=0’ 15 PRINT ‘В ИНТЕРВАЛЕ ОТ А ДО В МЕТОДОМ РЫБАКОВА’ 20 INPUT ‘ВВЕДИТЕ ГРАНИЦЫ ИНТЕРВАЛА А,В’ А,В 25 INPUT ‘ЗАДАЙТЕ ПОГРЕШНОСТЬ НАХОЖДЕНИЯ КОРНЯ Е=‘ Е 30 INPUT ‘ЗАДАЙТЕ ЧИСЛО M=‘M:LETX=A:LETT=0:LETI=0 40 G0SUB 120:LETZ=X+ABS(F)/M 50 IF Z>=B G0T0 115 60 IF Z-X>=E G0T0 90 70 IF T=0 THEN LETW=Z 80 LETX=Z+E:LETV=Z:LETT=l:GOT0 40 90 IF T<>1 THEN 110 100 LETI=I+l:PRINT!2.0!’X’I’=’!F1.9!(Y+W)/2:LETT=0 110 LETX=Z:GOTO 40 115 PRINT’КОНЕЦ ВЫЧИСЛЕНИЙ’: STOP 120 LETF=X^4-13*X^2+36 138 RETURN: END Пример реализации программы методом Рыбакова в Excel Метод Ньютона Метод деления пополам
Попробуем перевести представленной в одной из версий Бейсик в программу на VBA Excel, не меняя практически ничего.
Sub Rybakov()
Dim a As Single
Dim b As Single
Dim e As Single
Dim m As Integer
Dim t As Integer
MsgBox “НАХОЖДЕНИЕ ВСЕХ КОРНЕЙ УРАВНЕНИЯ F(X)=0″ + vbCr + _
” В ИНТЕРВАЛЕ ОТ А ДО В МЕТОДОМ РЫБАКОВА”
‘A = val(InputBox(“ВВЕДИТЕ ГРАНИЦЫ ИНТЕРВАЛА А “, , -4))
‘B = val(InputBox(“ВВЕДИТЕ ГРАНИЦЫ ИНТЕРВАЛА B”, , 4))
‘E = val(InputBox(“ЗАДАЙТЕ ПОГРЕШНОСТЬ НАХОЖДЕНИЯ КОРНЯ Е “, , 0.001))
‘M =val( InputBox(“ЗАДАЙТЕ ЧИСЛО M “, , 100))
a = -4: b = 4: e = 0.0001: m = 100
x = a: t = 0: i = 0
40 GoTo 120
45 z = x + Abs(F) / m
‘MsgBox z
If z >= b Then GoTo 115
If z – x >= e Then GoTo 90
If t = 0 Then w = z
x = z + e: y = z: t = 1: GoTo 40
90 If t <> 1 Then GoTo 110
100 i = i + 1: MsgBox “X(” + CStr(i) + “)=” + CStr((y + w) / 2)
t = 0
110 x = z: GoTo 120
115 MsgBox “КОНЕЦ ВЫЧИСЛЕНИЙ”
Exit Sub
120 F = x * x * x * x – 13 * x * x + 36: GoTo 45
End Sub
Пример реализации программы в Excel