在以下代码中,我正在尝试实现以下
我首先想到从第二个要点开始,创建三对角线求解器。所以这只是托马斯算法。我花了一些时间来创建代码的这一部分,并在下面对其进行了格式化。但是现在我试图完成第一个和第三个要点,但是我不确定如何使用已经完成的工作来完成这些任务。寻找一些帮助!预先感谢。
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]
答案 0 :(得分:0)
对于每个间隔[x_k,x_(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编码。如果不清楚,最好还是对这两个领域有更多了解,而不要在此网站上获得专业建议。