Урок 3

Численное решение уравнений

На этом уроке мы научимся численному решению уравнений.

Сначала поясним, зачем нужны численные методы решения уравнений. Причина в том, что большинство уравнений, встречающихся на практике не имеют аналитических решений (в виде формулы) и единственный способ найти решение таких уравнений – это прибегнуть к численным методам. Но даже если решения уравнения существуют в виде формулы, численный метод решения – более быстрый и не требует глубокой теоретической подготовки.

В качестве примера возьмем уравнение 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.

В качестве самостоятельной работы, найдите два других корня уравнения.