首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mathematica - Find Maximum value NDSolve Plot

Mathematica - Find Maximum value NDSolve Plot
EN

Stack Overflow用户
提问于 2010-12-24 01:13:18
回答 2查看 3.8K关注 0票数 3

在数值求解微分方程并绘制结果后,我想确定绘制范围内的单个最大值,但不知道如何确定。

下面的代码用于数值求解微分方程并绘制结果。

代码语言:javascript
复制
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]

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-24 05:08:40

使用NMaximize

第一近似值:

代码语言:javascript
复制
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}}  

因为你的函数是一个快速振荡,就像这样:

,它不能捕获实际的最大值,如下所示:

代码语言:javascript
复制
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}}]

因此,我们对边界进行了优化,并对NMaximize函数进行了一些调整:

代码语言:javascript
复制
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}}  

它未能在所要求的精度内收敛,但现在结果已经足够好了

代码语言:javascript
复制
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}}]

票数 4
EN

Stack Overflow用户

发布于 2010-12-24 04:29:37

您可以使用ReapSow从任何评估中提取一个值列表。对于简单的Plot,您将Sow正在绘制的函数的值,并将整个绘图包含在Reap

代码语言:javascript
复制
list = Reap[
          Plot[Sow@Evaluate[x[t] /. s], {t, 0, 1000}, 
          Frame -> {True, True, False, False},
          FrameLabel -> {"t", "x"}, 
          FrameStyle -> Directive[FontSize -> 15],
          Axes -> False]];

list的第一个元素是绘图本身,第二个元素是绘图中使用的x值Mathematica的列表。要获得最大值,请执行以下操作:

代码语言:javascript
复制
In[1]  := Max[lst[[2, 1]]]
Out[1] := 1.26191
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4520952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档