我需要為函式 exp(x) (f(x)) 撰寫拉格朗日多項式 (g(x)) 的多項式插值程式。
n = 10
x = []
y = []
def f(x):
return math.exp(x)
def lagranz(x, y, t):
z = 0
for j in range(len(y)):
p1 = 1
p2 = 1
for i in range(len(x)):
if i != j:
p1 *= (t - x[i])
p2 *= (x[j] - x[i])
z = z y[j] * p1 / p2
return z
# uniform grid
print('Равномерная сетка')
for i in range(1, n 1):
temp = -1 2 * (i - 1) / (n - 1)
x.append(temp)
y.append(f(temp))
ynew = [lagranz(x, y, i) for i in x]
# errors
print('#\tx\tf(x)\tg(x)\tпогрешность')
for i in range(0, n):
print(i, '\t', x[i], '\t', y[i], '\t', ynew[i], '\t', ynew[i]-y[i])
我需要調查錯誤行為。
增量 g(x) = g(x) - f(x)
但問題是在主節點中誤差為零。
而且我需要在更密集的網格上調查錯誤,但我不明白該怎么做。
uj5u.com熱心網友回復:
只需在其他地方計算插值的值
import math
def f(x):
return math.exp(x)
def lagranz(x, y, t):
z = 0
for j in range(len(y)):
p1 = 1
p2 = 1
for i in range(len(x)):
if i != j:
p1 *= (t - x[i])
p2 *= (x[j] - x[i])
z = z y[j] * p1 / p2
return z
# This is the grid where you *define* interpolant
n = 10
xnode = []
fnode = []
for i in range(1, n 1):
temp = -1 2 * (i - 1) / (n - 1)
xnode.append(temp)
fnode.append(f(temp))
# This is where you calculate interpolant values
# at arbitrary points, but *fixed* grid
xs = [0.5, 1.5, 3.0]
finter = [lagranz(xnode, fnode, x) for x in xs]
# Benchmark
for (x, y) in zip(xs, finter):
print(x, y, f(x), f(x) - y)
您還可以定義一個閉包以使插值的計算更清晰
finter = lambda x: lagranz(xnode, fnode, x)
for x in xs:
print(x, finter(x), f(x), finter(x) - f(x))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/451724.html
標籤:Python python-3.x 数学
上一篇:將位元串列分配到給定數量的槽中
