在 Sage 中减去两个样条

Subtract two splines in 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)

但我收到有关“-”不是样条的有效命令的错误。那么有人可以给我以下两件事之一吗:

1) 一种减去样条的方法

2) 一种减去这两个列表的方法,这样我就可以获得另一个列表,然后我可以对其应用样条曲线。像

Q3=[[i,Q[j]-Q2[j]] for i,j in Q,Q2]

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

减去样条

确实,您不能减去样条对象。但是您可以定义一个函数,该函数将 return 它们的值的差异,并绘制该函数。最简单的方法是在绘制时将其定义为 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有不同的自变量值,那么你需要插值以减去然后再次插值,这似乎不是最优的。在这种情况下,我将采用 "subtracting splines" 方法。