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

时间:2011-05-16 17:45:15

标签: wolfram-mathematica

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

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

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

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

也就是说,对于区间[0,2]中的每个f(以.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 个答案:

答案 0 :(得分:2)

这样做你想要的吗?

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}];

构建一个sol变化值的表,因为它会全局更改f的值。这是执行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}]]

通过评估上面创建的整个系列结果来创建表格,以便全局更改tListPlot的值。

我想说的更多,但我没时间。我会在几个小时内进行进一步的编辑。