数值分析作业

1. 第一题

问题提出:考虑在一个固定的区间上用插值逼近一个函数。显然Lagrange插值中使用的节点越多,插值多项式的次数就越高。我们自然关心插值多项的次数增加时,L_{n}\left ( x \right )是否也更加靠近被逼近的函数。Runge给出的一个例子是极著名并富有启发性的,设区间[-1,1]上函数

f\left ( x \right )=\frac{1}{1+25x^{2}}

实验内容:考虑区间[-1,1]的一个等距划分,分点为

x_{i}=-1+\frac{2i}{n},i=0,1,2,...,n

则拉格朗日插值多项式为

L_{n}\left ( x \right )=\sum_{i=0}^{n}\frac{1}{1+25x^{2}}l_{i}\left ( x \right )

其中,l_{i}\left ( x \right ),i=0,1,2,...,n是n次Lagrange插值基函数。

实验要求: 

(1)选择不断增大的分点数目n=2,3,..., 画出原函数f(x)及插值多项式函数L_{n}\left ( x \right )在 [-1,1]上的图像 , 比较并分析实验结果。

 (2)选择其他函数,例如定义在区间[-5,5]上的函数

h(x)=\frac{x}{1+x^{4}},g(x)=arctanx

重复上述的实验看其结果如何。

答:

Matlab不自带Largrange 函数,所以需要编写一个Largange函数

% HOMEWORK Jingyi Tian 2021.9.21
% Mid-Autumn Festival
%% largange function
function y = largange(x0,y0,x)
n = length(x0);
m = length(x);
for i=1:m
    z = x(i);
    s = 0.0;
    for k=1:n
        p =1.0;
        for j=1:n
            if(j ~=k)
                p = p*(z-x0(j))/(x0(k)-x0(j));
            end
        end
        s = s+p*y0(k);
    end
    y(i) = s;
end
% HOMEWORK Jingyi Tian 2021.9.21
% Mid-Autumn Festival
%% f(x)
clc,clear
close all
x = linspace(-1,1,100);
y = 1./(1+25*x.^2);
plot(x,y);
legend('f(x)');
hold on;
%% for different nodes
for i=2:2:10
x0 = linspace(-1,1,i+1);
y0 =  1./(1+25*x0.^2);
y = largange(x0,y0,x);
plot(x,y,'r-')
hold on
end
%% result
% the result fit better around the origin point as the n number rises,
% while has futher diviation at the boundary.
% HOMEWORK Jingyi Tian 2021.9.21
% Mid-Autumn Festival
%% h(x)
clc,clear
close all
x = linspace(-5,5,100);
y = x./(1+x.^4);
plot(x,y);
legend('h(x)');
hold on;
%% for different nodes
for i=2:2:10
x0 = linspace(-5,5,i+1);
y0 =  x0./(1+x0.^4);
y = largange(x0,y0,x);
plot(x,y,'r-')
hold on
end
%% result
% the result fit better around the origin point as the n number rises,
% while has futher diviation at the boundary.
% HOMEWORK Jingyi Tian 2021.9.21
% Mid-Autumn Festival
%% h(x)
clc,clear
close all
x = linspace(-5,5,100);
y = atan(x);
plot(x,y);
legend('g(x)');
hold on;
%% for different nodes
for i=2:2:10
x0 = linspace(-5,5,i+1);
y0 = atan(x0);
y = largange(x0,y0,x);
plot(x,y,'r-')
hold on
end
%% result
% the result fit better around the origin point as the n number rises,
% while has futher diviation at the boundary.

绘制出f\left ( x \right )=\frac{1}{1+25x^{2}}在[-1,1]上的拉格朗日插值图像,可以看到在原点附近n越大时拟合越接近蓝线,但是在边缘处波动更大。

绘制出h(x)=\frac{x}{1+x^{4}}在[-5,5]上的拉格朗日插值图像,可以看到在原点附近n越大时拟合越接近蓝线,但是在边缘处波动更大。 

绘制出g(x)=arctanx在[-5,5]上的拉格朗日插值图像,可以看到在原点附近n越大时拟合越接近蓝线,但是在边缘处波动更大。   

 三个函数现象基本一致,这时龙格现象的表现,常用分区法解决问题。

