题目
思路
公式:
牛顿前插公式
牛顿后插公式
尽量方法一般化,而不是针对某个题目
应该有更简单的方法,但是我没有查资料,直接就上手了
(就这写了好久,脑壳疼,不说了)
代码
# 牛顿前插后插公式
import numpy as np
xs = [0.0, 0.2, 0.4, 0.6, 0.8]
h = 0.2
ys = [[ '*' for i in range(len(xs)) ] for j in range(len(xs))]
ys[0] = [1.00000, 1.22140, 1.49182, 1.82212, 2.22554]
# 差分
def chf(y):
l = len(y[0])
try:
for i in range( 1 , l ):
for j in range( 0 , l-i ):
# print("i,j:",i,',',j,)
y[i][j] = y[i-1][j+1] - y[i-1][j]
except Exception as err:
print(err)
def jiech(n):
ans = 1
for i in range(1, n+1):
ans *= i
return ans
# 前插
def prech(x):
t = (x-xs[0]) / h
print("前插--t:",t)
def pret_jiech(n):
ans = 1
if(n==0):
# print("n:",n)
return ans
else:
for i in range(n):
# print("n:",n,'t-i:',t-i,)
ans *= (t-i)
# print('\n')
return ans / jiech(n)
result = 0
for k in range(len(xs)):
result += ys[k][0] * pret_jiech(k)
print("加项------",ys[k][0] ,' * ', pret_jiech(k))
print("前插--结果:",result)
return result
# 后插
def backch(x):
t = (x-xs[-1]) / h
print("后插--t:",t)
def backt_jiech(n):
ans = 1
if(n==0):
# print("n:",n)
return ans
else:
for i in range(n):
# print("n:",n,'t-i:',t-i,)
ans *= (t+i)
# print('\n')
return ans / jiech(n)
result = 0
l = len(xs)
for k in range(l):
result += ys[k][l-k-1] * backt_jiech(k) # 下标可以是:[k][-k-1]或者[k][len(xs)-k-1]
print("加项------",ys[k][l-k-1] ,' * ', backt_jiech(k))
print("后插--结果:",result)
return result
def main():
# 建立差分表
chf(ys)
for i in range(len(ys[0])):
print(ys[i])
print("\n转置:")
print(np.transpose(ys))
# 前插
prech(0.05)
# 后插
backch(0.75)
main()
效果