解释 dsolve 输出以与 ODE45 [MATLAB] 一起使用
Interpereting dsolve output to use with ODE45 [MATLAB]
我一直在尝试使用这个 1 求解二阶微分方程,
但是我做错了,在网上找不到任何有用的东西,但我相信我已经取得了进步。
我用了dsolve;
syms x(t) v(t) fi(t)
[x(t), v(t)] = dsolve(diff(x) == v, diff(v) == fi/m, x(0) == [-L, -L], v(0) == [5, 10] )
这给了我;
x(t) =
int(fi(x)/5, x, 0, t, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true) - 5
v(t) =
C2 + t*(int(fi(x)/5, x, 0, t, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true) - 5) + int(-(x*fi(x))/5, x, 0, t, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true)
现在我需要帮助解释结果,我想知道我是否可以使用这个结果从 ode45 中得到一些东西?我还想将解决方案绘制为参考轨迹,以模拟 500 个粒子在力场中移动。
使用 ODE45:
function dxdt = solution(t,y0)
frprintf('Second stop')
.....
dxdt = [x, v]
end
从主文件调用:
t:dt:t_f
y0 = [x0,v0]
fprintf('first stop')
[x, v] = ode45(@solution, y0, t)
我已经设置好了,如果代码 运行 顺利,它会打印 "first stop, second stop, third stop" 和 "fourth stop",它只打印第一站,这就是我得到的地方错误。
假设你在某处定义
function F = fi(t)
F = ...
end
您将 ODE 函数定义为(使用 m
作为全局变量)
function doty = odefunc(t,y)
doty = [ y(2); fi(t)/m ]
end
并致电
t = t0:dt:tf
y0 = [ x0, v0 ]
t,y = ode45(odefunc, t, y0)
plot( t, y(:,1) )
通常,向量 y
将包含系统中所有粒子或对象的相位 space(位置和 velocity/impulse)中的一个点。在 odefunc
中,您将在时间 t
计算此特定相位 space 点的力,并从该点组成相位 space 点的导数矢量。
例如,在 3D 模拟中,您可以安排 y(6*(k-1)+1:6*(k-1)+3)
是粒子的位置,k
和 y(6*(k-1)+4:6*(k-1)+6)
是速度矢量。或者您可以将位置和速度分开,其中 y(3*(k-1)+1:3*(k-1)+3)
表示位置,y(3*(N+k-1)+1:3*(N+k-1)+3)
表示第 k
个 N
粒子的速度。
我一直在尝试使用这个 1 求解二阶微分方程, 但是我做错了,在网上找不到任何有用的东西,但我相信我已经取得了进步。
我用了dsolve;
syms x(t) v(t) fi(t)
[x(t), v(t)] = dsolve(diff(x) == v, diff(v) == fi/m, x(0) == [-L, -L], v(0) == [5, 10] )
这给了我;
x(t) =
int(fi(x)/5, x, 0, t, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true) - 5
v(t) =
C2 + t*(int(fi(x)/5, x, 0, t, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true) - 5) + int(-(x*fi(x))/5, x, 0, t, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true)
现在我需要帮助解释结果,我想知道我是否可以使用这个结果从 ode45 中得到一些东西?我还想将解决方案绘制为参考轨迹,以模拟 500 个粒子在力场中移动。
使用 ODE45:
function dxdt = solution(t,y0)
frprintf('Second stop')
.....
dxdt = [x, v]
end
从主文件调用:
t:dt:t_f
y0 = [x0,v0]
fprintf('first stop')
[x, v] = ode45(@solution, y0, t)
我已经设置好了,如果代码 运行 顺利,它会打印 "first stop, second stop, third stop" 和 "fourth stop",它只打印第一站,这就是我得到的地方错误。
假设你在某处定义
function F = fi(t)
F = ...
end
您将 ODE 函数定义为(使用 m
作为全局变量)
function doty = odefunc(t,y)
doty = [ y(2); fi(t)/m ]
end
并致电
t = t0:dt:tf
y0 = [ x0, v0 ]
t,y = ode45(odefunc, t, y0)
plot( t, y(:,1) )
通常,向量 y
将包含系统中所有粒子或对象的相位 space(位置和 velocity/impulse)中的一个点。在 odefunc
中,您将在时间 t
计算此特定相位 space 点的力,并从该点组成相位 space 点的导数矢量。
例如,在 3D 模拟中,您可以安排 y(6*(k-1)+1:6*(k-1)+3)
是粒子的位置,k
和 y(6*(k-1)+4:6*(k-1)+6)
是速度矢量。或者您可以将位置和速度分开,其中 y(3*(k-1)+1:3*(k-1)+3)
表示位置,y(3*(N+k-1)+1:3*(N+k-1)+3)
表示第 k
个 N
粒子的速度。