在Sage中减去两个样条曲线

时间:2016-02-17 22:27:07

标签: interpolation ode sage

我有以下工作的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]

(这不起作用,因为我引用了列表索引和值)

1 个答案:

答案 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具有不同的自变量值,那么您需要进行插值以便再次进行减法然后进行插值,这似乎是次优的。在这种情况下,我只是采用“减去样条”的方法。