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

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

Примечание

Управляющий параметр Refine предназначен для увеличения числа точек, в которых вычисляется решение на каждом шаге интегрирования. Если Refine установлен в 1 (по умолчанию), то приближенное решение находится только для конца отрезка, по которому производится интегрирование на текущем шаге. При увеличении Refine вводятся промежуточные точки на отрезке интегрирования, которые разбивают его на столько интервалов, сколько указано в Refine. Решение в этих точках вычисляется при помощи специальных продолжений, экономящих время счета. Солвер ode45, в отличие от остальных, всегда по умолчанию использует 4 интервала.

В результате работы функции solproc формируется выходной аргумент status, который может быть 1 либо 0. Если солвер обнаруживает, что функция solproc вернула 1, то процесс интегрирования прекращается, а если 0 — то продолжается.

Итак, нам требуется запрограммировать функцию, реализующую простой алгоритм: если flag-— пустая строка и модуль значения у(1) превосходит 100, то вернуть 1. иначе вернуть 0. Текст требуемой файл-функции приведен в листинге 6.19.

Входной аргумент flag является строковой переменной и может принимать одно из трех значений, которое в свою очередь определяет содержимое t и у:

□4nif — при первом вызове функции solproc солвером до начала процесса интегрирования. При этом t является вектором из двух элементов— границ отрезка интегрирования по времени, а у — вектором начальных значений;

□1 (пустая строка)— после каждого шага интегрирования. Во входных аргументах t и у находятся текущие значения аргумента и приближенного решения. Аргумент t может содержать несколько текущих значений, при этом в i-ом столбце массива у записаны значения компонент решения дня t(i);

□done — после завершения численного решения системы дифференциальных уравнений. В качестве t и у передаются пустые массивы.

В случае, когда flag является пустой строкой, длина входного аргумента t определяется значением свойства Refine. По умолчанию оно равно 1 и все солверы (кроме ode45) на каждом шаге будут вызывать функцию solproc только от одного значения независимой переменной. Соответственно, у будет вектором со значениями компонент решения, чем мы и будем пользоваться в нашем примере для солвера odell3.


I Листинг 6.19. Файл-функция soiproc для проверки критерия останова солвера

function status = soiproc(t, у, flag)

% функция определяет, превысил ли модуль первой компоненты % решения число 100 после каждого шага интегрирования % если да — status = 1, если нет — status = О status = (length(flag) == 0)&&(abs(y(l)) > 100)

В теле функции для определения значения выходного аргумента мы записали логическое выражение с оператором && (логическое "и"), который при невыполнении первого условия второе уже не проверяет. Действительно, второе условие имеет смысл проверять только в том случае, когда солвер на текущем шаге интегрирования вызвал нашу функцию с flag, равным пустой строке. При последнем вызове soiproc солвером во входном аргументе у передается пустой массив, и обращение к его первому элементу привело бы к ошибке (запись логических выражений в MATLAB подробно рассмотрена в главе 7).

При формировании структуры options задайте указатель на функцию soiproc в качестве значения OutputFcn, вызовите солвер odell3 и постройте график первой компоненты решения.

» options = odeset(OutputFcn1, ©soiproc)

» [T, Y] = odell3(@syst, [0, 10], [0 1], options)

» plottT, Y<:,1))

Получившийся график, приведенный на рис. 6.14, свидетельствует о своевременном останове вычислительного процесса.

Мы привели, пожалуй, самый простой пример использования информации, получаемой в процессе численного интегрирования. Функция обработки решения soiproc могла бы содержать и более сложный алгоритм, записанный на языке программирования MATLAB, который реализует собственный способ визуализации решения и ряда его характеристик. После освоения конструкций языка программирования и дескрипторной графики вам будут понятны тексты файл-функций odepiot, odephas2, odephas3, расположенных в подкаталоге \toolbox\matlab\funfun\ основного каталога MATLAB. Изучение алгоритмов этих файл-функций позволит получить представление о том, как организовать обработку выходных данных солверов (программированию и дескрипторной графике посвящены главы 7—9).

При помощи параметра Outputsei вы можете определять номера компонент решения, которые будут передаваться в файл-функцию обработки. Для этого необходимо указать вектор номеров требуемых компонент или один но-


Рис. 6.14. Решение дифференциального уравнения (6.6) с критерием останова солвера по значению функции

При контроле за наступлением некоторых событий в процессе численного интегрирования часто важно достаточно точно знать время наступления события. Для этого следует запрограммировать файл-функцию специального вида, задать указатель на нее в качестве значения параметра Events и вызвать солвер с пятью выходными аргументами или структурой.

Задание матрицы Якоби

для повышения эффективности вычислений

После завершения счета солвер может вывести в командное окно суммар-нуЕо информацию о вычислительной работе, включающую количество вычислений правой части матрицы Якоби, успешных и неуспешных шагов солвера и другие сведения. Для этого следует установить свойство stats в on. Подробное описание всех свойств управляющей структуры и примеры содержатся в справочной системе MATLAB в разд. Mathematics: Differential Equations: Initial Value Problems for ODEs and DAEs: Changing ODE Integration Properties.

мер, как это сделано в следующем примере для графического отображения процесса нахождения только первой компоненты решения.

» options = odeset(OutputFcn, Sodeplot, OutputEel, 1) » [T, Y] = odell3(@syst, [0, 10J, [0 1], options)



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