对于函数1/(1+x^2) 在[-5,5]内,按等距节点求n次lagrange插值多项式和newton插值多项式。 取100点,画出插值多项式和原函数的对比图。 并分别比较在x=3.5,x=4.5处的值。 给出具体的matlab代码
时间: 2024-09-10 14:04:58 浏览: 90
函数逼近中的(Lagrange)拉格朗日插值法求函数近似值 算法及北太天元实现
首先,我们需要了解Lagrange插值多项式和Newton插值多项式的定义和计算方法。
Lagrange插值多项式的基本形式是:
\[ L_n(x) = \sum_{i=0}^{n} y_i \cdot l_i(x) \]
其中 \( l_i(x) \) 是Lagrange基多项式,定义为:
\[ l_i(x) = \prod_{j=0, j \neq i}^{n} \frac{x - x_j}{x_i - x_j} \]
\( x_i \) 是给定节点,\( y_i \) 是在 \( x_i \) 处的函数值。
Newton插值多项式则是:
\[ N_n(x) = a_0 + a_1(x-x_0) + a_2(x-x_0)(x-x_1) + \cdots + a_n(x-x_0)(x-x_1)\cdots(x-x_{n-1}) \]
其中 \( a_i \) 是差商,可以通过差商表计算得到。
对于函数 \( f(x) = \frac{1}{1+x^2} \),我们可以在区间 \([-5,5]\) 上取等距节点进行插值。对于Lagrange和Newton插值多项式,我们需要分别计算出对应的插值多项式的系数,然后在MATLAB中画出插值多项式和原函数的图像,并计算特定点的函数值。
以下是一个MATLAB代码示例,用于计算和绘制Lagrange和Newton插值多项式以及比较特定点的值:
```matlab
% 定义原函数
f = @(x) 1./(1+x.^2);
% 定义区间和节点数
a = -5;
b = 5;
n = 99; % 插值节点数,加1是因为包括区间端点
x = linspace(a, b, n+1);
y = f(x);
% 使用Lagrange插值多项式
lagrange_poly = @(xq) lagrangeInterpolation(x, y, xq);
lagrange_vals = lagrange_poly(linspace(a, b, 100));
% 使用Newton插值多项式
newton_poly = @(xq) newtonInterpolation(x, y, xq);
newton_vals = newton_poly(linspace(a, b, 100));
% 绘制原函数和插值多项式
x_plot = linspace(a, b, 1000);
y_plot = f(x_plot);
figure;
plot(x_plot, y_plot, 'k', 'LineWidth', 1.5); hold on;
plot(x_plot, lagrange_vals, 'b--', 'LineWidth', 1.5);
plot(x_plot, newton_vals, 'r-.', 'LineWidth', 1.5);
legend('Original function', 'Lagrange polynomial', 'Newton polynomial');
title('Lagrange and Newton Interpolation');
hold off;
% 计算特定点的值
x_specific = [3.5, 4.5];
lagrange_specific = lagrange_poly(x_specific);
newton_specific = newton_poly(x_specific);
y_specific = f(x_specific);
disp('Values at specific points:');
disp(['x=3.5: f(x) = ', num2str(y_specific(1)), ', Lagrange = ', num2str(lagrange_specific(1)), ', Newton = ', num2str(newton_specific(1))]);
disp(['x=4.5: f(x) = ', num2str(y_specific(2)), ', Lagrange = ', num2str(lagrange_specific(2)), ', Newton = ', num2str(newton_specific(2))]);
% Lagrange插值函数
function L = lagrangeInterpolation(x, y, xq)
n = length(x);
L = 0;
for i = 1:n
li = 1;
for j = 1:n
if j ~= i
li = li * (xq - x(j)) / (x(i) - x(j));
end
end
L = L + y(i) * li;
end
end
% Newton插值函数
function N = newtonInterpolation(x, y, xq)
n = length(x);
divided_diff = dividedDifferences(x, y);
N = divided_diff(1);
prod = 1;
for k = 1:n-1
prod = prod .* (xq - x(1:k));
N = N + divided_diff(k+1) * prod;
end
end
% 计算差商
function dd = dividedDifferences(x, y)
n = length(y);
dd = zeros(n, n);
dd(:,1) = y(:);
for j = 2:n
for i = 1:n-j+1
dd(i,j) = (dd(i+1,j-1) - dd(i,j-1)) / (x(i+j-1) - x(i));
end
end
end
```
请确保在运行此代码之前,你的MATLAB环境是正确配置的,并且你已经安装了必要的工具箱和函数。此外,代码中的插值节点数`n`设置为99是为了包含区间端点`-5`和`5`。
阅读全文