Уменьшайте порядок дифференциальных уравнений к 1
Входные параметры вектора символов будут удалены в будущем релизе. Вместо этого используйте syms, чтобы объявить переменные и входные параметры замены, такие как odeToVectorField('D2y = x') с syms y(x), odeToVectorField(diff(y,x,2) == x).
V = odeToVectorField(eqn1,...,eqnN)[V,S] =
odeToVectorField(eqn1,...,eqnN) преобразовывает дифференциальные уравнения высшего порядка V = odeToVectorField(eqn1,...,eqnN)eqn1,...,eqnN в систему дифференциальных уравнений первого порядка, возвращенных как символьный вектор.
[ преобразовывает V,S] =
odeToVectorField(eqn1,...,eqnN)eqn1,...,eqnN и возвращает два символьных вектора. Первый векторный V совпадает с выводом предыдущего синтаксиса. Второй векторный S показывает замены, сделанные получить V.
Преобразуйте это дифференциальное уравнение второго порядка в систему дифференциальных уравнений первого порядка.
syms y(t) eqn = diff(y,2) + y^2*t == 3*t; V = odeToVectorField(eqn)
V =
Y[2]
3*t - t*Y[1]^2Элементы V представляют систему дифференциальных уравнений потому что y = Y [1] и Y [i] ′ = V [i]. Здесь, этот конкретный вывод представляет эти уравнения:
diff(Y[1],t) = Y[2]
diff(Y[2],t) = 3*t - t*Y[1]^2
Для получения дополнительной информации на отношении между вводом и выводом, см. Алгоритмы.
При сокращении порядка дифференциальных уравнений возвратите замены, которые odeToVectorField делает путем определения второго выходного аргумента.
syms f(t) g(t) eqn1 = diff(g) == g-f; eqn2 = diff(f,2) == g+f; eqns = [eqn1 eqn2]; [V,S] = odeToVectorField(eqns)
V =
Y[2]
Y[1] + Y[3]
Y[3] - Y[1]
S =
f
Df
gОт S у нас есть S[1] = Y[1] = f, S[2] = Y[2] = diff(f) и S[3] = Y[3] = g.
Численно решите дифференциальное уравнение высшего порядка путем сокращения порядка уравнения, генерации указателя на функцию MATLAB®, и затем нахождения числового решения с помощью функции ode45.
Преобразуйте это дифференциальное уравнение второго порядка в систему дифференциальных уравнений первого порядка.
syms y(t) eqn = diff(y,2) == (1-y^2)*diff(y)-y; V = odeToVectorField(eqn)
V =
Y[2]
- (Y[1]^2 - 1)*Y[2] - Y[1]Сгенерируйте указатель функции MATLAB от V при помощи matlabFunction.
M = matlabFunction(V,'vars', {'t','Y'})M =
function_handle with value:
@(t,Y)[Y(2);-(Y(1).^2-1.0).*Y(2)-Y(1)]Решите эту систему на интервале [0 20] с начальными условиями y’ (0) = 2 и y’’ (0) = 0 при помощи функции ode45.
interval = [0 20]; y0 = [2 0]; ySol = ode45(M,interval,y0);
Сгенерируйте значения t в интервале при помощи функции linspace. Для этих значений оцените решение для y, который является первым индексом в ySol путем вызывания функции deval с индексом 1. Постройте решение.
tValues = linspace(0,20,100); yValues = deval(ySol,tValues,1); plot(tValues,yValues)

Преобразуйте дифференциальное уравнение второго порядка y ″ (x) = x с начальным условием y (0) = a к системе первого порядка.
syms y(x) a eqn = diff(y,x,2) == x; cond = y(0) == a; V = odeToVectorField(eqn,cond)
V =
Y[2]
xЧтобы решить получившуюся систему дифференциальных уравнений первого порядка, сгенерируйте указатель функции MATLAB с помощью matlabFunction с V как вход. Затем используйте сгенерированный указатель функции MATLAB в качестве входа для MATLAB числовой решатель ode23 или ode45.
odeToVectorField может преобразовать только квазилинейные дифференциальные уравнения. Таким образом, производные самого высокого порядка должны появиться линейно. Например, odeToVectorField может преобразовать y *y ″ (t) = –t2, потому что это может быть переписано как y ″ (t) = –t2/y. Однако это не может преобразовать y ″ (t) 2 = –t2 или sin (y ″ (t)) = –t2.
Преобразовывать дифференциальное уравнение th-порядка n
в систему дифференциальных уравнений первого порядка odetovectorfield делает эти замены.
Используя новые переменные, это переписывает уравнение как систему дифференциальных уравнений первого порядка n:
odeToVectorField возвращает правые стороны этих уравнений как элементы векторного V и замен, сделанных как второй вывод S.
dsolve | matlabFunction | ode23 | ode45