我有以下工作的Sage代码。
P和P2是对desolve_system的两次调用的结果(恰好是一组两个一阶微分方程,所以它是三列的列表),然后我定义了两个列表
Q=[[i,k] for i,j,k in P]
Q2=[[i,k] for i,j,k in P2]
抓取P和P2中的第一列和最后一列。然后我在两个列表的点之间进行插值:
intP=spline(Q)
intP2=spline(Q2)
然后我可以在同一块情节中绘制这些东西:
plot(intP,0,15)+plot(intP2,0,15)
这一切都很好,情节看起来很完美。现在我想绘制两个样条曲线差异的绝对值。我尝试过像
这样的事情plot(abs(intP-intP2),0,15)
但我得到的错误是“ - ”不是splines的有效命令。所以有人可以给我以下两件事之一:
1)减去样条曲线的方法
2)减去这两个列表的方法,所以我可以得到另一个列表,然后我可以应用样条曲线。像
这样的东西Q3=[[i,Q[j]-Q2[j]] for i,j in Q,Q2]
(这不起作用,因为我引用了列表索引和值)
答案 0 :(得分:1)
实际上,您无法减去样条线对象。但是您可以定义一个函数来返回它们的值的差异,并绘制该函数。在绘制它时,最简单的方法是将它定义为lambda函数:
plot(lambda x: intP(x)-intP2(x), 0, 15)
(或plot(lambda x: abs(intP(x)-intP2(x)), 0, 15)
如果你想要绝对值。)
如果您需要在多个地方使用此差异,请将其定义为命名函数:
def spline_difference(x):
return intP(x)-intP2(x)
我认为这仅适用于两个数组的插值节点(自变量的值)相同的情况。如果您使用desolve_system_rk4
在具有相同步长的相同时间间隔内解决ODE系统,那么它们就是。在这种情况下,您可以使用map
方法获取差值:
Qdiff = map(lambda x,y: (x[0], x[1]-y[1]), P, P2)
这处理列表P和P2,从P获取自变量以及y值的差异。然后你可以构建spline(Qdiff)
并绘制它。 (备注:我使用元组而不是列表来保存一对坐标,这更符合语义,但spline
接受任何一种情况。)
如果两个列表P和P2具有不同的自变量值,那么您需要进行插值以便再次进行减法然后进行插值,这似乎是次优的。在这种情况下,我只是采用“减去样条”的方法。