Матлаб. К. Ю. Петрова введение в matlab учебное пособие
Скачать 2.57 Mb.
|
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(y – x) – 2(1 – x) = 0; z' y = 200(y – x) = 0, решая которые, получаем x = y = 1. Коэффициенты функции Розенброка подобраны так, что экстремум оказывается очень слабо выраженным и представляет трудность для обнаружения поисковыми методами. Подробнее с процедурой его поиска можно познакомиться, запустив демонстрационную программу |