
Порядок выполнения работы
Выписать свои варианты задания, изучить примеры выполнения аналогичных заданий. Составить на листе бумаги план решения нелинейных уравнений и систем различными способами с описанием команд в среде MATLAB и представить его преподавателю.
Включить компьютер, запустить MATLAB и выполнить план решения уравнений и систем, сохраняя скриншоты окон с вычислениями на флэш – карте памяти.
Ответить на контрольные вопросы.
Сделать выводы о проделанной работе.
Оформить отчет о проделанной лабораторной работе и защитить его у преподавателя.
Примеры выполнения задания
Решение нелинейного уравнения в аналитическом виде. Решим
следующее уравнение:
2x – 3(a – b) = 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, на который следует умножить каждую компоненту получившегося вектора.