exponenta event banner

odeFunction

Преобразование символьных выражений в дескриптор функции для решателей ОДУ

Описание

пример

f = odeFunction(expr,vars) преобразует систему символьных алгебраических выражений в дескриптор функции MATLAB ®. Этот дескриптор функции может использоваться в качестве ввода в числовые решатели MATLAB ODE, за исключением ode15i. Аргумент vars определяет переменные состояния системы.

пример

f = odeFunction(expr,vars,p1,...,pN) определяет символические параметры системы как p1,...,pN.

пример

f = odeFunction(___,Name,Value) использует дополнительные параметры, указанные одним или несколькими Name,Value аргументы пары.

Примеры

свернуть все

Преобразуйте систему символьных дифференциальных алгебраических уравнений в дескриптор функции, подходящий для решателей ODE MATLAB. Затем решите систему с помощью ode15s решатель.

Создайте следующее дифференциальное алгебраическое уравнение второго порядка.

syms y(t);
eqn = diff(y(t),t,2) == (1-y(t)^2)*diff(y(t),t) - y(t);

Использовать reduceDifferentialOrder переписать это уравнение как систему двух дифференциальных уравнений первого порядка. Здесь, vars - вектор переменных состояния системы. Новая переменная Dy(t) представляет первую производную от y(t) в отношении t.

[eqs,vars] = reduceDifferentialOrder(eqn,y(t))
eqs =
 diff(Dyt(t), t) + y(t) + Dyt(t)*(y(t)^2 - 1)
                       Dyt(t) - diff(y(t), t)
 
vars =
   y(t)
 Dyt(t)

Задать начальные условия для y(t) и его производной Dy(t) кому 2 и 0 соответственно.

initConditions = [2 0];

Найти массовую матрицу M системы и правой части уравнений F.

[M,F] = massMatrixForm(eqs,vars)
M =
[  0, 1]
[ -1, 0]
 
F =
 - y(t) - Dyt(t)*(y(t)^2 - 1)
                      -Dyt(t)

M и F см. форму M (t, x (t)) (t) = F (t, x (t)). Для упрощения дальнейших вычислений переписать систему в виде (t) = f (t, x (t)).

f = M\F
f =
                          Dyt(t)
 - Dyt(t)*y(t)^2 - y(t) + Dyt(t)

Новообращенный f к дескриптору функции MATLAB с помощью odeFunction. Результирующий дескриптор функции вводится в решатель MATLAB ODE ode15s.

odefun = odeFunction(f,vars);
ode15s(odefun, [0 10], initConditions)

Figure contains an axes. The axes contains 4 objects of type line.

Преобразование системы символьных дифференциальных уравнений, содержащих как переменные состояния, так и символьные параметры, в дескриптор функции, подходящий для решателей ODE MATLAB.

Создайте систему дифференциальных алгебраических уравнений. Здесь символические функции x1(t) и x2(t) представляют переменные состояния системы. Система также содержит постоянные символьные параметры. a, bи функцию параметра r(t). Эти параметры не представляют переменные состояния. Задайте уравнения и переменные состояния как два символьных вектора: уравнения как вектор символьных уравнений и переменные как вектор вызовов символьных функций.

syms x1(t) x2(t) a b r(t)
eqs = [diff(x1(t),t) == a*x1(t) + b*x2(t)^2,...
       x1(t)^2 + x2(t)^2 == r(t)^2];
vars = [x1(t) x2(t)];

Найти массовую матрицу M и вектор правой стороны F для этой системы. M и F см. форму M (t, x (t)) (t) = F (t, x (t)).

[M,F] = massMatrixForm(eqs,vars)
M =
[ 1, 0]
[ 0, 0]
 
F =
        b*x2(t)^2 + a*x1(t)
 r(t)^2 - x1(t)^2 - x2(t)^2

Использовать odeFunction для генерации дескрипторов функций MATLAB из M и F. Дескриптор функции F содержит символические параметры.

M = odeFunction(M,vars)
F = odeFunction(F,vars,a,b,r(t))
M = 
  function_handle with value:
    @(t,in2)reshape([1.0,0.0,0.0,0.0],[2,2])

F = 
  function_handle with value:
    @(t,in2,param1,param2,param3)[param1.*in2(1,:)+...
    param2.*in2(2,:).^2;param3.^2-in2(1,:).^2-in2(2,:).^2]

