Главная страница

Матлаб. К. Ю. Петрова введение в matlab учебное пособие


Скачать 2.57 Mb.
НазваниеК. Ю. Петрова введение в matlab учебное пособие
АнкорМатлаб
Дата15.09.2022
Размер2.57 Mb.
Формат файлаpdf
Имя файлаmironovsky_petrova_matlab.pdf
ТипУчебное пособие
#678847
страница8 из 18
1   ...   4   5   6   7   8   9   10   11   ...   18
scatter строит фигурный или «рассыпчатый» график (от scatter – рассыпать).
Например, набрав x=0:.2:10; y=sin(x); scatter(х,y, 10*(х.^2+1))
получим синусоиду, нарисованную с помощью кружков возрастающего размера (рис. 4.8). В частности, таким образом можно изобразить динамическую трубку точности.
Примеры действия команд pie и pie3, которые строят круговые диаграммы, показаны на рис.
4.9 и рис. 4.10.

51 7%
13%
20%
27%
33%
pie(1:5)
Рис. 4.9 27%
33%
20%
7%
13%
pie3(1:5)
Рис. 4.10
Команда errorbar строит график кривой с учетом погрешности. В качестве примера на рис.
4.11 показан результат выполнения последовательности команд: t=1:.05:20;y=exp(.2*t).*sin(t);x=exp(.2*t).*cos(t); errorbar(x,y,(t.^1.5)*.1)
Команда plotyy позволяет нарисовать две разномасштабные кривые на одном графике.
Набрав plotyy(X1,Y1,X2,Y2) получим график
Y1 от X1 с размеченной y-осью слева и график Y2 от
X2 с размеченной y-осью справа.На рис. 4.12показан результат выполнения команд t=0:.1:10; y=sin(t); plotyy(t,y,t,t.^2), grid
-40
-20 0
20 40 60
-40
-30
-20
-10 0
10 20 30 40 50 60
Рис. 4.11
Рис. 4.12
Функция strips (от strip – полоска) используется для просмотра «длинных» графиков. Она разрезает такой график на куски равной длины и размещает их друг под другом.
Imagesc служит для визуализации матриц (цвет элементов зависит от их величины). На рис.
4.7 приведен пример изображения с ее помощью матрицы Адамара двенадцатого порядка
(элементы +1 выделены белым цветом, элементы -1 – черным).
Из других команд для визуализации матриц отметим hintonw, spy, printmat, plotmatrix.
0 2
4 6
8 10
-1 0
1 0
2 4
6 8
10 0
50 100

52 2
4 6
8 10 12 2
4 6
8 10 12
imagesc(hadamard(12))
Рис. 4.13 1
2 3
4 5
6 7
1 2
3 4
5 6
7 0
2 4
6 8
bar3(diag(7:-1:1))
Рис. 4.14
Трехмерная графика
Выше речь шла о графиках на плоскости. MATLAB позволяет также изображать линии, поверхности и фигуры в трехмерном пространстве, вращать полученное изображение и смотреть на него с различных ракурсов. Соответствующие команды приведены в табл.4.2.
Таблица 4.2
bar3
plot3
mesh
surf
sphere
cylinder
bar3h
contour
meshgrid
fill3
ellipsoid
logo
Команда bar3 предназначена для трехмерного изображения матрицы в виде столбиков, высота которых пропорциональна величине ее элементов. В качестве простого примера на рис.
4.14 приведено изображение диагональной матрицы. Команда bar3h отличается горизонтальным расположением столбиков.
Для изображения линий и кривых в трехмерном пространстве используется команда plot3.
Пример построения с ее помощью графика винтовой линии был приведен в разд.1.3.
Для изображения поверхностей в трехмерном пространстве служат команды contour, mesh,
meshgrid и surf. Команда contour(Z)
строит горизонтальные сечения поверхности, задаваемой матрицей Z, считая, что ее элементы указывают высоту над плоскостью. Число контурных линий может указываться с помощью второго аргумента. Дополнительными возможностями обладают команды contourf и contour3.
Команда mesh(Z)
создает график трехмерной перспективы элементов матрицы Z. Она может использоваться для визуализации больших матриц и графического изображения функций двух переменных.

53 0
5 10 15 20 0
10 20 30 40 0
0.1 0.2 0.3 0.4 0.5
Рис. 4.15
В сочетании с meshgrid команда mesh позволяет строить графики поверхностей в трехмерном пространстве. При этом meshgrid формирует координатную сетку в заданной области плоскости (x, y). В качестве примера на рис. 4.15 показан график поверхности, задаваемой уравнением
2 2
y
x
xe
z



в области
9
,
1 2
;
9
,
1 0





