Преобразуйте символьные выражения в указатель на функцию для решателей ОДУ
использует дополнительные опции, заданные одним или несколькими 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
см. форму . Чтобы упростить дальнейшие расчеты, перепишите систему в форме .
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)
Преобразуйте систему символьных дифференциальных уравнений, содержащую как переменные состояния, так и символьные параметры, в указатель на функцию, подходящий для решателей 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,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,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)
expr
- Система алгебраических выраженийСистема алгебраических выражений, заданная как вектор символьных выражений.
vars
- Переменные состоянияПеременные состояния, заданные как вектор символьных функций или вызовов функций, таких как x(t)
.
Пример: [x(t),y(t)]
или [x(t);y(t)]
p1,...,pN
- Параметры системыПараметры системы, заданные как символьные переменные, функции или вызовы функций, такие как f(t)
. Можно также задать параметры системы как вектор или матрицу символьных переменных, функций или вызовов функций. Если expr
содержит символьные параметры, отличные от переменных, заданных в vars
необходимо задать эти дополнительные параметры следующим p1,...,pN
.
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
odeFunction(expr,vars,'File','myfile')
'Comments'
- Комментарии для включения в заголовок файлаКомментарии для включения в заголовок файла, заданные как вектор символов, массив ячеек из векторов символов или строковый вектор.
'File'
- Путь к файлу, содержащему сгенерированный кодПуть к файлу, содержащему сгенерированный код, заданный как вектор символов. Сгенерированный файл принимает аргументы типа double
, и может использоваться без Symbolic Math Toolbox™. Если значение пустое, odeFunction
генерирует анонимную функцию. Если вектор символов не заканчивается на .m
, функция добавляет .m
.
По умолчанию, odeFunction
с File
аргумент генерирует файл, содержащий оптимизированный код. Оптимизированное означает, что промежуточные переменные автоматически генерируются, чтобы упростить или ускорить код. MATLAB генерирует промежуточные переменные в виде строчной буквы t
далее следует автоматически сгенерированный номер, например t32
. Чтобы отключить оптимизацию кода, используйте Optimize
аргумент.
'Optimize'
- Флаг, препятствующий оптимизации кода, записанного в файл функцииtrue
(по умолчанию) | false
Флаг, препятствующий оптимизации кода, записанного в файл функции, заданный как false
или true
.
По умолчанию, odeFunction
с File
аргумент генерирует файл, содержащий оптимизированный код. Оптимизированное означает, что промежуточные переменные автоматически генерируются, чтобы упростить или ускорить код. MATLAB генерирует промежуточные переменные в виде строчной буквы t
далее следует автоматически сгенерированный номер, например t32
.
odeFunction
без File
аргумент (или путь к файлу, заданный пустым символьным вектором) создает указатель на функцию. При этом код не оптимизируется. Если вы пытаетесь применить оптимизацию кода путем установки Optimize
на true
, затем odeFunction
выдает ошибку.
'Sparse'
- Флаг, который переключается между разреженной и плотной генерацией матрицыfalse
(по умолчанию) | true
Флаг, который переключается между разреженной и плотной генерацией матрицы, задается как true
или false
. Когда вы задаете 'Sparse',true
сгенерированная функция представляет символьные матрицы разреженными числовыми матрицами. Использование 'Sparse',true
при преобразовании символьных матриц, содержащих много нулевых элементов. Часто операции с разреженными матрицами более эффективны, чем операции с плотными матрицами. См. Разреженные матрицы.
f
- Указатель на функцию, который вводится в числовые решатели MATLAB ODE, кроме ode15i
Указатель на функцию, который может служить входному параметру для всех числовых решателей ОДУ MATLAB, кроме ode15i
, возвращенный как указатель на функцию MATLAB.
odeFunction
возвращает указатель на функцию, подходящий для решателей ОДУ, таких как ode45
, ode15s
, ode23t
, и другие. Единственный решатель ОДУ, который не принимает этот указатель на функцию, является решателем для полностью неявных дифференциальных уравнений, ode15i
. Чтобы преобразовать систему уравнений в указатель на функцию, подходящий для ode15i
, использование daeFunction
.
daeFunction
| decic
| findDecoupledBlocks
| incidenceMatrix
| isLowIndexDAE
| massMatrixForm
| matlabFunction
| ode15i
| ode15s
| ode23t
| ode45
| reduceDAEIndex
| reduceDAEToODE
| reduceDifferentialOrder
| reduceRedundancies
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.