专栏
标签
求大神帮忙跑通
一般问题
发布于 2025-05-26 21:49:39
查看 45过去398天

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.9
x_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)

所属专栏:Syslab基础平台
产品信息:Syslab科学计算环境
MWORKS体验官

全部回答 2

发布于 2025-05-27 00:37:38

#可以试一下下面的代码,勉强能跑

只使用 TyPlot

using TyPlot, Polynomials

println("使用 TyPlot 进行绘图...")

数据

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 lagrange_interpolation(X, Y, x_eval)
n = length(X)
p = Polynomial(0.0)

for i in 1:n
    L_i = Polynomial(1.0)
    for j in 1:n
        if j != i
            numerator = Polynomial([-X[j], 1.0])
            denominator = X[i] - X[j]
            L_i = L_i * numerator / denominator
        end
    end
    p += Y[i] * L_i
end

return isa(x_eval, Number) ? p(x_eval) : p.(x_eval)

end

生成插值数据

x_range = collect(-3:0.1:4)
y_interp = lagrange_interpolation(X, Y, x_range)

使用 TyPlot 绘图

TyPlot.figure("拉格朗日插值", figsize=(10, 6))

绘制插值曲线

TyPlot.plot(x_range, y_interp, "g-", linewidth=2, label="插值曲线")

绘制原始数据点

TyPlot.plot(X, Y, "ro", markersize=8, label="原始数据")

计算特定点

x_test = 2.8
y_test = lagrange_interpolation(X, Y, x_test)
TyPlot.plot([x_test], [y_test], "bs", markersize=10, label="测试点")

添加标注

TyPlot.text(x_test + 0.2, y_test, "f($x_test)≈$(round(y_test, digits=2))")

设置图形属性

TyPlot.xlabel("x")
TyPlot.ylabel("y")
TyPlot.title("拉格朗日插值")
TyPlot.legend()
TyPlot.grid(true)

显示图形(不使用 show())

TyPlot.showfig()

println("绘图完成!")
println("在 x = $x_test 处的插值结果: y ≈ $(round(y_test, digits=4))")

发布于 2025-05-27 14:56:33

您好,Syslab目前不支持安装Plots库,建议您使用TyPlot库进行绘制。
对您的代码进行了修改,请您参考,效果如下图,如果与您预期结果不一致请反馈。

using Polynomials
X = collect([-2.2 -1.0 0.01 1.0 2.0 3.3 2.21])
Y = collect([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)
# 生成测试点
x_test = range(-3, 4, length=50)
y_pred, R = lagranzi(X, Y, x_test)
# 使用plt_fill,绘制置信区间
figure()
xconf = [x_test..., x_test[end:-1:1]...];
yconf = [y_pred .+ R..., y_pred[end:-1:1] .- R...];
p = plt_fill(xconf, yconf, "red");
plt_set(p, "facecolor", [1 0.8 0.8]);
plt_set(p, "edgecolor", "none");
hold("on");
# 绘制结果
plot(x_test,y_pred)

# 添加已知多项式曲线
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(x_fine,L,"r.")
# 单点预测示例
x_point = 2.8
y_point, R_point = lagranzi(X, Y, [x_point])
plot(x_point,y_point[1],"b*")

image.png

用户
和原帖交流更多问题细节吧,去
我要发帖 我要发帖
资料中心 资料中心
查看更多>
热门帖子 热门帖子
主要贡献者 主要贡献者
过去7天