Решение уравнения методом касательных
Ключевые слова: программирование, язык программирования, уравнение, решение, корень, метод касательных, пример, скачать, 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 и процесс повторяется:X2 = X1 - (F(X1) / F'(X1)).
X1 = X2Повторение процесса описывается бесконечным циклом, а условие выхода из цикла - близостью вновь полученного значения X2 и исходного X1:X2 = X1 - (F(X1) / DF(X1))
Do While (Abs(X2 - X1) > 2 * E)Обратите внимание, как и в случае нахождение корня уравнения методом деления отрезка пополам, корректное задание условия близости требует использования функции взятия модуля значения Abs:X1 = X2
X2 = X1 - (F(X1) / DF(X1))
Loop
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Вот как этот код выглядит в редакторе VBA MS Word: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
Добавить комментарий