На этом уроке мы научимся численному решению уравнений.
Сначала поясним, зачем нужны численные методы решения уравнений. Причина в том, что большинство уравнений, встречающихся на практике не имеют аналитических решений (в виде формулы) и единственный способ найти решение таких уравнений – это прибегнуть к численным методам. Но даже если решения уравнения существуют в виде формулы, численный метод решения – более быстрый и не требует глубокой теоретической подготовки.
В качестве примера возьмем уравнение 3- степени: 0.1 * X3 - 0.5 * X2 – X + 2 = 0. Построим график функции Y = 0.1 * X3 - 0.5 * X2 – X + 2.
X1 = -3
Y1 = -5
X2 = 7
y2 = 6
SetCoordinateSystem(X1,Y1,X2,Y2,2)
X = X1
repeat
Y=F(X)
if X=-3
MoveTo(X,Y)
else
LineTo(X,Y)
X=X+0.1
Breakif X>X2
stop
Function F(_x)
return 0.1*_x*_x*_x-0.5*_x*_x-_x+2

Значения X, при которых график пересекает ось X и будут решениями (корнями) уравнения. Из графика видно, что уравнение имеет 3 корня. Будем искать второй корень.
Для решения уравнения воспользуемся методом деления отрезка пополам. Сначала нужно установить интервал значений X, в котором находится корень. Воспользовавшись графиком установим начальный интервал X1=0, X2=4. Можно было бы установить и более узкий интервал, но нам важно понять алгоритм поиска, для этого берём интервал пошире.
Для успешного применения метода важны два условия: в выбранном интервале функция непрерывна и меняет знак один раз.
Отступление: До сих пор для рисования на полотне мы использовали чёрное перо. Теперь мы для наглядности будем менять цвет пера. Для этого нам понадобится функция SetPenParameters. Первый параметр функции – толщина пера, пусть будет равна 2. Второй параметр – цвет. В программе есть набор констант цвета. Пока мы воспользуемся только двумя: clLime и clRed , которые соответствуют ярко зелёному и красному цвету.
Начнём с вычисления значения функции в 3-х точках: на краях диапазона и посередине. На графике визуализируем значения функции цветными вертикальными отрезками.
X1=0
X2=4
X3=(X1+X2)/2
Y1=F(X1)
Y2=F(X2)
Y3=F(X3)
SetPenParameters(1,clLime)
MoveTo(X1,0)
LineTo(X1,Y1) # зелёная вертикальная линия на левом краю интервала
MoveTo(X2,0)
LineTo(X2,Y2) # зелёная вертикальная линия на правом краю интервала
SetPenParameters(1,clRed)
MoveTo(X3,0)
LineTo(X3,Y3) # красная вертикальная линия на середине интервала
Вставим этот фрагмент скрипта с 16-строки, перейдите в рабочий режим, установите точку остановки на 16-й строке (клик мышкой по номеру 16). Стартуем скрипт. На строке 16 выполнение остановится. Далее пройдем до конца в шаговом режиме.

По графику видим, что корень лежит в левой половине интервала (X1,X2). Но как это определить с помощью скрипта? Если значения функции на границах левого полу-интервала имеют разные знаки, то корень функции лежит в левом полу-интервале, иначе – на правом. Такие простые соображения позволяют в два раза сузить интервал, в котором лежит корень уравнения. Заставим блок уменьшения пулу-интервала выполнятися в цикле, до тех пор пока ширина пулуинтервала не достигнет требуемой точности, например 0.01. Строки скрипта, начиная с 16-й модифицируем таким образом:
X1=0
X2=4
repeat
X3=(X1+X2)/2
Y1=F(X1)
Y2=F(X2)
Y3=F(X3)
SetPenParameters(1,clLime)
MoveTo(X1,0)
LineTo(X1,Y1) # зелёная вертикальная линия на левом краю интервала
MoveTo(X2,0)
LineTo(X2,Y2) # зелёная вертикальная линия на правом краю интервала
SetPenParameters(1,clRed)
MoveTo(X3,0)
LineTo(X3,Y3) # красная вертикальная линия на середине интервала
if Y1*Y3 < 0
X2=X3 # выбрали левую половину интервала
else
X1=X3 # выбрали правую половину интервала
Breakif (X2-X1) < 0.01 # завершение цикла, если точность решения менее 0.01
stop
Установим точку остановки на строке 40 Breakif (X2-X1) < 0.01
Стартуем скрипт. Выполнение скрипта приостановится на строке 40.

Чтобы продолжить выполнение скрипта начиная с этой строки, можно кликнуть по команде «Продолжить» (в автоматическом режиме), или по команде «Шаг» для выполнения одной строки скрипта.
Для проверки алгоритма пройдем тело цикла несколько раз в шаговом режиме. Следим за тем, как меняется интервал поиска корня. Выполним команду «Продолжить». Приблизительное значение корня смотрим в таблице глобальных переменных в строке X3.
В качестве самостоятельной работы, найдите два других корня уравнения.