互连dsolve输出以与ODE45 [MATLAB]一起使用

时间:2015-05-18 19:31:02

标签: matlab differential-equations dsolve

我一直试图用这个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;第四站",它只打印出第一站,那就是我得到错误的地方。

1 个答案:

答案 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粒子的速度分开。