我一直试图用这个1来解决二阶微分方程, 然而,我无法做到正确,并没有发现任何有用的在线,但我相信我已经取得了进展。
我使用了 dsolve ;
Promise.bind()
给了我;
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] )
现在我需要帮助处理结果,我想知道我是否可以使用此结果来获取ode45的内容?此外,我想将解决方案绘制为参考轨迹,以模拟500个粒子穿过力场。
使用ODE45:
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)
从主文件调用:
function dxdt = solution(t,y0)
frprintf('Second stop')
.....
dxdt = [x, v]
end
我已将其设置为如果代码运行顺畅,则会打印"第一站,第二站,第三站"和#34;第四站",它只打印出第一站,那就是我得到错误的地方。
答案 0 :(得分:1)
假设你某处定义了
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
将包含系统中所有粒子或对象的相空间中的点(位置和速度/脉冲)。在odefunc
中,您将在t
时计算此特定相空间点的力,并将衍生矢量计算到相空间点。
例如,在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)
的{{1}} - k
粒子的速度分开。