Раздел: Документация
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
|