Укажите значения параметров.

a = -0.6;
b = -0.1;
r = @(t) cos(t)/(1+t^2);

Создание дескриптора сокращенной функции F.

F = @(t,Y) F(t,Y,a,b,r(t));

Укажите согласованные начальные условия для системы дисковой полки.

t0 = 0;
y0 = [-r(t0)*sin(0.1); r(t0)*cos(0.1)];
yp0 = [a*y0(1) + b*y0(2)^2; 1.234];

Создание набора опций, содержащего массовую матрицу M системы и вектора yp0 исходных условий для производных.

opt = odeset('mass',M,'InitialSlope',yp0);

Теперь используйте ode15s для решения системы уравнений.

ode15s(F, [t0, 1], y0, opt)

Figure contains an axes. The axes contains 4 objects of type line.

Запишите сгенерированные дескрипторы функций в файлы с помощью File вариант. При записи в файлы odeFunction оптимизирует код, используя промежуточные переменные с именем t0, t1, .… Включить комментарии к файлам, указав Comments вариант.

Определите систему дифференциальных уравнений. Найти массовую матрицу M и правая сторона F.

syms x(t) y(t)
eqs = [diff(x(t),t)+2*diff(y(t),t) == 0.1*y(t), ...
       x(t)-y(t) == cos(t)-0.2*t*sin(x(t))];
vars = [x(t) y(t)];
[M,F] = massMatrixForm(eqs,vars);

Запишите код MATLAB для M и F в файлы myfileM и myfileF. odeFunction перезаписывает существующие файлы. Включить комментарий Version: 1.1 в файлах можно открывать и редактировать выходные файлы.

M = odeFunction(M,vars,'File','myfileM','Comments','Version: 1.1');
function expr = myfileM(t,in2)
%MYFILEM
%    EXPR = MYFILEM(T,IN2)

%    This function was generated by the Symbolic Math Toolbox version 7.3.
%    01-Jan-2017 00:00:00

%Version: 1.1
expr = reshape([1.0,0.0,2.0,0.0],[2, 2]);
F = odeFunction(F,vars,'File','myfileF','Comments','Version: 1.1');
function expr = myfileF(t,in2)
%MYFILEF
%    EXPR = MYFILEF(T,IN2)

%    This function was generated by the Symbolic Math Toolbox version 7.3.
%    01-Jan-2017 00:00:00

%Version: 1.1
x = in2(1,:);
y = in2(2,:);
expr = [y.*(1.0./1.0e1);-x+y+cos(t)-t.*sin(x).*(1.0./5.0)];

Укажите непротиворечивые начальные значения для x(t) и y(t) и их первые производные.

xy0 = [2; 1];    % x(t) and y(t)
xyp0 = [0; 0.05*xy0(2)];    % derivatives of x(t) and y(t)

Создание набора опций, содержащего массовую матрицу M, исходные условия xyp0и числовые допуски для числового поиска.

opt = odeset('mass', M, 'RelTol', 10^(-6),...
               'AbsTol', 10^(-6), 'InitialSlope', xyp0);

Решить систему уравнений с помощью ode15s.

ode15s(F, [0 7], xy0, opt)

Figure contains an axes. The axes contains 4 objects of type line.

Использовать аргумент пары имя-значение 'Sparse',true при преобразовании разреженных символьных матриц в дескрипторы функций MATLAB.

Создайте систему дифференциальных алгебраических уравнений. Здесь символические функции x1(t) и x2(t) представляют переменные состояния системы. Задайте уравнения и переменные состояния как два символьных вектора: уравнения как вектор символьных уравнений и переменные как вектор вызовов символьных функций.

syms x1(t) x2(t)

a = -0.6;
b = -0.1;
r = @(t) cos(t)/(1 + t^2);

eqs = [diff(x1(t),t) == a*x1(t) + b*x2(t)^2,...
       x1(t)^2 + x2(t)^2 == r(t)^2];
vars = [x1(t) x2(t)];

Найти массовую матрицу M и вектор правой стороны F для этой системы. M и F см. форму M (t, x (t)) (t) = F (t, x (t)).

[M,F] = massMatrixForm(eqs,vars)
M =
[ 1, 0]
[ 0, 0]
 
