using Plots, Polynomials
输入数据
X = [-2.2, -1.0, 0.01, 1.0, 2.0, 3.3, 2.21]
Y = [17.1, 7.3, 1.1, 2.0, 17.1, 23.1, 19.3]
拉格朗日插值函数(带误差估计)
function lagranzi(X, Y, x, M=1)
n = length(X)
p = Polynomial(0.0)
basis = Vector{Polynomial}(undef, n)
# 计算基函数
for i in 1:n
ℓ = Polynomial(1.0)
for j in 1:n
if j != i
ℓ = ℓ * Polynomial([-X[j], 1.0]) / (X[i] - X[j])
end
end
basis[i] = ℓ
p += Y[i] * ℓ
end
# 误差估计
y = p.(x)
R = M * prod.(Ref(x .- X)) / factorial(n)
return y, R
end
生成测试点
x_test = range(-3, 4, length=50)
y_pred, R = lagranzi(X, Y, x_test)
绘制结果
plt = plot(x_test, y_pred, ribbon=R, fillalpha=0.2,
label="插值曲线±误差", color=:green)
scatter!(plt, X, Y, label="样本点", color=:red)
添加已知多项式曲线
x_fine = -3:0.01:4
L = @. 0.21x_fine^6 - 0.87x_fine^5 - 1.21x_fine^4 +
5.9x_fine^3 + 4.48x_fine^2 - 7.68x_fine + 1.18
plot!(plt, x_fine, L, label="理论多项式", linestyle=:dash)
单点预测示例
x_point = 2.8
y_point, R_point = lagranzi(X, Y, [x_point])
annotate!(plt, x_point, y_point[1], text("f($x_point)≈$(round(y_point[1],digits=2))", 8))
保存图像
savefig(plt, "figure_2-1.png")
display(plt)
