Доброго времени суток! Я решил разбавить наши стандартные статьи по программированию в VBA. Поэтому сегодня мы поговорим о численных методах решения нелинейных алгебраических уравнений, в целом и о каждом в отдельности.
Численные методы
Предназначение численных методов — упростить человеку решение математических задач. Существуют численные методы для решения интегралов, дифференциалов, линейных и нелинейных алгебраических уравнений и т.д. В основном в ВУЗ-ах изучают только перечисленные.
Под численными методами решения алгебраических уравнений подразумевают алгоритмы нахождения корней уравнения. Алгоритмы, в основном, отличаются скоростью нахождения корней с необходимой точностью, а также условием сходимости. Также, иногда встречается такая характеристика, как простота алгоритма.
Метод половинного деления(бисекции, дихотомии)
В отличие от большинства других методов, метод половинного деления сходится всегда, т.е. обладает безусловной сходимостью, поэтому применим для решения любых уравнений. Кроме этого он чрезвычайно прост. Основным недостатком такого метода является его скорость. С каждым шагом его погрешность уменьшается в два раза, поэтому его можно отнести к методам с линейной сходимостью.
Реализация метода половинного деления в VBA
В интернете можно найти много разных реализаций данного метода как на C++, Matlab и других языках. Языков много, алгоритм один. Для лучшего понимания посмотрим на блок схему.
Распишем общий алгоритм:
Шаг 0. Задать концы отрезка a и b, функцию f, малое число e>0 (допустимую абсолютную погрешность корня или полудлину его промежутка неопределённости), малое q>0 (допуск, связанный с реальной точностью вычисления значений данной функции); вычислить f(a).
Шаг 1. Вычислить с:= 0.5(a+b).
Шаг 2. Если a-b<2e, положить что корень k ≈ с и остановиться.
Шаг 3. Вычислить f(c).
шаг 4. Если |f(c)| < q, положить k ≈ с и остановиться.
Шаг 5. Если f(a)f(c) < 0, положить a = c, f(a) = f(c) и вернуться к шагу 1.
Теперь посмотрим как выглядит метод половинного деления в VBA:
Function f(x As Double) As Double f = x ^ 2 - 4 End Function Sub main() Dim q, e As Double Dim a As Double Dim b As Double Dim c As Double q = 0.001 'реальная точность e = 0.001 'абсолютная погрешность a = -7 'левая граница b = 0 'правая граница c = (b + a) / 2 Do While (b - a) > e c = (b + a) / 2 If f(c) < q Then Exit Do If f(a) * f(c) < 0 Then b = c Else a = c End If Loop MsgBox c 'Вывод в диалоговое окно End Sub
Следует заметить, что мы задали в качестве примера параболу. Она имеет два решения, и,соответственно, если взять интервал заведомо включающий два корня, будет всё равно найден только один корень.
На этом мы закончим. Постепенно мы разберём все численные методы решения алгебраических уравнений на VBA.
Скачать исходник
Будьте первым, кто оставит комментарий