数值分析课后习题

插值法

【1】 给出 $y = ln x$ 的如下函数表:

$x$0.50.60.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.51.61.7
$f(X_k)$0.9827941.0121971.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$012
$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$0123
$x_i$0.100.150.250.30
$f(x_i)$0.9048370.8607080.7788010.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

本文链接:

https://imyan.cc/zatan/227.html