数值分析课后习题
插值法
【1】 给出 $y = ln x$ 的如下函数表:
$x$ | 0.5 | 0.6 | 0.7 |
---|---|---|---|
$y = ln x$ | -0.693147 | -0.510826 | -0.356675 |
(1)手工计算:用线性插值求ln 0.54 的近似值(计算中保留 6 位小数),并估计截断误差;
(2)MATLAB 计算:用 MATLAB 的一维插值函数 interp1(方法选项用'linear')验算你(1) 中的计算结果(给出代码与结果)
clc;clear;
x = [0.5 0.6 0.7];
y = [-0.693147 -0.510826 -0.356675];
Xq = 0.54;
Vq = interp1(x, y, Xq);
结果:
$$ Vq=-0.6202186 $$
【2】给定$f (x)=arctan x$ 的如下函数值表:
$X_k$ | 1.5 | 1.6 | 1.7 |
---|---|---|---|
$f(X_k)$ | 0.982794 | 1.012197 | 1.039072 |
(1)估计用线性插值求arctan1.66的近似值时的截断误差;(注意:只要求估计截断误差)
(2)手工计算:用二次代数插值求arctan1.66的近似值(计算中保留 6 位小数),并估计截断误差;
(3)MATLAB 计算:用 MATLAB 验算你(2)中的计算结果(给出代码与结果).
clc;clear;
x = [1.5 1.6 1.7];
y = [0.982794 1.012197 1.039072];
lagrange(x,y,1.66)
%拉格朗日插值多项式
%x为向量,全部的插值节点
%y为向量,插值节点处的函数值
%xi为标量,自变量x
%yi为xi处的函数估计值
function yi = lagrange(x,y,xi)
n = length(x);m = length(y);
if n ~= m
error('The lengths of X and Ymusy be equal');
% return;
end
p = zeros(1,n);
for k =1:n
t =ones(1,n);
for j =1:n
if j ~= k
if abs(x(k) - x(j)) < eps
error('the DATA is error');
%return;
end
t(j) = (xi-x(j))/(x(k)-x(j));
end
end
p(k) = prod(t);
end
yi = sum(y.* p);
end
结果:
$ans =1.0286$
【3】已知$y=f(x)$的如下函数值表:
$x$ | 0 | 1 | 2 |
---|---|---|---|
$y=f(x)$ | 8 | -7.5 | -18 |
(1)手工计算:用二次插值求方程 f x( ) 0 在(0, 2) 内的根的近似值(计算中保留 4 位小数);
(2)MATLAB 计算:用 MATLAB 验算你(1)中的计算结果(给出代码与结果)
clc; clear;
x = [0 1 2];
y = [8 -7.5 -18];
% 拉格朗日插值多项式
function yi = lagrange(x, y, xi)
n = length(x);
L = ones(1, n);
for i = 1:n
for j = 1:n
if i ~= j
L(i) = L(i) * (xi - x(j)) / (x(i) - x(j));
end
end
end
yi = y' * L;
end
% 构建二次插值多项式
xi = linspace(0, 2, 100); % 在区间(0, 2)内生成插值点
yi = arrayfun(@(x) lagrange(x, y, x), xi, 'UniformOutput', false);
% 求解多项式的根
coeffs = polyfit(x, y, 2); % 获取二次多项式的系数
roots_P = roots(coeffs); % 求解多项式的根
% 选择在(0, 2)区间内的实数根
real_roots_P = roots_P(imag(roots_P) == 0 & roots_P > 0 & roots_P < 2);
% 显示近似根
disp('在区间(0, 2)内的近似根为:');
disp(real_roots_P);
结果:
在区间$(0, 2)$内的近似根为: $0.4759$
【4】已知$f(x)=e^{-x}$的一个函数表如下:
$i$ | 0 | 1 | 2 | 3 |
---|---|---|---|---|
$x_i$ | 0.10 | 0.15 | 0.25 | 0.30 |
$f(x_i)$ | 0.904837 | 0.860708 | 0.778801 | 0.7408108 |
(1)手工计算:用三次 Newton 插值求 f (0.3) e 0.3 的近似值(计算中保留 6 位小数),并估计截 断误差;
(2)MATLAB 计算:用 MATLAB 验算你(1)中的计算结果(给出代码与结果;直接调用你的 Lagrange插值函数,不要求写 Newton 插值的代码).
clc;clear;
x = [0.1 0.15 0.25 0.30];
y = [0.904837 0.860708 0.778801 0.740818];
lagrange(x,y,0.2)
%拉格朗日插值多项式
%x为向量,全部的插值节点
%y为向量,插值节点处的函数值
%xi为标量,自变量x
%yi为xi处的函数估计值
function yi = lagrange(x,y,xi)
n = length(x);m = length(y);
if n ~= m
error('The lengths of X and Ymusy be equal');
% return;
end
p = zeros(1,n);
for k =1:n
t =ones(1,n);
for j =1:n
if j ~= k
if abs(x(k) - x(j)) < eps
error('the DATA is error');
%return;
end
t(j) = (xi-x(j))/(x(k)-x(j));
end
end
p(k) = prod(t);
end
yi = sum(y.* p);
end
结果:
ans = 0.8187