y
x
, построенный с использованием указанных команд:
[X,Y] = meshgrid(0:.1:1.9, -2:.1:1.9); Z =X.*exp(-X.^2-Y.^2); mesh(Z)
Команды surf и fill3 служат для изображения раскрашенных поверхностей. Кроме того имеется ряд команд для изображения конкретных трехмерных фигур и поверхностей. К ним относятся уже упоминавшиеся в разд. 1.3 команды cylinder, sphere, ellipsoid, а также logo,
membrane, peaks и некоторые другие. Специальные графические команды имеются в тулбоксе
SYMBOLIC, к ним относятся ezplot, ezcontour, ezmesh, ezmeshc, ezplot3, ezpolar, ezsurf, ezsurfc.
В графической системе MATLAB реализован довольно большой спектр возможностей полигональной графики. В частности, есть возможность использовать как диффузные, так и точечные источники освещения, различные алгоритмы закраски и т.д. Это позволяет строить графики сложных поверхностей. Примером может служить логотип MATLAB, изображенный на рис. 4.16. Он строится при помощи команды logo. Изображенная зависимость является графиком первой собственной функции L-образной мембраны с защемленным внутренним краем, которая рассчитывается с помощью команды membrane. Чтобы посмотреть графики других собственных функций нужно заменить первый параметр вызова membrane на 2, 3, 4 и т.д. На рис. 4.17 приведен график третьей собственной функции мембраны. При расчете этих поверхностей используется функции Бесселя.

54
Рис. 4.16
Рис. 4.17
Все графики, построенные в MATLAB, можно переводить в стандартные графические форматы (bmp, metafile) и переносить в другие приложения, например, в WORD. В свою очередь, в
MATLAB есть средства для импорта графических файлов различных форматов и их последующей обработки. Соответствующие команды сосредоточены в тулбоксе IMAGE PROCESSING.
Решение
алгебраических
уравнений и поиск экстремумов функций
MATLAB в первую очередь ориентирован на решение задач линейной алгебры, однако в нем есть и средства для решения нелинейных алгебраических задач, таких как отыскание корней нелинейных уравнений, поиск экстремумов функций одной или нескольких переменных, решение задач аппроксимации и интерполяции. Опишем некоторые из них.
Решение нелинейных уравнений
Одна из распространенных алгебраических задач – поиск корней уравнения f(x)=0. Для численного отыскания корней проще всего построить график функции y=f(x) и найти точки его пересечения с осью абсцисс (в MATLAB это можно сделать с помощью команд plot, fplot, ezplot).
Аналогично можно поступить и в случае системы двух уравнений с двумя неизвестными f(x, у)=0,
g(x, y)=0, построив на плоскости (х, у) графики этих функций и найдя точки их пересечения друг с другом. Сложнее обстоит дело с поиском комплексных корней, здесь требуется привлечение специальных методов.
Ранее уже было описано применение команды roots для нахождения корней полиномов.
Для поиска корней более сложных уравнений с одной переменной, например, включающих логарифмические, тригонометрические, экспоненциальные зависимости, применяют команду
fzero. Ее входными аргументами служат имя функции, вычисляющей левую часть уравнения
0
)
(

x
f
, и начальное приближение
0
x .
Пример. Возьмем полином
2 3
)
(
2



x
x
x
f
с корнями -1 и -2. В MATLAB их можно найти двумя путями: посредством команды roots и с помощью команды
fzero. В последнем случае нужно сформировать вспомогательную функцию ff в виде отдельного m-файла или же создать временную функцию (на период данного сеанса MATLAB) при помощи команды inline. Команда
fzero, использующая численные методы, возвращает один из корней полинома в зависимости от начального приближения.
>> р=[1 3 2];
>> roots(p) ans = -2
-1
>>f(x)= inline('x^2+3*x+2';
>> fzero f(x), -3)) function y=ff(x) y=x^2+3*x+2;

