老规矩,原理什么的就不写了。
直接贴代码和实例演示,以下代码基于python和numpy。
什么是差商表?就用一张图解释。
差商表是求近似值的前一步,那这里实现求近似值吗?
答案是:现在不。
因为求近似值还要选择节点、代入迭代公式,虽然代码可以实现,但博主觉得“选择节点、代入迭代公式”这个要用代码实现,好像特别麻烦的样子,因为涉及决策的问题,所以还不如自己对照着代入更方便一点。
如果哪天突然觉得后者更麻烦,不排除用代码实现近似值的求解。
构建差商表
首先
import numpy as np
以下便是我定义的函数:
def csb(x,f,j):
f0=np.zeros((j+1,x.shape[0]))
if type(f) is np.ndarray:
f0[0]=f.copy()
else:
for i in range(x.shape[0]):
f0[0,i]=f(x[i])
for i in range(1,j+1):
for k in range(i,j+1):
f0[i,k]=(f0[i-1,k]-f0[i-1,k-1])/(x[k]-x[k-i])
f1=np.vstack([x,f0])
print('所求%d阶差商表如下所示' % j,'\n',f1.T)
return f1.T
参数说明
“x”是上图中第一列“xk”的值组成的数组。
“f”是上图中的第二列,输入的可以是确定值,也可以是函数,后面会具体演示两者有什么区别。
“j”是最大阶数,在上图中,最大阶数是3阶,那么“j”就是3。
实例运行
拿个实例运行一下,在这个实例中“f”是确定值。
x=np.array([-1,0,1,3])
f=np.array([4,-1,2,6])
csb(x,f,3)
得出以下结果:
所求3阶差商表如下所示
[[-1. 4. 0. 0. 0. ]
[ 0. -1. -5. 0. 0. ]
[ 1. 2. 3. 4. 0. ]
[ 3. 6. 2. -0.33333333 -1.08333333]]
这个数组对照着下图看就知道每一列数字代表着什么意思。
在上个实例中,“f”是确定值。下面再运行一个实例,其中的“f”是函数。
x=np.array([-1,0,1,3])
f=lambda x:x**2
csb(x,f,3)
得出以下结果:
所求3阶差商表如下所示
[[-1. 1. 0. 0. 0.]
[ 0. 0. -1. 0. 0.]
[ 1. 1. 1. 1. 0.]
[ 3. 9. 4. 1. 0.]]
求解近似值
待补充。
补充是不可能补充的,最近是不可能补充的,等忙完这一阵吧。