Wolfram mathematica 如何仅从BodePlot图中提取数据点?
我正在尝试修复BodePlot的相位图部分,因为它没有正确包装。我也没有办法告诉它包装 因此,与其自己做完整的绘图,(如果有必要的话,我可以这样做)我想先做一个BodePlot,抓取数据点,对数据进行包装(一旦我得到x,y数据,其余的都很容易),然后我需要将新的点列表放回绘图中,然后使用Show来显示它 我被困的部分是从FullForm中提取点。我找不到正确的模式来做那件事 这就是我到目前为止要说的:Wolfram mathematica 如何仅从BodePlot图中提取数据点?,wolfram-mathematica,Wolfram Mathematica,我正在尝试修复BodePlot的相位图部分,因为它没有正确包装。我也没有办法告诉它包装 因此,与其自己做完整的绘图,(如果有必要的话,我可以这样做)我想先做一个BodePlot,抓取数据点,对数据进行包装(一旦我得到x,y数据,其余的都很容易),然后我需要将新的点列表放回绘图中,然后使用Show来显示它 我被困的部分是从FullForm中提取点。我找不到正确的模式来做那件事 这就是我到目前为止要说的: hz=z/(z^2-z+0.3); tf=TransferFunctionModel[hz,z
hz=z/(z^2-z+0.3);
tf=TransferFunctionModel[hz,z,SamplingPeriod->2];
phasePlot=BodePlot[tf,{0.001,2 Pi},
ScalingFunctions->{Automatic,{"Linear","Degree"}},PlotLayout->"List"][[2]]
您可以看到它是如何不以180度角缠绕的。在dsp中更常见的是Bode相位图。下面是它“应该”的样子:
这就是我所做的:
FullForm[phasePlot]
Graphics[List[
List[List[], List[],
List[Hue[0.67, 0.6, 0.6],
Line[List[List[0.0010000243495554542, -0.2673870119911639],
List[0.0013659538057574799, -0.36521403872250247],
List[0.0017318832619595053, -0.46304207336414027],
....
我在那里看到了数据(x,y),但是如何提取它们呢?我试过这个:
Cases[FullForm[phasePlot], List[x_, y_] -> {x, y}, Infinity];
但是上面的匹配除了点列表之外,其他我不需要的东西。
我尝试了很多其他的方法,但只能得到一系列的要点
我想知道是否有人知道如何从上面的图中只提取(x,y)点。除了使用FullForm,还有更好的方法吗
谢谢
更新:
我刚刚找到一篇文章,展示了如何从绘图中提取数据。所以我用了它:
points = Cases[Normal@phasePlot, Line[pts_] -> pts, Infinity]
例如,您可以尝试嵌套替换规则
phase2 = phasePlot /.
Line[a_] :> (Line[a] /. {x_?NumericQ, y_?NumericQ} :> {x, Mod[y, 360, -180]});
Show[phase2, PlotRange -> {Automatic, {-180, 180}}, FrameTicks -> Automatic]
输出:
您要查找的列表似乎被
行[]
环绕,这似乎是绘图中的唯一情况。所以你可以用
Cases[phasePlot, Line[list_] :> list, Infinity]
编辑:
当我发布我的回复时,页面刷新了,我看到你正好看到了我的建议。无论如何,我会把我的回复贴在这里
编辑2:
Szabolics指出,
FullForm[]
无效,因此我将其从我的原始帖子中删除。FullForm
用于打印带有特殊格式的表达式,在这种情况下它没有任何用处。您可能需要Normal
来扩展任何GraphicsComplex
对象。澄清一下:通常,FullForm
或任何*Form
函数都不会对表达式进行任何结构修改。它们只会影响打印的方式。您看到的和内核看到的并不总是相同的。@Szabolics。感谢您对FullForm
的澄清。我现在把它从我的帖子中删除了。我想你是误解了FullForm
。见我对大卫回答的评论。(我刚刚注意到你在问题中也使用了FullForm
)我没有Mma 8,所以我不知道BodePlot。然而,Andrew Moylan(参见)指出,EvaluationMonitor
,连同Sow/Reap,可用于从绘图
中“干净地”提取数据点。这可能很有用。例如,以下计算结果为True<代码>排序/@Last@eaw[Plot[Sin[x],{x,0,4pi},EvaluationMonitor:>Sow[{x,Sin[x]}]==Cases[Plot[Sin[x],{x,0,4pi}],x_行:>First@x,无穷大]