Nas*_*ser 6 wolfram-mathematica
我正在尝试修复BodePlot的Phase plot部分,因为它没有正确包装.我没有选择告诉它包装.
所以,而不是自己做完整的情节,(我可以这样做,如果我必须)我想首先制作BodePlot,抓住数据点,对数据进行包装(一旦我得到x,y数据,其余的很简单),然后我需要将新的点列表放回到图中,然后使用Show来显示它.
我坚持的部分是从FullForm中提取点.我无法得到正确的模式来做到这一点.
这就是我到目前为止所做的事情:
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]]
Run Code Online (Sandbox Code Playgroud)

你看它怎么不包裹在180度.在博士阶段情节包装中,在dsp中更为常见.这是'应该'的样子:

所以,这就是我做的:
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],
....
Run Code Online (Sandbox Code Playgroud)
我看到那里的数据(x,y)但是如何将它们拉出来?我试过这个:
Cases[FullForm[phasePlot], List[x_, y_] -> {x, y}, Infinity];
Run Code Online (Sandbox Code Playgroud)
但上面的匹配除了点列表,其他我不需要的东西.我尝试了很多其他的东西,但不能只得到点列表.
我想知道是否有人知道如何从上面的图中仅拉出(x,y)点.除了使用FullForm之外,还有更好的方法吗?
谢谢
更新:
我在这里找到一篇文章,展示如何从绘图中提取数据.所以我用它:
points = Cases[Normal@phasePlot, Line[pts_] -> pts, Infinity]
Run Code Online (Sandbox Code Playgroud)
例如,您可以尝试嵌套替换规则
phase2 = phasePlot /.
Line[a_] :> (Line[a] /. {x_?NumericQ, y_?NumericQ} :> {x, Mod[y, 360, -180]});
Show[phase2, PlotRange -> {Automatic, {-180, 180}}, FrameTicks -> Automatic]
Run Code Online (Sandbox Code Playgroud)
输出:
