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)

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

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

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

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

Figure contains an axes object. The axes object 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 object. The axes object 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 имя аргумента и 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