【问题标题】:Subtract two splines in Sage在 Sage 中减去两条样条曲线
【发布时间】:2016-02-19 08:02:14
【问题描述】:

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

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

【问题讨论】:

    标签: interpolation ode sage


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      相关资源
      最近更新 更多