在求解微分方程和绘制速度作为强制项大小的函数时需要帮助

Posted

技术标签:

【中文标题】在求解微分方程和绘制速度作为强制项大小的函数时需要帮助【英文标题】:Need help with solving differential equation and plotting velocity as a function of forcing term magnitude 【发布时间】:2011-05-16 17:45:14 【问题描述】:

我需要一些帮助来绘制数学上的混沌振荡器的速度与强制项图。

基本上,我必须解决以下微分方程

x''[t] + b x'[t] - x[t] + x[t]^3 - f Cos[w t] == 0, x'[0] == 0, 
 x[0] == 0

并在区间 [0,1000] 中以 2*Pi 为增量绘制我的解的速度 对于不同的 f 值。

也就是说,对于区间 [0,2] 中的每个 f(以 0.05 为增量),我将有大约 150 个速度点,并且我必须将所有这些点绘制在一张图上。

我虽然关于使用 do 循环并想出了类似的东西

Remove["Global`*"]

b = .1;
w = 1;
Period = 1;
tstep = 2 Pi/Period;

Do[Do[data = 
     Table[Flatten[
       Evaluate[f, 
         x'[t] /. 
          NDSolve[x''[t] + b x'[t] - x[t] + x[t]^3 - f Cos[w t] == 0,
             x'[0] == 0, x[0] == 0, x[t], t, 0, 1000, 
           MaxSteps -> 59999]]], t, 0, 1000, tstep], t, 0, 1000, 
    1], f, 0, 2, .1]

但没有运气。

我该怎么做?

【问题讨论】:

请允许我欢迎您来到 ***,并提醒我们通常在这里做的三件事:1) 当您获得帮助时,请尝试在您的专业领域中回答问题 2)Read the FAQs 3)当你看到好的问答时,给他们投票using the gray triangles,因为系统的可信度是基于用户通过分享他们的知识而获得的声誉。还记得接受更好地解决您的问题的答案,如果有的话,by pressing the checkmark sign 您的替换规则x'[t] /. NDSolve[...] 将不起作用,因为NDSolve 返回x[t] -> ...,但x'[t] 内部具有Derivative[1][x][t] 的形式,这是非常不同的。 (您可以使用FullForm 自行检查。)替换规则完全替换您告诉它的形式,并且可能需要付出很多努力才能让它们进行任何超出基本的转换。这符合基本要求。在这些情况下,FullFormMatchQ 对于确定什么可行和不可行是必不可少的。 收到答复后,您不应该删除您的问题。我已经回滚了您上次执行此操作的编辑。 FP,您的更新只是为了澄清问题,还是希望得到修改后的答案? 【参考方案1】:

这是你想要的吗?

b = .1;
w = 1;

sol := f, 
  NDSolve[x''[t] + b x'[t] - x[t] + x[t]^3 - f Cos[w t] == 0, 
     x'[0] == 0, x[0] == 0, x[t], t, 0, 1000, MaxSteps -> 59999][[1, 1, 2]]

interpsols = Table[sol, f, 0, 2, 0.1];

ListPlot[Table[interpsols, t, 0, 1000, 2 Pi]]

解释

首先,让我关注sol。这与您自己的代码很接近(有更改),但为了清晰起见进行了重构,而不是隐藏在循环中。

sol := 等价于 SetDelayed[sol, ... 这包含在右侧给出的未评估定义 因此,NDSolve 操作直到在某处使用 sol 后才会执行

我所做的更改是从NDSolve的结果中提取这部分:

InterpolatingFunction[0.,1000.,<>][t]

我用Part 做这个:NDSolve[...][[1, 1, 2]]

也可以通过x[t] /. First @ NDSolve[...]完成

这个提取的部分与列表中f 的当前值配对:f, NDSolve[ ... ,以便以后可以绘制它们。

现在:

interpsols = Table[sol, f, 0, 2, 0.1];

在全局更改f 的值时,构建sol 的更改值表。这是执行 NDSolve 的地方。

结果是f的每个值的一系列解决方案,格式如下:

0.,InterpolatingFunction[0.,1000.,<>][t],
 0.1,InterpolatingFunction[0.,1000.,<>][t],
 0.2,InterpolatingFunction[0.,1000.,<>][t],
 0.3,InterpolatingFunction[0.,1000.,<>][t],
 0.4,InterpolatingFunction[0.,1000.,<>][t]
 ...

最后:

ListPlot[Table[interpsols, t, 0, 1000, 2 Pi]]

通过评估上面为tListPlots 的全局变化值创建的整个系列结果来创建一个表。

我还有几件事想说,但我没时间了。我会在几个小时后进行进一步的编辑。

【讨论】:

是的,我认为这解决了我的问题。非常感谢!它是如何工作的? 为了纪念他的绰号,巫师先生应该回答-“这很神奇”- 哈哈,是的 还有,为什么点的颜色不一样?是不是因为它们对应的t值相同但f值不同? 两个尼特:f 应该增加 0.05 并且 OP 询问速度。通过在 NDSolve 前面添加 D[#, t]&amp;@ 可以轻松修复第二个 nit。否则,应该可以工作。 哦,我想我明白了,您的 D[#, t]&@ 迭代告诉 Mathematica 对每个 t 值取 NDSolve 解的导数,从而给我每个点的速度。另外,如果我做一个列表线图,我可以看到我的系统对于每个 f 值是如何随时间变化的,因为每条不同的线对应于一组具有相同 f 值但不同时间值的点,对吧?

以上是关于在求解微分方程和绘制速度作为强制项大小的函数时需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

如何用ode45求解matlab中的耦合微分方程

矩阵指数函数与常微分方程组求解

matlab微分方程的解?

matlab 求解一个含参数方程代码

matlab-非线性方程求根函数及函数曲线绘制

时滞微分方程求解之三ddesd--变时滞