% 定义函数f(x)和区间[a, b] f = @(x) 1./(1 + x.^2); a = -5; b = 5; % 计算n+1个等距节点 n_values = [2, 4, 6, 8, 10, 20]; for i = 1:length(n_values) n = n_values(i); x = linspace(a, b, n+1); y = f(x); % 计算牛顿插值多项式和节点中点的近似值 p = @(t) newton_interpolation(x, y, t); midpoints = (x(1:end-1) + x(2:end))/2; % 绘制图像 subplot(2,3,i); fplot(f, [a, b], 'k'); hold on; fplot(p, [a, b], 'r'); plot(midpoints, p(midpoints), 'bo'); title(sprintf('n = %d', n)); legend('f(x)', 'p(x)'); hold off; end % 牛顿插值多项式的计算函数 function p = newton_interpolation(x, y, t) n = length(x) - 1; b = y; for j = 1:n for i = n+1:-1:j+1 b(i) = (b(i) - b(i-1))./(x(i) - x(i-j)); end end p = b(n+1); for j = n:-1:1 p = (t - x(j)).*p + b(j); end end给每行代码加注释
时间: 2024-04-28 15:23:04 浏览: 96
% 定义函数f(x)和区间[a, b]
f = @(x) 1./(1 + x.^2); % 定义函数f(x)为 1 / (1 + x^2)
a = -5; % 定义区间左端点为 -5
b = 5; % 定义区间右端点为 5
% 计算n+1个等距节点
n_values = [2, 4, 6, 8, 10, 20]; % 定义要计算的节点数
for i = 1:length(n_values) % 对每个节点数进行循环
n = n_values(i); % 取出当前节点数
x = linspace(a, b, n+1); % 生成n+1个等距节点
y = f(x); % 计算每个节点的函数值
% 计算牛顿插值多项式和节点中点的近似值
p = @(t) newton_interpolation(x, y, t); % 定义牛顿插值多项式
midpoints = (x(1:end-1) + x(2:end))/2; % 计算相邻节点的中点
% 绘制图像
subplot(2,3,i); % 将当前图像画在2x3的子图中的第i个位置
fplot(f, [a, b], 'k'); % 绘制原函数f(x)的图像
hold on; % 保持图像不变,方便后面继续绘制
fplot(p, [a, b], 'r'); % 绘制牛顿插值多项式的图像
plot(midpoints, p(midpoints), 'bo'); % 在相邻节点中点处绘制多项式的近似值
title(sprintf('n = %d', n)); % 在图像上添加标题,显示当前节点数
legend('f(x)', 'p(x)'); % 添加图例,方便区分f(x)和p(x)
hold off; % 结束绘制,释放图像
end
% 牛顿插值多项式的计算函数
function p = newton_interpolation(x, y, t)
n = length(x) - 1; % 计算节点数
b = y; % 初始化差商表,将y赋值给b
for j = 1:n % 对每列进行循环
for i = n+1:-1:j+1 % 对每行进行循环
b(i) = (b(i) - b(i-1))./(x(i) - x(i-j)); % 计算差商表的每个元素
end
end
p = b(n+1); % 取出差商表的最后一个元素,即多项式的最高次项系数
for j = n:-1:1 % 从最高次项开始对每项进行循环
p = (t - x(j)).*p + b(j); % 计算多项式的每一项
end
end
阅读全文