Решение уравнения методом касательных

Ключевые слова: программирование, язык программирования, уравнение, решение, корень, метод касательных, пример, скачать, c++, pascal, visual basic for applications, vba, doc, php, форма, лекции по программированию

Автор: Приходько Максим Александрович

Мы уже не раз затрагивали вопрос сложности алгоритма в задачах, которые рассматривали раньше. С этой точки зрения нахождение корня уравнения методом деления отрезка пополам достаточно трудоемко. Число итераций, приводящее нас к искомому значению, вычисляется по формуле:

N = [(X2 - X1) / (2 * e)] + 1, 
где [] - целая часть числа.

Легко видеть, что с ростом точности нахождения корня (то есть с уменьшением значения e) количество итераций растет с обратно пропорциональной скоростью. Естественно, трудоемкость такого метода не может не вызывать нареканий. Поэтому существует целый ряд алгоритмов, в которых скорость приближения к корню значительно больше. Один из таких алгоритмов - метод касательных.

Пусть требуется решить уравнение F(x) = 0. Суть метода касательных проста: из некоторой начальной точки с абсциссой (координатой по оси x) X1 строится касательная к графику функции, которая пересекает ось x в точке X2. Используя уравнение касательной к графику функции, нетрудно найти значение X2 по значению X1 (F' - производная функции F):

X2 = X1 - (F(X1) / F'(X1)).

Затем полученная точка X2 берется в качестве исходной X1 и процесс повторяется:

  X1 = X2

X2 = X1 - (F(X1) / DF(X1))

Повторение процесса описывается бесконечным циклом, а условие выхода из цикла - близостью вновь полученного значения X2 и исходного X1:

 Do While (Abs(X2 - X1) > 2 * E)

X1 = X2

X2 = X1 - (F(X1) / DF(X1))

Loop

Обратите внимание, как и в случае нахождение корня уравнения методом деления отрезка пополам, корректное задание условия близости требует использования функции взятия модуля значения Abs:

Abs(X2 - X1) > 2 * E
Для полноценной работы алгоритма остается задать две дополнительные функции для вычисления функции (F(X As Double)) и ее производной (DF(X As Double)). В качестве примера используется функция sin(x):

Function F(X As Double) As Double

Dim Y As Double

Y = Sin(X)

F = Y

End Function

Function DF(X As Double) As Double

Dim Y As Double

Y = Cos(X)

DF = Y

End Function

Тогда полный код будет иметь следующий вид:

Function F(X As Double) As Double

Dim Y As Double

Y = Sin(X)

F = Y

End Function

Function DF(X As Double) As Double

Dim Y As Double

Y = Cos(X)

DF = Y

End Function

Sub equation_solve()

Dim X1 As Double

Dim X2 As Double

Dim E As Double

X1 = Val(InputBox("Введите X1"))

E = Val(InputBox("Введите точность e"))

X2 = X1 - (F(X1) / DF(X1))

Do While (Abs(X2 - X1) > 2 * E)

X1 = X2

X2 = X1 - (F(X1) / DF(X1))

Loop

MsgBox ("x = " + Str((X1 + X2) / 2))

End Sub

Вот как этот код выглядит в редакторе VBA MS Word:

Адаптивное тестирование - быстрая и точная оценка персонала
 

Другие статьи в рубрике