mathematica 包络线检测 数据平滑
以下 Mathematica 代码生成高度振荡的图。我只想绘制绘图的下包络线,但不知道如何绘制。任何建议将不胜感激。
tk0 = \[Theta]'[t]*\[Theta]'[t] - \[Theta][t]*\[Theta]''[t]
tk1 = \[Theta]''[t]*\[Theta]''[t] - \[Theta]'[t]*\[Theta]'''[t]
a = tk0/Sqrt[tk1]
f = Sqrt[tk1/tk0]
s =
NDSolve[{\[Theta]''[t] + \[Theta][t] - 0.167 \[Theta][t]^3 ==
0.005 Cos[t - 0.5*0.00009*t^2], \[Theta][0] == 0, \[Theta]'[0] ==
0}, \[Theta], {t, 0, 1000}]
Plot[Evaluate [f /. s], {t, 0, 1000},
Frame -> {True, True, False, False},
FrameLabel -> {"t", "Frequency"},
FrameStyle -> Directive[FontSize -> 15], Axes -> False]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不知道你希望它看起来有多花哨,但这里有一个蛮力方法,对于我来说作为一个起点就足够好了,并且可能可以进一步调整:
发生的情况是你的振荡函数有一些非-琐碎的精细结构,需要很多点来解决。我们从 Plot by Reap - Sow 中收集这些点,然后过滤掉局部最小值。由于结构精细,我们需要做两次。你真正想要的情节存储在“env”中。正如我所说,如果需要的话,可能可以对其进行调整以获得更好质量的绘图。
编辑:
事实上,如果我们将 PlotPoints 的数量从 50000 增加到 200000,然后重复从 localMin 中删除局部最大值点,可以获得更好的绘图。请注意,它会运行速度较慢,并且需要更多内存。以下是更改:
编辑:这是绘图(作为
GraphicsGrid[{{env}, {Show[{plot, env}]}}]
完成)I don't know how fancy you want it to look, but here is a brute force approach which would be good enough for me as a starting point, and can probably be tweaked further:
What happens is that your oscillatory function has some non-trivial fine structure, and we need a lot of points to resolve it. We collect these points from Plot by Reap - Sow, and then filter out local minima. Because of the fine structure, we need to do it twice. The plot you actually want is stored in "env". As I said, it probably could be tweaked to get a better quality plot if needed.
Edit:
In fact, much better plot can be obtained, if we increase the number of PlotPoints from 50000 to 200000, and then repeatedly remove points of local maxima from localMin. Note that it will run slower and require more memory however. Here are the changes:
Edit: here is the plot (done as
GraphicsGrid[{{env}, {Show[{plot, env}]}}]
)一种基于图像的解决方案
我并不认为这个解决方案既不强大也不通用。但它又快又有趣。它使用图像变换来查找边缘(可能是因为函数的重振荡特性):
函数:
测试代码:
编辑
修复上面代码中的一个错误,结果更加准确:
。
。
An Image based solution
I don't claim this one neither robust nor general. But it's quick and fun. It uses Image Transformations to find the edges (possible because the heavy oscillatory character of your function):
Function:
Testing code:
Edit
Fixing a bug in the code above, the results are more accurate:
.
.