odeFunction

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

Синтаксис

f = odeFunction(expr,vars)
f = odeFunction(expr,vars,p1,...,pN)
f = odeFunction(___,Name,Value)

Описание

пример

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

пример

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

пример

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

Примеры

свернуть все

Преобразуйте систему символьных дифференциальных алгебраических уравнений к указателю на функцию, подходящему для решателей ОДУ 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))x˙(t)=F(t,x(t)).. Чтобы упростить дальнейшие вычисления, перепишите систему в форме x˙(t)=f(t,x(t)).

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

Преобразуйте f в указатель функции MATLAB при помощи odeFunction. Получившийся указатель на функцию вводится к решателю ОДУ MATLAB ode15s.

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

Преобразуйте систему символьных дифференциальных уравнений, содержащих обе переменные состояния и символьные параметры к указателю на функцию, подходящему для решателей ОДУ 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))x˙(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)

Запишите сгенерированные указатели на функцию в файлы при помощи опции 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)

Используйте аргумент пары "имя-значение" '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))x˙(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)

Входные параметры

свернуть все

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

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

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

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

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

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

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

Путь к файлу, содержащему сгенерированный код, заданный как вектор символов. Сгенерированный файл принимает аргументы типа double и может использоваться без Symbolic Math 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, когда вы преобразуете символьные матрицы, содержащие много нулевых элементов. Часто, операции на разреженных матрицах более эффективны, чем те же операции на плотных матрицах. Смотрите Разреженные матрицы.

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

свернуть все

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

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

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