You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在等距数据点图上叠加绘制拉格朗日(Lagrange)插值曲线

问题核心错误点
  • 拉格朗日基函数计算逻辑错误:基函数的插值变量是x坐标,你的代码误将y值代入了差计算,属于变量使用错误
  • 缺少插值密采样点:你当前用的x是原始采样的9个离散点,插值后和原始点完全重合,无法呈现光滑的插值多项式曲线
  • 未完成插值结果计算:你仅计算了基函数矩阵M,没有将其与原始y值相乘得到插值结果
  • 未开启图形叠加模式:Matlab默认plot会清空上一张图,要叠加绘制需要先执行hold on命令
修正后完整代码
clear
clc

%% 1. 定义原始等距采样点(龙格函数)
x_sample = -1:0.25:1;
y_sample = 1./(1+25.*x_sample.^2);

%% 2. 生成插值用的密采样点,用于绘制光滑曲线
x_interp = linspace(-1,1,200);
n_sample = length(x_sample);
n_interp = length(x_interp);

%% 3. 计算拉格朗日基函数矩阵
M = zeros(n_sample, n_interp);
for i = 1:n_sample
    % 计算第i个基函数在所有插值点的取值
    l = ones(1, n_interp);
    for j = 1:n_sample
        if j ~= i
            l = l .* (x_interp - x_sample(j)) ./ (x_sample(i) - x_sample(j));
        end
    end
    M(i,:) = l;
end

%% 4. 计算插值结果
y_interp = y_sample * M;

%% 5. 绘制对比图
figure('Color','w')
% 子图1:插值曲线与原始点对比
subplot(2,1,1)
hold on
grid on
plot(x_sample, y_sample, 'ro', 'MarkerSize',8, 'DisplayName','原始等距采样点')
plot(x_interp, 1./(1+25.*x_interp.^2), 'k--', 'DisplayName','原始龙格函数曲线')
plot(x_interp, y_interp, 'b-', 'LineWidth',1.5, 'DisplayName','拉格朗日插值曲线')
xlabel('x')
ylabel('y')
legend('Location','best')
title('拉格朗日插值效果对比')

% 子图2:插值误差曲线
err = y_interp - 1./(1+25.*x_interp.^2);
subplot(2,1,2)
plot(x_interp, err, 'r-', 'LineWidth',1.2)
grid on
xlabel('x')
ylabel('插值误差')
title('插值绝对误差曲线')
disp(['本次插值最大绝对误差:', num2str(max(abs(err)))])
效果说明
  • 上方子图同时展示了原始采样点、真实函数曲线、拉格朗日插值曲线,可直观观察插值拟合效果
  • 下方子图专门展示插值误差随x的变化规律,同时命令行窗口会输出本次插值的最大绝对误差数值
  • 如果不需要拆分两个子图,可删除subplot相关代码,仅保留单图叠加绘制采样点与插值曲线即可

内容的提问来源于stack exchange,提问作者Manbearpig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:54:03