三次样条插值实现

时间:2018-11-13 00:55:22

标签: python numpy

在以下代码中,我正在尝试实现以下

  • 编写一个函数naturalSpline,以自然边界条件实现三次样条插值
  • 使用三对角线求解器求解一阶导数的出现的三对角线系统。
  • 该函数的原型应为yy = naturalSpline(x,y,xx),其中(x,y)是输入点和数据,而xx是应插入数据的点。

我首先想到从第二个要点开始,创建三对角线求解器。所以这只是托马斯算法。我花了一些时间来创建代码的这一部分,并在下面对其进行了格式化。但是现在我试图完成第一个和第三个要点,但是我不确定如何使用已经完成的工作来完成这些任务。寻找一些帮助!预先感谢。

import numpy as np
def TDMA(a,b,c,d):
    n = len(d)
    w= np.zeros(n-1,float)
    g= np.zeros(n, float)
    p = np.zeros(n,float)

    w[0] = c[0]/b[0]
    g[0] = d[0]/b[0]

    for i in range(1,n-1):
        w[i] = c[i]/(b[i] - a[i-1]*w[i-1])
    for i in range(1,n):
        g[i] = (d[i] - a[i-1]*g[i-1])/(b[i] - a[i-1]*w[i-1])
    p[n-1] = g[n-1]
    for i in range(n-1,0,-1):
        p[i-1] = g[i-1] - w[i-1]*p[i]
    return p
A = np.array([[10,2,0,0],[3,10,4,0],[0,1,7,5],   [0,0,3,4]],dtype=float)   
a = np.array([3.,1,3]) 
b = np.array([10.,10.,7.,4.])
c = np.array([2.,4.,5.])
d = np.array([3,4,5,6.])
print (TDMA(a, b, c, d))

给出正确的输出,我什至对np.linalg.solve(a,b,c,d)进行了测试,以确保输出正确

[ 0.14877589  0.75612053 -1.00188324  2.25141243]

1 个答案:

答案 0 :(得分:0)

对于每个间隔[x_k,x_(k + 1)],您可以求解四个方程式

  1. p_k(x_k)= f(x_k)= y_k
  2. p_k'(x_k)= f'(x_k)= d_k
  3. p_k(x_(k + 1))= f(x_(k + 1))= y_(k + 1)
  4. p_k'(x_(k + 1))= f'(x_(k + 1))= d_(k + 1)

(在不检查您的代码的情况下,我认为这是您所做的)。 由此,您可以构建一个字典

{'polynomials': [ [a_0, ..., d_0], ..., [a_24, ..., d_24] ],
 'knots': [x_0, ..., x_24]}

对于250个点中的每个x,您要检查点x在[x_k,x_(k + 1)]区间中的哪个k,并评估p_k(x)。

所有这些都是直接的数学和python编码。如果不清楚,最好还是对这两个领域有更多了解,而不要在此网站上获得专业建议。