55 ans = -2.0000
>> fzero(f(x),0) ans = -1
>> fzero(@ff,0) ans = -1
В команде fzero
и других командах, рассматриваемых в этом параграфе, имеется возможность задавать структуру опций решателя. Ее можно описать вручную, но удобнее использовать команды optimget и optimset. Для получения полного списка опций и значений по умолчанию применяют формат optimset
(‘имя решателя'),
например, opts=optimset('fzero').
Для изменения опций используется команда opts=optimset
(‘имя параметра’,значение_параметра).
Уменьшим точность вычислений в предыдущем примере, изменяя опции решателя:
>> o=optimset('fzero
'); % опции команды fzero по умолчанию
>> optimget(o,'TolX
') % точность вычислений по умолчанию ans = 2.2204e-016
>> fzero(@ff,0)
% оптимизация с точностью 2.22е-16 ans = -1
>> o=optimset(o,'TolX',1e-
1); % понизили точность до 0.1
>> fzero(@ff,0,o
) % оптимизация с точностью 0.1 ans = -1.0240
Теперь вместо точного ответа х
1
= – 1 получено приближенное значение х
1
= – 1,024.
Другая возможность решения нелинейных алгебраических уравнений (и систем таких уравнений) связана с использованием команды solve тулбокса SYMBOLIC. Проиллюстрируем ее на простом примере.
Пример. Требуется найти корни трансцендентного уравнения
0



x
e
x
Попытка его графического решения к успеху не приводит – график функции
x
e
x
y



ни разу не пересекает ось абсцисс. Это означает, что вещественных корней нет. Для поиска комплексных корней воспользуемся функцией solve. Набирая solve
(‘x+exp(-x)’),
получим ответ ans=lambert(-1).
Таким образом, решение нашего уравнения выражается через функцию Ламберта (это функция, обратная по отношению к функции
x
xe ). Чтобы вычислить ее значение, можно набрать double(ans)
(результатом будет ans=-0.3181+1.3372i)
, либо использовать команду x=lambertw(
а).
В частности при а= – 1 получим x= – 0,318+1,337i, а при а= – 1,4 получим x= – 0,0828+1,517i (это решение уравнения
0 4
,
1



x
e
x
).
x
2
+a
2
=45 2
,
x
2
+b
2
=35 2
,
a
x
y
x
b
x
y



10
,
10 45 35
a
b
10
х-y
x

56
Рис. 4.18
Для численного решения систем нелинейных алгебраических уравнений с несколькими неизвестными вида F(X)=0, где F – вектор-функция, Х – вектор переменных, предназначена команда fsolve. Ее входными аргументами служат имя функции, оформленной в виде отдельного
m-файла, в которой описаны левые части нелинейных уравнений, и вектор начальных значений переменных. Проиллюстрируем применение этой команды на примере.
Задача о двух лестницах. В узком переулке крест-накрест стоят две лестницы длиной 45 и
35 футов (рис. 4.18). Расстояние от земли до точки их пересечения составляет 10 футов.
Определить ширину переулка.
Решение. Обозначим расстояние от верхних точек лестниц до земли через a и b, ширину переулка через x, а расстояние от точки пересечения до левой стенки через y. Тогда можем записать систему 4 уравнений с 4 неизвестными, приведенную на рис. 4.18. В MATLAB ее можно решить двумя способами.
Способ 1 (символьный). Найдем аналитическое решение с помощью команды solve:
>>syms a b x y;s=solve('x^2 + a^2-45^2, x^2 + b^2-35^2, y/10-.x/b, (x-y)/10-x/a') s = a: [12x1 sym] b: [12x1 sym] x: [12x1 sym] y: [12x1 sym]
В результате получаем структуру s содержащую 12 аналитических вариантов решения. Однако попытка вывода их на дисплей, обращаясь к полям
>> s.x, s.y, показывает, что решение содержит многоэтажные корни, громоздко и неудобно для обозрения.
Его можно представить в численном виде, набрав:
>>[double(s.x) double(s.y) double(s.a) double(s.b)]
На дисплей будут выведены все 12 вариантов решения, но среди них только одно имеет физический смысл:
>>ans=31.8175 21.8189 31.8222 14.5825
Способ 2 (численный). Решим систему в численном виде с помощью команды fsolve.
Предварительно составим вспомогательную функцию ladder, содержащую информацию об уравнениях. function fn=ladder(p) x=p(1); y=p(2); a=p(3); b=p(4); f(1)=x^2 + a^2 - 45^2; f(2)=x^2 + b^2 - 35^2; f(3)=y/10 - x/b; f(4)=(x-y)/10 - x/a; fn=f(:);
Решаем систему, задав вектор начальных условий [10; 10; 20; 20]
>>x=fsolve('ladders',[10; 10; 20; 20])
Получаем ответ: x=31.8175; y=21.8189; a=31.8222; b=14.5825.
Видим, что оба способа дают один и тот же результат.
Поиск экстремумов
Распространенная группа задач связана с поиском экстремумов функций одного или нескольких аргументов.
Широко известны аналитические методы решения конечномерных экстремальных задач – метод Ферма (рецепт "взять производную и приравнять нулю") и метод множителей Лагранжа.
Первый из них применяется для решения задач безусловной оптимизации, когда требуется найти экстремумы функции
).
,
,
(
1
n
x
x
f
y


Необходимые условия экстремума имеют вид

f /

x
1
=0 , ...,

f /

x
n
=0, их можно записать в компактном виде grad у = 0. После отыскания корней этой системы алгебраических уравнений проверяются достаточные условия экстремума.

57
Метод Лагранжа применяется для аналитического решения задач условной оптимизации, когда требуется найти экстремумы функции
)
,
,
(
1
n
x
x
f
y


при наличии ограничений
0
)
,
,
(
1

n
x
x
g

В этом случае строится составной критерий L = f + λg и его частные производные приравнивают нулю.
Для численного решения тех же задач применяют методы половинного деления и золотого сечения (одномерный поиск), методы градиента и наискорейшего спуска, методы целочисленного, линейного и нелинейного программирования. В пакете MATLAB эти методы реализованы в командах fminsearch, fminunc, fmincon, fminbnd. Для задач линейного программирования предназначена команда
linprog
Минимум одномерной функции отыскивают с помощью команды fminsearch. Для поиска максимума функции
)
(x
f
достаточно найти минимум функции
)
(x
f

, поэтому специальной функции для поиска максимумов в MATLAB не существует.
Пример. Найдем точку минимума полинома
2 3
)
(
2



x
x
x
f
из примера 1 и убедимся в правильности результата, приравнивая производную нулю. Производную берем с помощью функции polyder, ее корень находим командой fzero. fminsearch(@ff,0) polyder(p) fzero(inline('2*x+3'),0) ff(ans) ans = -1.5000 ans = 2 3 ans = -1.5000 ans = -0.25
В последнем столбце приведен расчет значения функции f(x) в точке минимума.
Для безусловной минимизации функций от нескольких переменных используют функцию
fminunc (от слова unconstrained – без ограничений). Ее первый входной аргумент – имя минимизируемой функции, второй – координаты начальной точки для поиска.
Пример. Найдем минимум функции двух переменных
,
2 2
2 1
x
x
y


который, очевидно, достигается в точке
0 2
1


x
x
. Предварительно нужно в отдельном m-файле описать минимизируемую функцию, назовем ее fff: function y=fff(x) y=x(1)^2+x(2)^2;
>> x=fminunc(@fff,[3 3])
Warning: Gradient must be provided for trust-region method; using line-search method instead. x = 1.0e-008 * [-0.9290 -0.9290]
Ответ получен с достаточно хорошей точностью. В то же время MATLAB рекомендует вместо линейного поиска применить градиентный метод. Для этого требуется, во-первых, переписать функцию fff так, чтобы она возвращала не только переменную y, но и ее частные производные (вектор градиента), и, во-вторых, подключить градиентный метод при помощи команды optimset. function [y,dy]=fff1(x) y=x(1)^2+x
(2)^2; % функци dy=[2*x(1),2*x
(2)]; % градиент
>> fminunc(@fff1,[3 3],optimset('Gradobj','on'))
Optimization terminated successfully:
First-order optimality less than OPTIONS.TolFun, and no negative/zero curvature detected ans = 0 0
Теперь получено точное решение.
Пример. Рассмотрим задачу отыскания экстремума функции трех переменных
y = 2x
1 2
+ 8x
2 2
+ x
3 2
+ 4x
1
x
2
+ 2x
1
x
3
– 4x
3
Вычисляя производные


y
x
i
/
и приравнивая их нулю, получаем

58 4x
1
+ 4x
2
+ 2x
3
= 0; 16x
2
+ 4x
1
= 0; 2x
3
+ 2x
1
– 4 = 0.
Решение этой системы линейных уравнений имеет вид x
1
= – 4, x
2
= 1, x
3
= 6.
Дополнительный анализ показывает, что найденное решение – точка минимума.
Упражнение. Найдите полученное решение с помощью функции fminunc.
Пример. Для проверки эффективности численных алгоритмов поиска минимума используют различные тестовые задачи. Одна из популярных тестовых функций была предложена
Розенброком:
z = 100(y x
2
)
2
+ (1 – x)
2
Она всегда неотрицательна и обращается в нуль в единственной точке x = y = 1 (точка минимума). Сначала найдем этот минимум теоретически. Формальные выкладки приводят к двум уравнениям
z'
x
= – 400x(yx) – 2(1 – x) = 0; z'
y
= 200(yx) = 0, решая которые, получаем x = y = 1.
Коэффициенты функции Розенброка подобраны так, что экстремум оказывается очень слабо выраженным и представляет трудность для обнаружения поисковыми методами. Подробнее с процедурой его поиска можно познакомиться, запустив демонстрационную программу
1   ...   4   5   6   7   8   9   10   11   ...   18


написать администратору сайта