Уменьшайте порядок дифференциальных уравнений к 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