Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Числ_мет_реш_нелин_ур-ний(ч1)

.pdf
Скачиваний:
12
Добавлен:
29.03.2015
Размер:
1.65 Mб
Скачать

Методы решения нелинейных уравнений

модули то, первой выполняемой в меню 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

Любимов Е.Б.