Основные теоретические сведения. В системе MATLAB для решения систем линейных уравнений предусмотрены знаки операций / и \
В системе MATLAB для решения систем линейных уравнений предусмотрены знаки операций / и \. Чтобы решить систему линейных уравнений вида
A⋅y =B , (1)
где A – заданная квадратная матрица размером NxN,
B – заданный вектор–столбец длины N, достаточно применить операцию \ и вычислить выражение A\ B .
Операция \ называется левым делением матриц и, будучи примененная к матрицам A и B в виде A\B , примерно эквивалентна вычислению выражения inv(A)*B. Здесь под inv(A) понимается вычисление матрицы, обратной к матрице A . Операцию / называют правым делением матрицы. Выражение A/B примерно соответствует вычислению выражения B*inv(A). Значит, эта операция позволяет решать системы линейных уравнений вида y⋅A= B .
Решение уравнения F(x)=0, или нахождение нулей функции, осуществляется с помощью функции fzero(name, x0) . В качестве первого аргумента ей передается имя функции, задающей исходное уравнение, вторым аргументом служит начальное приближение к корню. Определим, в качестве примера, нули функции cos(x) на отрезке от 0 до pi. В качестве начального приближения примем x0=1.
>> x=fzero('cos', 1)
x = 1.5708
Если требуется найти корень функции, отличной от стандартной (встроенной в систему MATLAB) и тем самым не имеющей в рамках системы MATLAB фиксированного имени, то нужно приписать некоторое имя выражению, вычисляющему функцию.
Пусть, например, требуется найти корни уравнения cos(x)=x, что эквивалентно нахождению нулей функции, вычисляемой по формуле y=cos(x)−x, не имеющей в рамках системы MATLAB фиксированного имени. В этом случае нужно создать Mat–функцию вида
function y=MyFunction1(x)
y=cos(x)-x
После этого можно воспользоваться функцией fzero:
>> x=fzero('MyFunction1',pi/2)
x = 0.7391
Если найдено абсолютно точное значение корня, то значение функции в этой точке равно нулю. Таким образом, величина функции в приближенно найденном нуле косвенно характеризует погрешность результата. Чтобы управлять погрешностью, нужно осуществлять вызов функции fzero с тремя аргументами fzero(name, x0, tol ), где tol задает требуемую величину погрешности (ошибки). Необходимо отметить, что функция fzero находит нули только вещественнозначных функций одной вещественной переменной. Однако часто бывает необходимо найти комплексные корни вещественнозначных функций, особенно в случае многочленов. Для этой цели в системе MATLAB существует специальная функция roots(p), которой в качестве аргумента передается массив коэффициентов многочлена (p). Например, для многочлена нужно сначала сформировать массив его коэффициентов (расположив по порядку убывания степени х):
>> p = [ 1 -3 3 -3 2 ]:
>> r = roots( p)
r = 2.0000
-0.0000 +1.0000i
-0.0000 –1.0000i
1.0000
В задаче о нахождении нулей функции сложным моментом является нахождение начального приближения к нулю функции, а также априорная оценка их количества. Поэтому важно параллельно с применением функций типа roots или fzero визуализировать поведение искомых функций на том или ином отрезке значений аргумента.
В системе MATLAB имеются специальные функции для поиска минимума заданных функций. При этом возможен поиск минимума как для функции одной вещественной переменной, так и для функций многих переменных. Для функций одной переменной их минимумы разыскивает функция
xmin =fmin(name, x0, x1). Здесь name представляет имя функции, у которой находятся минимумы, а x0 и x1 задают отрезок поиска. Для поиска минимума функции нескольких переменных применяется функция fmins: xmins = fmins( name, x0). Здесь name является именем функции нескольких переменных, для которой ищется минимум, а x0 – это вектор ее аргументов, с которого начинается поиск. Для иллюстративного примера создадим простую функцию двух переменных имеющую минимумом точку (0,0).
function у = MyFunc2(х)
у = 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
Для вычисления интегралов методом трапеций в системе MATLAB предусмотрена функция trapz: Integ = trapz(х, у). Точность вычисления интеграла зависит от величины шага интегрирования: чем меньше этот шаг, тем больше точность.
Вычислим простой интеграл методом трапеций с шагом интегрирования рi/10.
>> dx = pi/10;
>>х = 0:dx:pi;
>> y=cos(x);
>>I1 = trapz(x,y);
I1 = 5.5511e-017
Обычно для достижения высокой точности требуется выполнять интегрирование с очень малыми шагами, а контроль достигнутой точности осуществлять путем сравнения последовательных результатов. При одном и том же шаге интегрирования методы более высоких порядков точности достигают более точных результатов. В системе MATLAB методы интегрирования более высоких порядков точности реализуются функциями: quad (метод Симпcона) и quad8 (метод Ньюто-на-Котеса 8-го порядка точности).
Двойные интегралы в системе MATLAB вычисляются с помощью специальной функции dblquad.
Вычислим интеграл вида .
Оформим подынтегральную mat–функцию и вызовем функцию dblquad:
function z = integ(x, у)
z = x.*sin(y) + y.*sin(x);
>>J = dblquad( 'integ', 0, 1, 1, 2 );
J = 1.1678
Возможности встроенного пакета символьных вычислений и операции Symbolic Math Toolbox достаточно обширны, рассмотрим лишь некоторые его возможности. Символьный объект создается при помощи функции syms. Команда создает три символьные переменные х, а и b
» syms х a b
Конструирование символьных функций от переменных класса sym object производится с использованием обычных арифметических операций и обозначений для встроенных математических функций. Запись формулы для выражения в одну строку не всегда удобна, более естественный вид выражения выводит в командное окно функция pretty:
Рисунок 5.1– Демонстрация работы функции pretty
Упростим выражение , используя функцию simplify.
Рисунок 5.2– Демонстрация работы функции simplify
Символьную функцию можно создать без предварительного объявления переменных при помощи sym, входным аргументом которой является строка с выражением, заключенная в апострофы:
Рисунок 5.3 – Демонстрация создания символьной переменной без предварительного объявления
Упрощение тригонометрических, логарифмических, экспоненциальных
функций и полиномов осуществляется функцией expand, формат обращения к которой имеет следующий вид: rez=expand(S), где S – символьное выражение, которое нужно упростить, rez – результат упрощения.
Например:
>> syms x y;
>> rezl=expand(sin(x+y))
rezl = sin (x) *cos (у) +cos (x) *sin (y)
С помощью функции factor можно раскладывать многочлены на простые множители, а целые числа – в произведение простых чисел
>> factor(sym('x^5 – 1') )
ans =
(х-1)*(х^4+х^3+х^2+х+1)
Функция subs осуществляет подстановку новых выражений для указанных символьных переменных:
Рисунок 5.4– Демонстрация работы функции subs
Symbolic Math Toolbox позволяет работать как с неопределенными интегралами, так и с определенными. Неопределенные интегралы от символьных функций вычисляются при помощи функции int, в качестве входных аргументов указываются символьная функция и переменная, по которой происходит интегрирование (см. рис.5.5).
Рисунок 5.5– Демонстрация работы функции int
Для нахождения определенного интеграла в символьном виде следует задать нижний и верхний пределы интегрирования, соответственно, в третьем и четвертом аргументах int:
Рисунок 5.6– Демонстрация работы функции intдля нахождения определенного интеграла
Перечислим еще несколько функций, часто используемых при символьных вычислениях:
inv – вычисляет обратную матрицу;
limit –вычисляет пределы;
taylor – осуществляет разложение функций в ряд Тейлора;
solve – решает алгебраическое уравнение и систему алгебраических уравнений.
Для работы с символьными данными предусмотрена оболочка funtool. Она представляет собой интерактивный графический калькулятор, позволяющий быстро построить графики двух функций и . Интерфейс данного приложения представлен на рисунке 5.7. При запуске выводятся три автономных окна: два графически и управляющее. Управляющее окно содержит два поля для ввода функций, поле ввода пределом изменения переменной x, поле ввода масштабирующего коэффициента.
Рисунок 5.7 – Интерфейс приложения funtool
Порядок выполнения
1. Составить и отладить программы для нахождения корней уравнения f1(x) = 0 и f2(x) = 0 и вывести графики функции на основании задания из таблицы 5.1.
2. Найти определенный интеграл для подынтегральной функции, заданной в таблице 5.2.
Таблица 5.1– Варианты заданий для нахождения корней уравнения
№ варианта | – полином 3-ей степени с коэффициентами a | ||||
-1 | -1 | ||||
-2 | -15 | ||||
-1 | |||||
-8 | -70 | ||||
-4 | |||||
-5 | |||||
-3 | |||||
-6 | |||||
-9 | |||||
-7 | |||||
-1 | -4 | ||||
-2 | -6 | -7 | |||
-3 | -9 | -8 | |||
-4 | -75 | ||||
-5 | -1 |
Таблица 5.2 – Варианты функций для нахождения значения интеграла
№ варианта | Функция | Интервал интегрирования | |
начало интервала | конец интервала | ||
-2 | |||
-2 | |||
-2 | |||
-2 | |||
-0.5 | 4.5 | ||
-1.4 | 1.4 | ||
-5 | |||
-5 | |||
-4 | |||
-2 | |||
-2 | |||
Продолжение таблицы 5.2 | |||
-2 | |||
-1 | |||
-2 | |||
-2 |
3. Найти определенный интеграл для подынтегральной функции, заданной в таблице 5.2 с использованием пакета символьных вычислений.
Содержание отчета
1. Цель занятия.
2. Листинг программы и результаты выполнения.
Контрольные вопросы
1.Для чего служит функция fmin?
2. Для чего служит функция fzero?
4. Перечислите основные внешние расширения системы MATLAB для поиска экстремумов функций.
5. Какая функция служит для вычисления определенного интеграла?
6. Назовите функции работы с символьными переменными.
Практическое занятие № 6