2. 第二题

实验3.1

编制以函数(x^{k})_{k=0}^{n}为基的多项式最小二乘拟合程序,并用于对表3.11中的数据作3次多项式最小二乘拟合。

表3.11
x_{i}-1.0-0.50.00.51.01.52.0
y_{i}-4.447-0.4520.5510.048-0.4470.5494.552

取权数\omega _{i}=1,求拟合曲线\varphi ^{*}=\sum_{k=0}^{n}\alpha _{k}^{*}x^{k}中的参数{\alpha _{k}},平方误差\delta ^{2},并作离散数据{x_{i},y_{i}}的拟合函数y=\varphi ^{*}\left ( x \right )的图形。

解3.1:

代码:

% HOMEWORK Jingyi Tian 2021.9.21
% Mid-Autumn Festival
%% 2.1 least square fit
x = -1:0.5:2;
y = [-4.447,-0.452,0.551,0.048,-0.447,0.549,4.552]
alpha = polyfit(x,y,3); % parameter:alpha-k
y1 = polyval(alpha,x);
delta2 = sum((y-y1).^2); % square error:delta^2
clf;
plot(x,y,'*');
hold on;
% plot
x0 = -1:0.01:2;
plot(x0,polyval(alpha,x0),'r-');
axis([-1.5,2.5,-5,5]);
xlabel('x');
ylabel('y');
title('cubic polynomial least squares fitting');
disp(['square error:',sprintf('%g',delta2)]);
disp(['parameter:',sprintf('%g\t',alpha)]);

拟合图形:

运算结果:

y = -4.4470   -0.4520    0.5510    0.0480   -0.4470    0.5490    4.5520
square error:2.17619e-05
parameter:1.99911	-2.99767	-3.96825e-05	0.549119	

实验3.2

编制正交化多项式最小二乘拟合程序,并用于求解上题中的3次多项式最小二乘拟合问题,作拟合曲线的图形,计算平方误差,并与上题结果进行比较。

解3.2:

代码:

% HOMEWORK Jingyi Tian 2021.9.21
% Mid-Autumn Festival
%% Orthogonalization
x = -1:0.5:2;
y = [-4.447,-0.452,0.551,0.048,-0.447,0.549,4.552];
w = [1,1,1,1,1,1,1];
n = 3;
[a,b,c,alpha,r] = flp(x,y,w,n)
disp(['square error:',sprintf('%g',r)]);
disp(['parameter:',sprintf('%g\t',alpha)]);
clf;
plot(x,y,'*');
hold on;
x0=[-1:0.01:2];
plot(x0,polyval(alpha,x0),'r-');
axis([-1.5,2.5,-5,5]);
xlabel('x');ylabel('y');title('orthogonalization least squares fitting');

function [a,b,c,alpha,r] = flp(x,y,w,n)
m = length(x);
s1 = ones(1,m);
v1 = sum(w);
d(1) = y*w';
c(1) = d(1)/v1;
for k=1:n
    xs = x.*s1.^2*w';
    a(k) = xs/v1;
    if (k == 1)
        s2 = (x-a(k)).*s1;
    else
        b(k) = v2/v11;
        s2 = (x-a(k)).*s1-b(k)*s0;
    end
    v2 = s2.^2*w';
    d(k+1) = y.*s2*w';c(k+1)=d(k+1)/v2;
    v11 = v1;v1 = v2;s0 = s1;s1 = s2;
end

% square error
r = y.*y*w'-c*d';
% parameter
syms x
p0 = 1;
T = c(1)*p0;
for k = 2:n+1
    if (k == 2)
        p2 = x-a(k-1);
    else
        p2 = (x-a(k-1))*p1-b(k-1)*p0;
        p0=p1;
    end
    T = T+c(k)*p2;
    p1 = p2;
end
T = collect(T);
alpha = sym2poly(T);
end

拟合图形:

运行结果:

r = 2.1762e-05
square error:2.17619e-05
parameter:1.99911	-2.99767	-3.96825e-05	0.549119	

结果比较:

两种拟合的结果基本一致。

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值