Технология исследования функций в табличном процессоре рассматривалась в статье.
При исследовании функции представляют интерес:
— предел функции;
— корни функции.
Вычисление предела функции
Напомним, что функция f(x) имеет предел в точке а тогда и только тогда, когда в этой точке существуют левый и правый пределы, причем они равны. В математике для нахождения пределов функций применяются специальные приемы, в частности такой, как разложением числителя и знаменателя на сомножители и некоторые другие.
Рассмотрим, как можно вычислить предел функции в Matlab.
В сущности, технология вычисления предела функции в Matlab мало отличается от технологии вычисления в табличном процессоре.
Для выполнения вычисления нужно определить переменную, значение которой достаточно близко к предельному значению и вычислить значение функции при этом значении переменной.
Пример. Требуется вычислить предел функции
Решение задачи приведено ниже в таблице и на рис. 1..
Simulink 01 Начало работы
Вычисление корней функции
Напомним, что корнями функции Y=f(x) называют такие значения х , при которых функция принимает значение ноль.
При решении практических задач величина x являются каким-либо ресурсом, величина которого ограничена и лежит в области допустимого диапазона значений. Поэтому при решении задачи интерес представляют только те корни, которые находятся в области возможных значений x .
Приведенный ниже пример показывает приближенное вычисление р/2 из решения уравнения cos(x)=0 с представлением косинуса дескриптором:
В более сложных случаях, когда заранее невозможно определить области существования корней, рекомендуется строить график функции f(x) для приближенного определения корней и интервалов, в пределах которых они находятся.
Таким образом, чтобы получить точные значения корней с помощью функции fzero нужно найти интервалы x , внутри которых функция меняет знак. Эти значения можно получить, предварительно построив график исследуемой функции.
Пример . Требуется найти все корни функции
Источник: dzen.ru
Создание S-блоков с использованием программ MATLAB
В системе MATLAB предусмотрен механизм преобразования некоторых процедур, написанных на языках высокого уровня, в блок S-модели. Он реализуется с помощью так называемых S-функций.
S-функция— это относительно самостоятельная программа, которая написана на языке MATLAB или С. Главное назначение S-функции состоит в решении следующих задач:
· создание новых блоков, которые дополняют библиотеку пакета Simulink;
· описание моделируемой системы в виде системы математических уравнений;
· включение ранее созданных программ на языке С или MATLAB в S-модель.
Стандартными аргументами S-функции являются:
· t – текущее значение аргумента (времени);
· х — текущее значение вектора переменных состояния;
MATLAB в образовании
· u — текущее значение вектора входных величин;
· flag — целочисленная переменная, отражающая форму представления результатов действия S-функции;
· — дополнительные идентификаторы, характеризующие значения некоторых параметров системы, используемых в S-функции (наличие их не является обязательным).
В результате вычислений, осуществляемых при работе S-функции, получают значение такие переменные:
· sys — системная переменная, содержимое которой зависит от значения, которое приобретает переменная flag;
· х0 — вектор начальных значений переменных состояния;
· str — символьная переменная состояния (обычно она пуста []);
· ts — матрица, которая содержит информацию о дискретах времени.
Текст S-функции состоит из текста самой S-функции и текстов подпрограмм (внутренних), которые она вызывает. В табл. 1 приведены внутренние процедуры, S-функции.
Таблица 1. Внутренние процедуры S-функции
Процедура | Описание |
mdlInitializeSizes | Устанавливает размеры переменных S-функции и начальные значения переменных состояния |
mdlDerivatives | Используется как процедура правых частей системы дифференциальных уравнений модели в форме Коши в случае, когда переменные состояния объявлены как непрерывные |
mdlUpdate | Используется как процедура обновления на следующем интервале дискрета времени значений переменных состояния, которые объявлены как дискретные |
mdlOutputs | Формирует вектор значений выходных переменных в блоке S-функции |
mdlGetTimeOfNextVarHit | Является вспомогательной функцией, которая используется для определения момента времени, когда конкретная переменная состояния пересекает заданный уровень |
mdlTerminate | Является функцией, которая завершает работу S-функции |
Некоторые из указанных процедур S-функции могут не использоваться. Это зависит от типа уравнений (алгебраические, дифференциальные или разностные), которыми описывается моделируемый через S-функцию блок. Так, если блок задан алгебраическими уравнениями, то не используются почти все указанные внутренние процедуры, за исключением процедуры mdlOutputs, в которой и вычисляются соответствующие алгебраические соотношения, определяющие связь между входными переменными и выходными переменными у. В том случае, если поведение блока задано системой непрерывных дифференциальных уравнений, не используется функция mdl Update, если уравнения блока являются разностными — функция mdlDerivatives. Обязательными являются лишь процедуры mdlInitializeSizes и mdlOutputs (инициализации и формирования выхода).
В зависимости от значения переменной flag главная процедура S-функции содержит обращение к той или иной внутренней процедуре. Например:
error([‘Unhandled flag — ‘,num2str(flag)]);
В зависимости от значения переменной flag выполняются следующие действия (через вызов соответствующей внутренней процедуры):
· 0 — инициализация блока S-функции;
· 1 — обращение к процедуре правых частей непрерывных дифференциальных уравнений;
· 2 — вычисление новых значений переменных состояния на следующем шаге дискретизации (для дискретной S-функции);
· 3 — формирование значения вектора выходных величин блока S-функции;
· 4 — формирование нового значения модельного времени, которое отсчитывается от момента пересечения заданного уровня определенной переменной состояния;
· 9 — прекращение работы блока S-функции.
Установка и изменение значения переменной flag осуществляется автоматически, без вмешательства пользователя, в соответствии с логикой функционирования блоков при моделировании.
Итак, использование S-функции позволяет моделировать работу как обычных алгебраических, так и динамических (непрерывных или дискретных) звеньев.
Чтобы создать блок S-функции, выполните следующие действия.
1. Напишите текст S-функции, например в виде М-файла; текст составляется на основе файла-шаблона SfunTMPL.m с учетом заданных уравнений поведения блока.
2. Перетащите стандартный блок S-Function (рис. 13) из раздела User-Defined Functions библиотеки Simulink в окно блок-схемы, в которой будет создаваться новый S-блок.
Рис. 13 Заготовка S – функции
3. Дважды щелкните мышью на изображении блока S-Function, что приведет к появлению на экране окна его настройки. Окно содержит два поля: S-function name (Имя S-функции), в которое вводится имя написанной S-функции, и S-function parameters (Параметры S-функции), в которое вводятся имена или значения параметров блока, указанных в разделе М-файла, содержащего S-функцию.
4. Введите в указанные поля имя М-файла, в котором хранится S-функция, и список значений параметров S-функции.
5. Щелкните мышью на кнопке ОК. Если система обнаружит М-файл с указанным именем в папках, которые для нее доступны, то на изображении блока в окне блок-схемы появится введенное имя S-функции.
S-блок на основе S-функции будет создан. Теперь его можно использовать как обычный S-блок в блок-схеме S-модели. На вход этого блока должен поступать векторный сигнал u. Выходом блока станет векторный сигнал у, который сформирован S-функцией во внутренней процедуре mdlOutputs.
Пример выполнения работы для варианта:
№ варианта | Нелинейная функция ОУ | Границы изменения входного параметра ОУ | Шаг поиска | Структура ОУ | Постоянная времени ОУ | Чистая задержка ОУ |
Y = 25 — (x-5)(x-5) | [0;10] | ЛН |
function [sys,x0,str,ts] = extr(t,x,u,flag)
Источник: megalektsii.ru
Подготовка графиков в MatLab
В написании научных статей немалую часть времени занимает подготовка иллюстраций, графиков и диаграмм. Хочу поделиться некоторыми мыслями и примерами того, как можно ускорить этот процесс. Материал пригодиться тем, кто пользуется системой MatLab.
MatLab предоставляет широкие возможности по отображению графической информации в виде графиков, диаграмм, и т.п. Однако не всегда получаемые по умолчанию иллюстрации удовлетворяют требованиям оформления статей. Для этого в системе MatLab существует множество настроек. И чтобы ускорить подготовку иллюстраций предлагаю воспользоваться несколькими строчками кода, которые помогут помочь настроить отображение графиков.
Прежде всего, необходимо настроить шрифты, которые будут использоваться для вывода значений осей и надписей на графиках, что также помогает в случаях неправильного отображения надписей на русском языке:
set(0,’DefaultAxesFontSize’,14,’DefaultAxesFontName’,’Times New Roman’); set(0,’DefaultTextFontSize’,14,’DefaultTextFontName’,’Times New Roman’);
Затем необходимо настроить размер графика и его положение на экране, например, с отображением на весь экран:
figure(‘Units’, ‘normalized’, ‘OuterPosition’, [0 0 1 1]);
При необходимости вставляем название графика:
title(‘Название’);
Далее можно включить построение нескольких графиков в одном окне, c использованием тех же осей и свойств графика:
hold on;%или hold all;
Строим графики с определенным цветом, стилем и толщиной линии:
plot(X2,Y2,’:k’,’LineWidth’,3); plot(X2,Y3,’:b’,’LineWidth’,3); plot(X2,Y4,’-.’,’Color’,[.1 .7 .7],’LineWidth’,3); plot(X2,Y5,’—‘,’Color’,[.1 .4 .1],’LineWidth’,3); plot(X2,Y6,’r’,’LineWidth’,3);
Вставляем легенду в график с определенным положением на рисунке, например справа внизу:
legend(‘исходные данные’,’полином 3-й степени’,’полином 4-й степени’,’полином 5-й степени’,’полином 7-й степени’,’полином 9-й степени’, 4);
И вот тут начинается самое интересное.
При построении графика в MatLab дробные значения подписей на осях координат отображаются с разделителем в виде точки, тогда как, разделитель дробной и целой части у нас принято отображать запятой.
Чтобы не изменять вручную все значения подписей данных осей через меню графика,
воспользуемся небольшим куском кода:
BX=get(gca,’XTick’); BY=get(gca,’YTick’); xlabel(XL,’Position’,[BX(size(BX,2)) BY(1)]) ylabel(YL,’Rotation’,0,’Position’,[BX(1) BY(size(BY,2))]) XA=get(gca,’XTickLabel’);% for i=1:size(XA,1) z=rem(i,2); if z==0; if XA(i,1)~=’0′ XA(i,2)~=0 XA(i,:)=char(0); end end end XA(size(XA,1),:)=char(0); set(gca,’XTickLabel’,XA); YA=get(gca,’YTickLabel’);% for i=1:size(YA,1) z=strfind(YA(i,:),’.’); YA(i,z)=’,’; clear z; z=rem(i,2); if z~=0; YA(i,:)=char(0); end end YA(size(YA,1),:)=char(0); set(gca,’YTickLabel’,YA);
Код «прореживает» подписи осей x и y, а также исправляет точки на запятые в подписях на оси y. Для других осей необходимо повторить аналогичные процедуры.
И в заключении отобразим линии координатной сетки:
grid on;
Для удобства использования, чтобы не повторять каждый раз эти действия, заключаем написанный код в функцию, в параметрах которой указываются настройки отображения графиков и их данные.
Функция subgraphic
function result=subgraphic(X1,X2,Y1,Y2,Y3,Y4,Y5,Y6,Tit,TL,XL,YL,PL) figure(‘Units’, ‘normalized’, ‘OuterPosition’, [0 0 1 1]); plot(X1,Y1,’o’,’LineWidth’,2,’MarkerEdgeColor’,’k’,’MarkerFaceColor’,[.49 1 .63],’MarkerSize’,5); if Tit title(TL); end hold on; plot(X2,Y2,’:k’,’LineWidth’,3); plot(X2,Y3,’:b’,’LineWidth’,3); plot(X2,Y4,’-.’,’Color’,[.1 .7 .7],’LineWidth’,3); plot(X2,Y5,’—‘,’Color’,[.1 .4 .1],’LineWidth’,3); plot(X2,Y6,’r’,’LineWidth’,3); legend(‘исходные данные’,’полином 3-й степени’,’полином 4-й степени’,’полином 5-й степени’,’полином 7-й степени’,’полином 9-й степени’, PL); BX=get(gca,’XTick’); BY=get(gca,’YTick’); xlabel(XL,’Position’,[BX(size(BX,2)) BY(1)]) ylabel(YL,’Rotation’,0,’Position’,[BX(1) BY(size(BY,2))]) XA=get(gca,’XTickLabel’);% for i=1:size(XA,1) z=rem(i,2); if z==0; if XA(i,1)~=’0′ XA(i,2)~=0 XA(i,:)=char(0); end end end XA(size(XA,1),:)=char(0); set(gca,’XTickLabel’,XA); YA=get(gca,’YTickLabel’);% for i=1:size(YA,1) z=strfind(YA(i,:),’.’); YA(i,z)=’,’; clear z; z=rem(i,2); if z~=0; YA(i,:)=char(0); end end YA(size(YA,1),:)=char(0); set(gca,’YTickLabel’,YA); grid on; result=1;
subgraphic(B,T,A,Y3,Y4,Y5,Y7,Dva_theta_0_5,Tit,’Название’,'<itT>, circC’,'<2<phi>_, град.’,3);
с заранее подготовленными данными.
И здесь нас ждет небольшая засада.
В результате получаем вот такой график:
По умолчанию MatLab отображает греческую букву «фи» как в кириллице «ф». Одним из способов отобразить привычную греческую букву «фи» с петлеобразным начертанием, является выбор специального шрифта c греческими буквами. Скачиваем, например, шрифт Greek Normal отсюда и устанавливаем. Просмотрев шрифт Greek в таблице символов, замечаем, что в этом шрифте буква «фи» существует в двух вариантах, причем для кода латинской «f» получим тот же результат что и в MatLab в виде «ф», а для кода латинской «j» должен быть получен требуемый результат.
subgraphic(B,T,A,Y3,Y4,Y5,Y7,Dva_theta_0_5,Tit,’Название’,'<itT>, circC’,’j>_, град.’,3);
И получим вот такой график:
В результате использования приведенного кода для построения графиков с помощью системы MatLab удалось:
- Решить проблему с некорректным отображением кириллических шрифтов;
- Автоматически заменить разделитель целой и дробной части числа с точки на запятую в графике;
- Отобразить греческую букву фи в петлеобразном начертании.
UPD Еще один способ, подсказанный в комментариях, для отображения «фи» с петлеобразным начертанием:
text(x, y, ‘$varphi$’, ‘FontSize’, 14, ‘Interpreter’, ‘latex’);
- matlab
- графики
- диаграммы
- региональные настройки
- разделитель целой и дробной части
Источник: habr.com