解释 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) 是粒子的位置,ky(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) 表示第 kN 粒子的速度。