Числ_мет_реш_нелин_ур-ний(ч1)
.pdfМетоды решения нелинейных уравнений
модули то, первой выполняемой в меню Insert командой, должна быть команда вставки модуля - Module, а затем команда Procedure.
В окне Add Procedure определяем имя создаваемой функции и выбираем переключатель Function.
После нажатия кнопки ОК, в окне модуля генерируется заготовка функции:
Option Explicit1 Public Function Y()
End Function
Дополняем текст этой функции необходимыми инструкциями. В нашем случае окончательный текст приводится ниже.
Option Explicit
Public Function Y(X As Double) As Double Y = X ^ 3 - 5 * X + 3
End Function
В ячейки первой строки таблицы, реализующей метод дихотомии, вместо обращений, записанных в виде формул MS Excel, вводятся обращения к соответствующей функции пользователя Y(X), после чего эта строка "протягивается" до достижения требуемого решения.
Создание процедуры, реализующей метод дихотомии для решения нелинейных уравнений
Рассмотренный нами алгоритм метода дихотомии может быть реализован как функция на языке программирования VBA.
Результаты решения, полученные при обращении к пользовательской функции, реализующей метод дихотомии, показаны ниже на рис. 13 и рис. 14.
Корень Хm= =Dihotomia(N20;P20;R20;T20)F(Xm)= =Y(U21)
Рис. 13. Формулы, записанные в ячейки таблицы, для вычисления значений корня и функции в точке корня
Корень Хm= |
-2,490234375 F(Xm)= |
0,00856 |
Рис. 14. Результаты вычислений, выполненных по формулам рис. 13
1 Эта инструкция по умолчанию вставляется компилятором VBA в текст модуля только в случае включения в редакторе VBA опции Require Variable Declaration.
11 |
Любимов Е.Б. |
Методы решения нелинейных уравнений
Результаты, приведённые на рис.14, совпадают с результатами приведёнными на рис. 12.
Объявления аргументов
Dihotomia функции: a, b, eps, delta Fa=Y(a), Fb=Y(b)
Exit Function |
|
[a,b] выбран |
Да |
Fa*Fb>0? |
|
неверно |
|
||
|
|
|
|
|
|
|
|
|
Нет |
Нет |
Fa*Fc<0? |
c = (a + b) / 2 |
i = 1 |
|
|
Fc=Y(c) |
|
||
|
|
|
|
|
a = c |
Да |
|
|
|
|
b = c |
|
|
1 |
|
|
|
|
|
Fa = Y(a), |
|
i=i+1; c = (a + b) / 2 |
|
|
|
Fc=Y(c) |
|
|
|
Fb =Y(b) |
|
|
|
|
|
Fm=Fa; Xm=a |
|
|
|
|
|
|
|
|
|
|
|
|
Определение значения |
|
|
|
|
Fmin и координаты Xmin |
Да
|Fm| > |Fb|?
Xm =b; Нет
Fm = Y(Xm)
Да
|Fm| > |Fc|?
Xm =c; Нет
Fm = Y(Xm)
1 |
Нет |
|b-a|<ε and |Fm|<=δ? |
|
Dihotomia = Xm
End Function
Рис. 15. Блок-схема алгоритма функции, реализующей метод дихотомии
В ниже приведённый текст функции включены комментарии, в которые преобразованы инструкции MsgBox вывода сообщений, формируемых при отладке функции.
12 |
Любимов Е.Б. |
Методы решения нелинейных уравнений
' Текст функции Dihotomia с отключенными отладочными выводами
Public Function Dihotomia(a As Double, b As Double, _
eps As Double, delta As Double) As Double Dim i As Integer ' счётчик числа итераций
Dim c As Double, Fa As Double, Fb As Double, Fc As Double Dim Fm As Double, Xm As Double
Fa = Y(a): Fb = Y(b) If Fa * Fb > 0 Then
MsgBox ("Начальный выбор интервала [a,b] сделан неверно")
Exit Function End If
i = 1
' вход в цикл определения корня
Do ' While ((Abs(b - a) > eps) And (Abs(Fm) > delta)) c = (a + b) / 2: Fc = Y(c):
' MsgBox "i= " & i & " c= " & c & "; Fc= " & Fc
' выполнение шага метода дихотомии
If Fa * Fc < 0 Then b = c Else a = c
' вычисление новых значений функции на границах интервала
Fa = Y(a): Fb = Y(b): |
|
' MsgBox "i= " & i & " | |
a=" & a & " ; Fa=" & Fa & _ |
" | b=" & b & " |
; Fb=" & Fb |
i = i + 1
' выбор точки с наименьшим значением F(X) c = (a + b) / 2: Fc = Y(c):
'MsgBox "i= " & i & " | a=" & a & " ; Fa=" & Fa & " | b=" & b _
&" ; Fb=" & Fb & " | c=" & c & " ; Fc=" & Fc
Fm = Fa: Xm = a ' определение точки Xm с наименьшим Y(Xm) If (Abs(Fm) > Abs(Fb)) Then
Xm = b : Fm = Y(Xm)
End If
If (Abs(Fm) > Abs(Fc)) Then
Xm = c : Fm = Y(Xm)
End If
' MsgBox "i= " & i & " | корень Xm=" & Xm & " ; F(Хm) =" & Fm Loop Until ((Abs(b - a) < eps) And (Abs(Fm) <= delta))
'MsgBox "число итераций i= " & i & "| Xm=" & Xm & " Fm= " & Fm Dihotomia = Xm
End Function ' Dihotomia
13 |
Любимов Е.Б. |