数值分析实验题和程序报告.docx
《数值分析实验题和程序报告.docx》由会员分享,可在线阅读,更多相关《数值分析实验题和程序报告.docx(14页珍藏版)》请在冰豆网上搜索。
数值分析实验题和程序报告
数值分析实验题和程序
实验2.1多项式插值的振荡现象
问题提出:
考虑在一个固定的区间上用插值逼近一个函数。
显然
Lagrange插值中使用的节点越多,插值多项式的次数就越高。
我们自然关
心插值多项的次数增加时,Ln(x)是否也更加靠近被逼近的函数。
Runge
给出的一个例子是极著名并富有启发性的。
设区间[-1,1]上函数
1
f(x)2
1+25x
实验内容:
考虑区间[-1,1]的一个等距划分,分点为
2i
Xj=-1•,i=0,1,2,…,n
n
则拉格朗日插值多项式为
li(x)
1
2
125xi
其中,h(x),i=0,1,2,…,n是n次Lagrange插值基函数。
实验要求:
(1)选择不断增大的分点数目n=2,3,…画出原函数f(x)及插值多项式函数Ln(x)在[-1,1]上的图像,比较并分析实验结果。
(2)选择其他的函数,例如定义在区间[-5,5]上的函数
x
h(x)=,g(x)=arctanx
1+x
重复上述的实验,看其结果如何。
1、实验MATLAB程序
functioncharpt2_1
%数值实验2.1:
多项式插值的震荡现象
%输入:
函数式选择,插值节点数
%输出:
拟合函数及原函数的图形
promps={'选择实验函数,若选f(x),输入f,若选h(x),输入h,若选g(x),输
入g:
'};
result=inputdlg(promps,'charpt2_1',1,{'f'});
Nb_f=char(result);
if(Nb_f~='f'&Nb_f~='h'&Nb_f~='g')
errordlg('实验函数选择错误!
');return;
end
result=inputdlg({'请输入第一幅图插值节点数N>=2:
'},'charpt2_1',1,{'2'});
Nd0=str2num(char(result));
if(Nd0<2)
errordlg('节点数输入错误!
');return;
end
result=inputdlg({'请输入两幅图间插值节点数差值D:
'},'charpt2_1',1,{'1'});
D=str2num(char(result));
switchNb_f
case'f'
f=inline('1./(1+25*x.A2)');a=-1;b=1;
case'h'
f=inline('x./(1+x.A4)');a=-5;b=5;
case'g'
f=inline('atan(x)');a=-5;b=5;
end
fori=1:
6
Nd=Nd0+(i-1).*D;
x0=linspace(a,b,Nd+1);y0=feval(f,x0);
x=a:
0.01:
b;
y=Lagrange(x0,y0,x);
subplot(2,3,i);
plot(x0,y0,'*');
holdon;
fplot(f,[a,b],'k');
holdon;
plot(x,y,'b--');
s1='x(节点数N=';s2=num2str(Nd);
s3=')';s=[s1s2s3];xlabel(s);
ylabel('y=f(x)-andy=Ln(x)--');end
%Lagrange插值函数
functiony=Lagrange(x0,y0,x)n=length(x0);
m=length(x);
fori=1:
mz=x(i);s=0.0;
fork=1:
n
p=1.0;
forj=1:
nif(j~=k)p=p*(z-x0(j))/(x0(k)-x0(j));
endends=s+p*y0(k);
endy(i)=s;
end
2、实验结果
%g02
K(节N=2>
丄iu/=xPJn-主匕监
丄iua匕pjiE肯匕=<
-0.S0
x(节点如®
』.50
M[书点数HE
pun
丄卓-5Lpu牌mnl
电!
5«阳
徨(节点5+N=T)
图1-1函数f(x)对应的Lagrange插值函数图形(节点数2〜7)
pus:
・
■1-0.500.S
mf节点ftM=a>
1
丄iIrlEpUE->亘;|ei
4S
.21.S.64.2
T.ao.Qa
•1-fl.6D06
胃M=9)
-04
丄MJnrlHXpuir・CIIIL
■051一
-1-0.5QD■丐
Xf节点數
丄壬Inlp羸・ETS
iK>lrlLpuq■7T
!
/b
i/V
-0.50M
xf节点败讯酣
4
2.4丿-(I.
jpuH-〔«}■=』
0
Ji{节点S*N=2>
丄xxnLpum-s'
0
x(节点Hhi=3>
04Q.-aQ丄X耳L乍
ipUE-R-H*n
05
覚「节点gSN=5>
丄昌UJLIB•iiH
D5
wC节点数M=6>
X•:
•节.^M=4;
mjRttN=7)
图1-3函数h(x)对应的Lagrange插值函数图形(节点数2〜7)
.<511・SE-M5L■s」k
kf节ASSN=2>
51505d5I
1E5LP匚n宣I>1
D&
*f节jft.^N=3>
古互虽pue■S-L
n
X(帯点■数N=5>
丄305LpugAiTA
xK节磁N"
图1-5函数g(x)对应的Lagrange插值函数图形(节点数2〜7)
D&
xN=W>
=・j5aipu恒•iITE
fl
4-1
•丄昶百“土punj’il-^TiJi
xC书点HN=i2)
1
丄吕5L?
b•(工|耳
•am'5」?
:
s兀
o
xf节点KSN=fl)
■-ujlJqLpUE-iMJ
-*弓」n?
:
_r』
x{节N=11>
3、结果分析
根据实验结果可以看出,无论是哪个函数在某个低次以下时,插值函数值与实际函数值差别很大。
随着次数上升,插值函数值越接近实际函数值,但是这只是在一定的区间上。
如果不在此区间上,随着次数上升,会出现插值结果突然偏离原函数的现象,次数越高,偏离现象越严重。
实验3.1三次多项式最小二乘拟合
-n
编制以函数:
xk?
为基的多项式最小二乘拟合程序,并用于对表k兰
3.11中的数据作三次多项式最小二乘拟合。
表3.11
Xi
-1.0
-0.5
0.0
0.5
1.0
1.5
2.0
yi
-4.447
-0.452
0.551
0.048
-0.447
0.549
4.552
n
取权数.=1,求拟合曲线:
-;xk中的参数〕j、平方误差
k=0
-■2,并作离散数据认,的拟合函数y二*(x)的图形。
1、实验MATLAB程序
functioncharpt3_1
%数值实验3.1:
三次多项式最小二乘拟合
%输岀:
原函数及求得的插值多项式函数图形以及参数alph和误差r
x0=-1:
0.5:
2;
y0=[-4.447-0.4520.5510.048-0.4470.5494.552];
n=3;%n为拟合阶次
alph=polyfit(x0,y0,n);%参数'■-y=polyval(alph,x0);
%平方误差
r=(y0-y)*(y0-y)';
x=-1:
0.01:
2;
y=polyval(alph,x);
plot(x,y,'k--');
xlabel('x');
ylabel('yO*andpolyval.y--');
holdon;
plot(xO,yO,'*');
title(离散数据的3次多项式最小二乘拟合');
gridon;
disp(['参数alph:
',num2str(alph)]);
disp(['平方误差:
',num2str(r)]);
2、实验结果
当取权数,=1时,所求离散数据认,yi[的3次多项式最小二乘拟合函数y=^(x)的图形如图2-1所示。
图2-1离散数据的3次多项式最小二乘拟合
3
拟合曲线0=送ot;xk中的参数的值依次为:
k-Q
1.9991-2.9977-3.9683e-0050.54912
平方误差j.2为:
2.1762e-005。
3、结果分析
最小二乘曲线拟合是在离散情形下的最佳平方逼近,拟合的曲线很光滑,而且所有的7个数值点均在曲线上,拟合效果很好,拟合的平方误差很小,为10-5量级。
实验5.1常微分方程性态和R-K法稳定性实验
实验目的:
考察下面微分方程右端项中函数y前面的参数对方程性态
的影响(它可使方程为好条件的或坏条件的)和研究计算步长对R-K法计
算稳定性的影响。
实验题目:
常微分方程初值问题
厂'
』y=cty—o(x+1,0CXC1,
』(0)=1,
其中,-50_50。
其精确解为y(x)=e〉Xx。
实验要求:
本实验题都用4阶经典R-K法计算。
(1)对参数:
-,分别取4个不同的数值:
一个大的正值,一个小的
正值,一个绝对值小的负值和一个绝对值大的负值。
取步长h=0.01,分别
用经典的R-K法计算,将四组计算结果画在同一张图上,进行比较并说明
相应初值问题的性态。
(2)取参数:
为一个绝对值不大的负值和两个计算步长,一个步长使参数在经典R-K法的稳定域内,另一个步长在经典R-K法的稳定域外。
分别用经典R-K法计算并比较计算结果。
取全域等距的10个点上的计算值,列表说明。
1、实验MATLAB程序
functioncharpt5_1
%数值实验5.1:
常微分方程性态和R-K法稳定性实验
%输入:
参数a,步长h
%输出:
精确解和数值解图形对比
promps={'若选择实验要求1,请输入1;若选择实验要求2,请输入2:
'};result=inputdlg(promps,'charpt5_1',1,{'1'});
Nb=str2num(char(result));
if(Nb~=1)&(Nb~=2)
errordlg('选择错误!
');return;
end
if(Nb==1)
result=inputdlg({'请输入参数a的一个大的正值:
'},'charpt5_1',1,{'40'});a=str2num(char(result));
result=inputdlg({'请输入参数a的一个小的正值:
'},'charpt5_1',1,{'10'});b=str2num(char(result));
result=inputdlg({'请输入参数a的一个绝对值小的负值:
'},'charpt5_1',1,{'-10'});
c=str2num(char(result));
result=inputdlg({'请输入参数a的一个绝对值大的负值:
'},'charpt5_1',1,{'-40'});
d=str2num(char(resu