如何在等距数据点图上叠加绘制拉格朗日(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
相关产品推荐
相关产品推荐