F =
               - (3*x1(t))/5 - x2(t)^2/10
 cos(t)^2/(t^2 + 1)^2 - x1(t)^2 - x2(t)^2

Создание дескрипторов функций MATLAB из M и F. Потому что большинство элементов матрицы масс M являются нулями, используйте Sparse аргумент при преобразовании M.

M = odeFunction(M,vars,'Sparse',true)
F = odeFunction(F,vars)
M = 
  function_handle with value:
    @(t,in2)sparse([1],[1],[1.0],2,2)

F = 
  function_handle with value:
    @(t,in2)[in2(1,:).*(-3.0./5.0)-in2(2,:).^2./1.0e+1;...
    cos(t).^2.*1.0./(t.^2+1.0).^2-in2(1,:).^2-in2(2,:).^2]

Укажите согласованные начальные условия для системы дисковой полки.

t0 = 0;
y0 = [-r(t0)*sin(0.1); r(t0)*cos(0.1)];
yp0= [a*y0(1) + b*y0(2)^2; 1.234];

Создание набора опций, содержащего массовую матрицу M системы и вектора yp0 исходных условий для производных.

opt = odeset('mass',M,'InitialSlope', yp0);

Решить систему уравнений с помощью ode15s.

ode15s(F, [t0, 1], y0, opt)

Figure contains an axes. The axes contains 4 objects of type line.

Входные аргументы

свернуть все

Система алгебраических выражений, заданная как вектор символических выражений.

Переменные состояния, определяемые как вектор символьных функций или вызовов функций, например x(t).

Пример: [x(t),y(t)] или [x(t);y(t)]

Параметры системы, определенные как символьные переменные, функции или вызовы функций, такие как f(t). Можно также указать параметры системы как вектор или матрицу символьных переменных, функций или вызовов функций. Если expr содержит символические параметры, отличные от переменных, указанных в vars, необходимо указать эти дополнительные параметры как p1,...,pN.

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: odeFunction(expr,vars,'File','myfile')

Комментарии для включения в заголовок файла, указанные как символьный вектор, массив ячеек символьных векторов или строковый вектор.

Путь к файлу, содержащему сгенерированный код, указанный как символьный вектор. Созданный файл принимает аргументы типа double, и может использоваться без символьных математических Toolbox™. Если значение пустое, odeFunction генерирует анонимную функцию. Если символьный вектор не заканчивается на .m, функция добавляется .m.

По умолчанию odeFunction с File создает файл, содержащий оптимизированный код. Оптимизированное означает, что промежуточные переменные генерируются автоматически для упрощения или ускорения кода. MATLAB генерирует промежуточные переменные в виде строчной буквы t за которым следует, например, автоматически сгенерированный номер t32. Чтобы отключить оптимизацию кода, используйте Optimize аргумент.

Флаг, препятствующий оптимизации кода, записанного в файл функции, указанный как false или true.

По умолчанию odeFunction с File создает файл, содержащий оптимизированный код. Оптимизированное означает, что промежуточные переменные генерируются автоматически для упрощения или ускорения кода. MATLAB генерирует промежуточные переменные в виде строчной буквы t за которым следует, например, автоматически сгенерированный номер t32.

odeFunction без File аргумент (или путь к файлу, заданный пустым символьным вектором) создает дескриптор функции. В этом случае код не оптимизирован. При попытке принудительно оптимизировать код с помощью параметра Optimize кому true, то odeFunction выдает ошибку.

Флаг, переключающийся между формированием разреженной и плотной матрицы, указанный как true или false. При указании 'Sparse',true, сгенерированная функция представляет символьные матрицы с помощью разреженных цифровых матриц. Использовать 'Sparse',true при преобразовании символьных матриц, содержащих множество нулевых элементов. Часто операции с разреженными матрицами более эффективны, чем те же операции с плотными матрицами. См. раздел Разреженные матрицы.

Выходные аргументы

свернуть все

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

odeFunction возвращает дескриптор функции, подходящий для решателей ОДУ, таких как ode45, ode15s, ode23tи другие. Единственным решателем ОДУ, который не принимает этот дескриптор функции, является решатель для полностью неявных дифференциальных уравнений, ode15i. Преобразование системы уравнений в дескриптор функции, подходящий для ode15i, использовать daeFunction.

Представлен в R2015a