Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практическое_занятие5.doc
Скачиваний:
5
Добавлен:
11.09.2019
Размер:
249.86 Кб
Скачать

Практическое занятие № 5 Решение типовых задач алгебры и анализа

Цель занятия: ознакомиться с основными командами системы MATLAB для работы с полиномами, для решения нелинейных уравнений и систем, ознакомится со средствами минимизации функций одной и многих переменных .

5.1 Основные теоретические сведения

Полином (многочлен) как функция определяется выражением

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

>> p = [ 1 -3 3 -3 2];

Умножение полиномов Р1 и Р2 осуществляется командой conv(P1, P2), а деление полинома Р1 на Р2 осуществляется командой deconv(P1,P2).

Примеры умножения и деления полиномов:

>> p1= [ 1 2 3]; p1= [ 1 2 3 4 5 6];

>> p=conv(p1,p2)

p =

  1. 4 10 16 22 28 27 18

>>deconv(p,p1)

ans =

1 2 3 4 5 6

Для нахождения корней многочленов в системе MATLAB существует специальная функция roots(Р), которой в качестве аргумента передается массив коэффициентов многочлена.

Пример: Найти корни многочлена .

>> p = [ 1 -3 3 -3 2 ]:

>> r = roots( p)

r = 2.0000

-0.0000 +1.0000i

-0.0000 –1.0000i

1.0000

Построение вектора Р коэффициентов полинома по заданному вектору его корней осуществляется командой poly:

>> Р= poly(r)

P =

1 -3 3 -3 2

Информация о командах, используемых при работе с полиномами, находится в разделе polyfun справочной системы.

Решение уравнения F(x)=0, или нахождение нулей функции, осуществляется с помощью функции fzero, которая может иметь несколько модификаций:

fzero(‘F(x)’, x0);

fzero(‘F(x)’, [x1, x2]).

В качестве первого аргумента ей передается имя функции, задающей исходное уравнение, вторым аргументом служит начальное приближение к корню или область изоляции корня. Необходимо отметить, что на границах указываемого интервала функция должна принимать значения разных знаков, иначе выдается сообщение об ошибке. Определим, в качестве примера, нули функции cos(x) на отрезке от 0 до pi. В качестве начального приближения примем x0=1.

>> x=fzero('cos', 1)

x = 1.5708

Если требуется найти корень функции, отличной от стандартной (встроенной в систему MATLAB) и тем самым не имеющей в рамках системы MATLAB фиксированного имени, то нужно присвоить некоторое имя выражению, вычисляющему функцию.

Пусть, например, требуется найти корни уравнения cos(x)=x, что эквивалентно нахождению нулей функции, вычисляемой по формуле y=cos(x)−x, не имеющей в рамках системы MATLAB фиксированного имени. В этом случае нужно создать файл–функцию вида

function y=MyFun1(x)

y=cos(x)-x;

Перед нахождением корней необходимо построить график исследуемой функции командой fplot:

>> fplot('MyFun1', [0, pi]), grid

Риснок 5.1

На графике видно, что функция на этом отрезке имеет один корень, расположенный на интервале от 0.5 до 1(на этом интервале значение функции имеет разные знаки). Уточним значение корня, воспользовавшись функцией fzero:

>> x=fzero('MyFun1',[0.5, 1])

x = 0.7391

Если найдено абсолютно точное значение корня, то значение функции в этой точке равно нулю. Необходимо отметить, что функция fzero находит нули только вещественнозначных функций одной вещественной переменной.

Важной особенностью fzero является то, что она вычисляет только те корни, в которых функция меняет знак, а не касается оси абсцисс.

Многомерным аналогом fzero является команда fsolve(‘fun_name’,x0) , предназначенная для решения системы нелинейных уравнений.

Здесь fun_name’– имя файл-функции, вычисляющей вектор столбец левых частей системы уравнений, x0 – вектор-столбец начальных приближений.

Например, необходимо решить систему нелинейных уравнений

Так как система имеет второй порядок, то легко решение найти графически. С помощью команды ezplot строим совместно графики и .

>> ezplot('x^2+y-3'), hold

>> ezplot('y+x-2'), grid

Рисунок 5.2

Как видно из рисунка 5.2, система имеет два вещественных решения (количество точек пересечения графиков). Начальным приближением для второго корня является (2;0). Само значение корня уточним командой fsolve.

Создадим файл-функцию, вычисляющую вектор-столбец левых частей системы уравнений:

function F=MyFun2(x)

F=[x(1)^2+x(2)-3; x(1)+x(2)-2];

Программа и результаты решения системы уравнений имеют вид:

>> x0=[2;0];

>> X=fsolve('MyFun2',x0)

X =

1.6180

0.3820

Существенный недостаток команд fzero и fsolve состоит в том, что они не определяют комплексных решений равнений и систем уравнений.

В системе MATLAB имеются специальные функции для поиска минимума заданных функций. При этом возможен поиск минимума как для функции одной вещественной переменной, так и для функций многих переменных.

Для функций одной переменной их минимумы разыскивает функция fmin

xmin =fmin('Fun_name', x0, x1).

Здесь Fun_name представляет имя функции, у которой находятся минимумы, а x0 и x1 задают отрезок поиска.

Например, найдем минимумы функции на отрезке [0;2].

Создадим файл-функцию, вычисляющую значение искомой функции на интервале.

function F=MyFun3(x)

y=exp(-x)*cos(2*pi*x);

Перед нахождением минимума построим график исследуемой функции:

>> fplot('MyFun3',[0,2])

Рисунок 5.3

Как видно из рисунка 5.3, функция имеет два минимума. Вычислим значение второго минимума:

>>x2= fmin('MyFun3',1.4,1.6)

x2 =

1.4749

Для нахождения локального максимума нет специальной функции, поэтому нужно искать минимум функции с обратным знаком.

Для поиска минимума функции нескольких переменных применяется функция fmins:

xmins = fmins('Fun_name', x0).

Здесь Fun_name является именем функции нескольких переменных, для которой ищется минимум, а x0 – это вектор ее аргументов, с которого начинается поиск.

Для иллюстративного примера создадим простую функцию двух переменных имеющую минимумом точку (0,0).

function у = MyFunc4(х)

у = x(1)^2+ x(2)^2;

После этого можно вызвать функцию fmins, которая приближенно находит вектор xmin координат точки минимума:

»xmin = fmins( 'MyFunc2', [1,1] );

»xmin(1)

ans =-2.1023e-005

»xmin(2)

ans =2.5484е-005