matlab实现数值分析 的 二次插值+拉格朗日插值
(拉格朗日插值性能分析)
- 优点:
运算量小,不涉及矩阵运算; 格式整齐、规范。 - 缺点:
没有承袭性质:当插值点增/减时, 要重新计算所有的基 函数。
1、均差
二阶均差用到了一阶均差的结果,三阶均差用到了二阶均差的结 果,均差具有承袭性质。
通式:
均差的性质1:节点对称性
若{i0, i1, · · · , ik}为{0, 1, · · · , k}的任一排列,则: f[x0, x1, · · · , xk] = f[xi0
, xi1 , · · · , xik ] 均差的值只与节点有关,与节点的顺序无关,即:每个节点在均
差中的作用和地位是平等的。
均差的性质2:线性组合
均差的性质3:多项式的阶次
若f(x)为m次 多 项 式 , 则f[x0, x1, · · · , xk-1, x]为(m-k)次 多 项 式,m ≥ k
2、拉格朗日形式 vs. 牛顿形式
3、代码实现n次牛顿插值
算法中间的g[j]=(g[j]-g[j-1])/(xj-xj-1)应为
g[j] = (g[j] - g[j - 1]) / (X[j] - X[j-k])
来自老师发的课件,然后是有点小问题
参考视频:牛顿插值(Newton插值)速懂
https://haokan.baidu.com/v?pd=wisenatural&vid=5502744134413524450
4、python代码实现
函数及均差表
def myNewTonInterpolation(u, time):
X = [0.4, 0.55, 0.65, 0.80, 0.90, 1.05]
Y = [0.41075, 0.57815, 0.69675, 0.88811, 1.02652, 1.25382]
g = [0] * len(Y)
g = meanDeviation(g, X, Y, time)
totalNum = time+1
fu = Y[0]
for i in range(1, totalNum):
t = 1
for K in range(0, i):
t = t * (u - X[K])
fu = fu + t * g[i]
print("n次插值多项式近视值为 ", fu)
# 截断误差
g = meanDeviation(g, X, Y, time+1)
Rn = g[-1]
t = 1
for i in range(len(g)):
t = t * (u - X[i])
Rn = Rn * t
print("截断误差%.9f" % (abs(Rn)))
def meanDeviation(g, X, Y, time):
totalNum = len(g)
# initial
for i in range(totalNum):
g[i] = Y[i]
# 计算k阶均差
for k in range(1, time+1):
for j in range(totalNum - 1, k - 1, -1):
g[j] = (g[j] - g[j - 1]) / (X[j] - X[j-k])
print(k, "阶均差表", g)
return g
def main():
myNewTonInterpolation(0.596,4)
main()