【问题标题】:Interpereting dsolve output to use with ODE45 [MATLAB]解释 dsolve 输出以与 ODE45 [MATLAB] 一起使用
【发布时间】:2015-05-18 19:31:02
【问题描述】:

我一直在尝试使用此1 求解二阶微分方程, 但是我无法做到正确,并且在网上没有发现任何有用的信息,但我相信我已经取得了进展。

我用过解决

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)

我已经设置好了,如果代码运行顺利,它会打印“第一站,第二站,第三站”和“第四站”,它只打印出第一站,这就是我得到错误的地方。

【问题讨论】:

  • dsolveint 用于符号数学,主要用于获得解析解。 ode45 用于数值求解 ODE。这两件事彼此非常不同。你这里的符号方程是完全抽象的,所以你不应该期待任何解决方案。我建议你回去学习如何使用ode45。阅读文档(命令行窗口中的doc ode45)。试试这些例子。不要指望马上就能弄清楚。如果您遇到问题/疑问,请搜索此站点。如果您提出问题,请确保它是具体的。
  • 所以我真的不能将由此产生的任何东西放入 ode45 中吗?
  • 没有。我不明白这一点。 dsolve 旨在为您提供微分方程如果存在的解析解。它不能在这里存在,因为您已经根据抽象函数(没有定义的函数)fi 指定了所有内容。如果您想使用符号数学来帮助您推导ode45see this MathWorks blog post 的函数。

标签: matlab differential-equations dsolve


【解决方案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) 用于k-th of N 粒子的速度。

【讨论】:

  • 好的,让我们直说吧;我有我的脚本文件,我在其中运行模拟并计算每个时间步长对每个粒子的力,因此 F 没有函数,只有我计算它的一些行。在您的第二个示例中,这就是该功能的全部内容吗?至于调用它,我是从我的主脚本文件中调用的,是吗?
  • 不,您需要能够计算系统相空间中每个点的力。随后的导数向量是在 odefunc 中计算的。是的,对ode45 的调用在调用层次结构中比odefunc 更接近main。或包含在主文件中。您知道一个文件中可以有多个function ... end 块,命名和顶部函数仅对文件的自动加载很重要。
  • 仍然面临一些问题;我打这个电话:t = 0:0.001:t_f; x0 = [-5, -5]; v0 = [5, 10]; U = [x0,v0]; S = ode45(odefunc, t, U);' 'plot(t,S(:,1),'g.') xlabel('t'); ylabel('x'); 这个函数:function dxdt = odefunc(t,x) m = 1; dxdt_1 = fi; dxdt_2 = v0 + (t/m)*fi; dxdt = [dxdt_1; dxdt_2]; end,它说“未定义的函数或变量'odefunc'。” ://
  • 也许您需要将其提供为@odefunc。但是,解释odefunc 时可能会出错。另外,你得到dxdt_x = vdxdt_v = fi/modefunc 中没有v0。注意兼容的矩阵格式。
  • 我添加了@,但又出现了另一个错误;使用 feval Undefined function 'solution' for input arguments of type 'double'. Error in odearguments (line 87) f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0. Error in ode45 (line 113) [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ... Error in lab1script2d (line 119) [x,v] = ode45(@solution, t, y0); 时出错
猜你喜欢
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多