Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР 7 Решение нелинейных уравнений и систем.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
69.36 Кб
Скачать

Порядок выполнения работы

  1. Выписать свои варианты задания, изучить примеры выполнения аналогичных заданий. Составить на листе бумаги план решения нелинейных уравнений и систем различными способами с описанием команд в среде MATLAB и представить его преподавателю.

  2. Включить компьютер, запустить MATLAB и выполнить план решения уравнений и систем, сохраняя скриншоты окон с вычислениями на флэш – карте памяти.

  3. Ответить на контрольные вопросы.

  4. Сделать выводы о проделанной работе.

  5. Оформить отчет о проделанной лабораторной работе и защитить его у преподавателя.

Примеры выполнения задания

Решение нелинейного уравнения в аналитическом виде. Решим

следующее уравнение:

2x – 3(ab) = 0

%Уравнение задано строкой

>> Y=solve('2^x-3*(a-b)=0')

Y =

log(2, 3*a - 3*b)

%Уравнение задано символьной функцией

>> f=sym('2^x-3*(a-b)');

>> solve(f)

ans =

log(2, 3*a - 3*b)

Решение системы нелинейных уравнений в аналитическом виде.

Решим приведенную ниже систему уравнений и сравним ответ с приближенным решением, полученным далее при помощи fsolve :

Определим две символьные функции и переменные и вызовем solve с одним выходным аргументом:

>> syms x1 х2

>> f1 = sym('x1*(2 - х2) - cos(x1)*еxр(х2)');

>> f2 = sym('2 + x1 - x2 - cos(x1) - exp(x2)');

>> s = solve(f1, f2, x1, x2);

Выведем в окно рабочей среды значения полей структуры s. Обратите внимание, что поля структуры содержат символьные векторы:

>> s.x1

ans =

[ .73908513321516064165531208767387]

[.67179203946718009639325125311984 - 1.3390702694949181314704735832283*i]

>> s.x2

ans =

[ -lambertw(exp(2))+2]

[log(.67179203946718009639325125311984 - 1.3390702694949181314704735832283*i)]

Функция solve нашла две пары решений: вещественные s.x1(1), s.x2(1) и комплексные s.x1(2), s.x2(2). Первая компонента вектора s.x2 выражена через функцию Ламберта w = L(x), которая определена как зависимость решения x трансцендентного уравнения от параметра w, входящего в уравнение. Кроме того, функция solve нашла комплексные корни, решая систему нелинейных уравнений в символьном виде.

Решение системы нелинейных уравнений с использованием функции fsolve.

Решим систему из двух нелинейных уравнений с двумя неизвестными

Файл-функция, соответствующая левой части системы, программируется просто:

function F = mysys(x)

F(1) = х(1)*(2 - х(2)) - cos(x(1))*exp(x(2));

F(2) = 2 + x(l) - x(2) - cos(x(l)) - exp(x(2));

Указание начальной точки (0,0) в функции fsolve приводит к следующему результату:

>> [х, f] = fsolve(@mysys, [0 0], optimset('fsolve‘))

Optimization terminated successfully:

Relative function value changing by less than OPTIONS.TolFun

х =

0.7391 0.4429

f =

1.0e-011 *

-0.4702 -0.6404

Вещественное решение совпадает с решением, полученным ранее при помощи функции solve.

Решение нелинейного уравнения с использованием функции fzero.

Решим, например, на отрезке [-5, 5] уравнение:

sin x - x2 cos x = 0

Перед нахождением корней полезно построить график функции, входящей в левую часть уравнения. Для получения графика воспользуемся функцией fplot, позволяющей получить более точный график по сравнению с plot.

Ниже приведен текст файл-функции, вычисляющей левую часть уравнения.

function у = myf (x)

у = sin (x) - х.^2.*cos (x);

Теперь построим график функции myf, используя fplot, и нанесем сетку.

>> fplot ('myf’, [-5 5])

>> grid on

Рисунок 1 - График левой части уравнения sin x - x2 cos x = 0

Из графика функции, изображенного на рис. 1 (пояснения на графике нанесены средствами MATLAB), видно, что на этом отрезке имеются четыре корня. Один корень равен нулю, в чем несложно убедиться, подставив х = 0 в уравнение функции.

Уточним значение корня, расположенного вблизи х = - 5 , при помощи fzero:

>> x1 = fzero('myf', -5)

Zero found in the interval: [-4.7172, -5.2].

x1 =

-4.7566

Вычисление всех корней полинома с помощью функции roots.

Вычислим корни полинома

x7 + 3.2x5 – 5.2x4 + 0.5x2 + x – 3 = 0

Полином в MATLAB задается вектором его коэффициентов. Число элементов вектора, т. е. число коэффициентов полинома, всегда на единицу больше его степени, нулевые коэффициенты должны содержаться в векторе. Функция roots возвращает вектор корней полинома, в том числе и комплексных

>> р = [1 0 3.2 - 5.2 0 0.5 1 - 3];

>> г = roots(р)

г =

-0.5668 + 2.0698i

-0.5668 - 2.06981

1.2149

0.5898 + 0.6435i

0.5898 - 0.6435i

-0.6305 + 0.5534i

-0.6305 - 0.5534i

Известно, что число всех корней полинома совпадает с его степенью. Убедимся в правильности работы roots, вычислив значение полинома от вектора его корней:

>> polyval(p,r)

ans =

1.0е-012 *

-0.1008 + 0.0899i

-0.1008 - 0.0899i

-0.0666

0.0027 - 0.0018i

0.0027 + 0.0018i

0.0102 - 0.0053i

0.0102 + 0.0053i

В верхней строке результата содержится общий множитель 1.0e-012, на который следует умножить каждую компоненту получившегося вектора.