odeFunction

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

Описание

пример

f = odeFunction(expr,vars) преобразует систему символьных алгебраических выражений в MATLAB® указатель на функцию. Этот указатель на функцию может использоваться как вход в числовые решатели MATLAB ODE, кроме 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 ODE ode15s.

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

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

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

Создайте систему дифференциальных алгебраических уравнений. Здесь символические функции 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)

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))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)

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, и может использоваться без 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