8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 104 105 106 107 108 109 110 ... 365

legend! Ч0Л{-3}lCf-fl}*, ,10л{-6>1, точное решение, 4] grid on hold off

I подфункция вычисления правых частей уравнений function F = rsbad{t, у) F = [у(2); -1.0/tA2J;

Управление выводом результатов

Примеры предыдущих разделов предполагали вызов солверов с двумя выходными аргументами — массивами или одним — структурой. В них возвращался вектор значений независимой переменной и матрица со значениями компонент решения в соответствующих точках. Полученные массивы мы использовали для визуализации и анализа результата. Вернитесь к уравнению (6.4), для решения которого была создана файл-функция, приведенная в листинге 6.15, уберите выходные аргументы у солвера и вывод решения функцией plot. Вызов солвера без выходных аргументов приводит к появлению графического окна, изображенного на рис. 6.12, в котором отображается процесс численного интегрирования дифференциального уравнения и выводятся все компоненты вектора решения.

-2.5,

О

10

15

Рис. 6.12. Графическое отображение процесса численного интегрирования

I За* 130


Возможности вывода результата, предоставляемые солверами MATLAB, не исчерпываются только таким способом визуализации решения. Пользователь можег выбрать альтернативное графическое представление результата, более того, допускается контролировать процесс численного интегрирования и отображать его на графике по своему усмотрению. Для этого следует воспользоваться одним из видов контроля управляющей структуры — OutputFcn. Его значение должно быть указателем на функцию (или ее именем), производящую требуемые операции. Имеется несколько стандартных функций:

□odeplot — построение графиков компонент решения;

□odephas2 — построение графиков компонент решения в фазовых координатах для двумерного процесса;

□odephas3 — построение графиков компонент решения в фазовых координатах для трехмерного процесса;

□odeprint — печать решения.

Заметьте, что вызов солвера без выходных аргументов приводит к появлению тех же графиков, что и применение odeplot, поскольку вид контроля OutputFcn принимает значение eodepiot:

» options = odeset(OutputFcn, Oodeplot)

» [T,Y] = ode45(@oscil, [0 15], YO, options);

Представление решения на фазовой плоскости такое, как на рис. 6.13, производится при помощи odephas2:

» options = odeset(OutputFcn, @odephas2) » [T,Y] = ode45(@oscil, [0 15], YO, options);

Пользователь может создавать свои файл-функции для визуализации решения или обработки результатов каждого шага численного интегрирования.

Рассмотрим один простой пример. Требуется производить численное интегрирование дифференциального уравнения

у" + у = еЛ (sin jr + 2cosy)(6.6)

при начальных условиях у(0) = 0, F[t,Y,Y) до тех пор, пока модуль значения функции у(л) не превзойдет 100. Приведите уравнение к системе обыкновенных дифференциальных уравнений и запрограммируйте ее правую часть в файл-функции syst (листинг 6.18).


Рис. 6.13. Визуализация решения дифференциального уравнения (6.4) на фазовой плоскости (odephas2)

! Листинг 6.18. Правая часть системы дифференциальных уравнений (6.6)

function F = systft, у)

F = [у(2>; exp(t).*(sin(t) + 2*cos(t)) - y(l>];

При вызове солвера, к примеру, odeii3, требуется указать отрезок интегрирования, но его правая граница заранее неизвестна — мы не знаем априори, в какой момент времени модуль значения функции станет больше 100. Например, для отрезка [0, 10] получаются существенно большие значения:

» [Т,Y] = odell3(@syst, [0, 10], [0 1]) » plot(T, Y(:, 1))

Выход состоит в написании файл-функции для обработки значения, вычисленного на текущем шаге интегрирования. Солвер будет вызывать эту функцию после каждого шага и осуществлять дальнейшие действия в зависимости от возвращаемого ей значения. Назовем эту функцию soiproc. Ее заголовок должен иметь вид: function status = soiproc(t, у, flag)



0 ... 104 105 106 107 108 109 110 ... 365