odeFunction

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

Описание

пример

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) представляйте переменные состояния системы. Система также содержит постоянные символьные параметры aB, и параметр функционирует 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 оптимизирует код с помощью промежуточных переменных под названием t0t1 . … Включают, комментируют файлы путем определения 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 имя аргумента и 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 возвращает указатель на функцию, подходящий для решателей ОДУ, таких как ode45ode15sode23t, и другие. Единственный решатель ОДУ, который не принимает этот указатель на функцию, является решателем для полностью неявных дифференциальных уравнений, ode15i. Преобразовывать систему уравнений в указатель на функцию, подходящий для ode15i, используйте daeFunction.

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

Для просмотра документации необходимо авторизоваться на сайте