在 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" 方法。
我有以下有效的 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" 方法。