2010-12-23 139 views
3

數值求解微分方程並繪製結果後,我想確定繪圖範圍內的單個最大值,但不知道如何。Mathematica - 查找最大值NDSolve曲線

以下代碼適用於數值求解微分方程並繪製結果。

s = NDSolve[{x''[t] + x[t] - 0.167 x[t]^3 == 0.005 Cos[t + -0.0000977162*t^2/2], x[0] == 0, x'[0] == 0}, x, {t, 0, 1000}] 

Plot[Evaluate[x[t] /. s], {t, 0, 1000}, 
Frame -> {True, True, False, False}, FrameLabel -> {"t", "x"}, FrameStyle -> Directive[FontSize -> 15], Axes -> False] 

Mathematica graphics

+0

請允許我歡迎您來到Stack Overflow,並記住我們通常在這裏做的三件事:1)當您收到幫助時,請嘗試t o也給予答案**在您的專業領域回答問題** 2)**閱讀常見問題解答!! ** 3)當您看到好的問題和答案時,請使用灰色三角形**作爲可信度系統的基礎是用戶通過分享知識獲得的聲譽。還請記住接受更好地解決您的問題的答案,如果有的話,**按複選標記** http://i.imgur.com/uqJeW.png – 2010-12-27 01:54:20

回答

4

使用NMaximize

第一近似:

s = NDSolve[{x''[t] + x[t] - 0.167 x[t]^3 == 
      0.005 Cos[t + -0.0000977162*t^2/2], x[0] == 0, x'[0] == 0}, x[t], 
      {t, 0, 1000}] 
NMaximize[{Evaluate[x[t] /. s[[1]]] , 100 < t < 1000}, t] 

{1.26625, {t -> 821.674}} 

由於你的函數是一種快速振盪是這樣的:alt text,它並沒有趕上真正的最大值,如下所示:

Plot[{1.26625, Evaluate[x[t] /. s[[1]]]}, {t, 790, 830}, 
Frame -> {True, True, False, False}, FrameLabel -> {"t", "x"}, 
FrameStyle -> Directive[FontSize -> 15], Axes -> False, 
PlotRange -> {{790, 830}, {1.25, 1.27}}] 

alt text

所以我們完善我們的邊界,並調整了一點NMaximize功能:

NMaximize[{Evaluate[x[t] /. s[[1]]] , 814 < t < 816}, t, 
AccuracyGoal -> 20, PrecisionGoal -> 18, MaxIterations -> 1000] 

NMaximize::cvmit: Failed to converge to the requested accuracy or 
        precision within 1000 iterations. >> 

{1.26753, {t -> 814.653}} 

它沒有要求的精度內收斂,但現在的結果已經足夠好

Plot[{1.2675307922753962`, Evaluate[x[t] /. s[[1]]]}, {t, 790, 830}, 
Frame -> {True, True, False, False}, FrameLabel -> {"t", "x"}, 
FrameStyle -> Directive[FontSize -> 15], Axes -> False, 
PlotRange -> {{790, 830}, {1.25, 1.27}}] 

alt text

3

您可以使用ReapSow從任何評價中提取值的列表。對於一個簡單的Plot你會Sow你繪製函數的值和包圍在一個Reap整個劇情:

list = Reap[ 
      Plot[[email protected][x[t] /. s], {t, 0, 1000}, 
      Frame -> {True, True, False, False}, 
      FrameLabel -> {"t", "x"}, 
      FrameStyle -> Directive[FontSize -> 15], 
      Axes -> False]]; 

list的第一個元素是情節本身,第二個元素是x軸的列表在繪圖中使用Mathematica值。以獲得最大的:

In[1] := Max[lst[[2, 1]]] 
Out[1] := 1.26191 
+0

我想在劇情[]中使用一些選項是可能的掃描深度衝突尖峯 – 2010-12-23 21:37:31

+0

此外,Sowed值位於實際最大值左邊的相鄰峯值... – 2010-12-23 22:49:48