Тема №8. Решение систем нелинейных алгебраических уравнений.
Задание: графически и численно решить систему нелинейных алгебраических уравнений, на примере поиска точек пересечения двух функций.
Исходные данные:
график строится по исходным данным, определяемым в виде констант в программе:
а) координаты верхнего левого угла прямоугольника, в котором должен быть расположен график;
б) размеры прямоугольника;
в) количество линий координатной сетки по каждой из осей;
г) диапазон изменения аргумента;
Решение нелинейного алгебраического уравнения проводить одним из методов:
-
простых итераций;
-
дихотомии (деления отрезка пополам);
-
пошаговых приближений.
Примерный внешний вид результата решения на экране:
Как видно из этого рисунка на экране должны быть изображены:
-
графики функций,
-
оси координат,
-
координатная сетка,
-
предельные значения по осям.
А также должны присутствовать координаты точек пересечения, например:
X -0.8 +0.8
Y +0.7 +0.7
Также должно быть предусмотрено сохранение:
-
координат точек пересечения в типизированном файле;
-
таблицы обеих функций в отдельных нетипизированных файлах (под таблицей функции подразумевается двумерный массив, первый столбец которого – это значения аргумента, а второй – значения функции).
Варианты заданий
-
Таблица № 1
№
система уравнений
отрезок аргумента
1
-5<x<5
2
-5<x<5
3
-5<x<5
4
-5<x<3
5
-5<x<5
6
-5<x<5
7
-5<x<5
8
-5<x<5
9
-5<x<5
10
-5<x<5
11
-5<x<10
12
-5<x<10
13
-5<x<5
14
0.5<x<1
15
0.5<x<1
Напомним, что решение нелинейного алгебраического уравнения вида F(x) = 0 состоит в том, чтобы найти такие значения переменной x, при которых значение функции F(x) обращается в нуль. Поиск решения уравнения ведется в пределах отрезка значений аргумента x. Отрезок, на котором ведется поиск решения, в данной задаче задан. Процесс поиска итерационный. Общий алгоритм поиска для всех трех методов решения следующий:
-
Задается начальное значение для аргумента x
-
По значению аргумента x вычисляется новое значение аргумента x.
-
Проверяется условие достижения наперед заданной точности и, если условие выполняется, то вычисленное значение принимается за решение, в противном случае алгоритм повторяется, начиная со 2-го пункта.
Для обеспечения сходимости итерационного процесса в зависимости от алгоритма метода должно быть выполнено несколько условий.
Для использования метода простых итераций необходимо выполнение следующих условий:
-
Решение уравнения в пределах указанного отрезка должно быть единственным.
-
Уравнение F(x) = 0 можно преобразовать к виду x = f(x).
-
Первая производная функции f(x) должна быть меньше 1 на всем отрезке.
В данном методе на каждом шаге итерации вычисляется очередное значение x, по формуле x = f(x). Вычисления заканчиваются, когда разность предыдущего и нового значений x станет меньше заданной точности вычисления корня.
// функция f(x)
function f ( x : real ) : real;
begin
f := sin ( x ) + 0.25;
end;
var x, e : real;
begin
writeln ( 'Решение уравнения x = sin(x) + 0.25 методом простых итераций' );
writeln;
write ( 'Задайте начальное значение x x0 = ' );
readln ( x );
write ( 'Задайте погрешность вычисления результата e = ' );
readln ( e );
while abs ( f ( x ) - x ) >= e do
begin
x := f ( x );
writeln ( x : 12 : 9 );
end;
writeln;
writeln( 'Корень уравнения x = ', x : 12 : 9 );
write( 'Для продолжения нажмите <Enter>' );
readln;
end.
Метод деления отрезка пополам (дихотомии) можно применять, при условии, что на выбранном отрезке есть только один корень, и реализуется следующим алгоритмом:
-
Исходный отрезок [a,b], на котором ищется корень, делится пополам.
-
Если значение функции F(x) в середине отрезка совпадает по знаку с левой границей отрезка, то левая граница отрезка переносится в середину отрезка, в противном случае в середину отрезка переносится правая граница.
-
Если размеры отрезка больше заданной точности, то повторить действия, начиная с первого пункта, в противном случае любая из границ отрезка принимается за решение.
function F ( x : real ) : real;
begin
F := x - sin ( x ) - 0.25;
end;
var
a, b, x, e : real;
begin
writeln;
writeln('Решение уравнения x-sin(x)-0.25=0 методом дихотомии');
writeln;
repeat
writeln('Задайте границы отрезка [a,b], причем а<b ');
write('a = ');
readln ( a );
write('b = ');
readln ( b );
until b > a;
write('Задайте погрешность вычисления результата e = ');
readln ( e );
repeat
x := ( a + b ) / 2;
if F ( x ) * F ( a ) > 0
then a := x
else b := x;
until ( b - a ) < e;
writeln('Корень уравнения x = ', x : 12 : 9);
write('Для продолжения нажмите <Enter>');
readln;
end.
Метод пошаговых приближений позволяет найти все решения на заданном отрезке и реализуется следующим алгоритмом:
-
По виду графика выбирается начальное значение шага таким, чтобы оно было меньше расстояния между ближайшими корнями.
-
На каждом шаге по значениям функций в граничных точках проверяется наличие корня на выбранном отрезке.
-
Если корень есть, то величину шага уменьшают в заданное число раз, например, N=5.
-
Если значение полученного шага меньше, чем заданная точность, деленная на N, то начало отрезка принимается за корень. иначе выполняют действия, начиная с пункта 2.
Для определения отрезка, на котором есть корень в приведенном ниже примере используется функция SubRange, а для вычисления корня - функция Root.