课程实验报告
课程实验报告
课程实验报告
课程实验报告
实验一、误差分析
一、实验目的
1.通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;
2.通过上机计算,了解误差、绝对误差、误差界、相对误差界的有关概念;
3.通过上机计算,了解舍入误差所引起的数值不稳定性。
二.实验原理
误差问题是数值分析的基础,又是数值分析中一个困难的课题。在实际计算中,如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。因此,选取算法时注重分析舍入误差的影响,在实际计算中是十分重要的。同时,由于在数值求解过程中用有限的过程代替无限的过程会产生截断误差,因此算法的好坏会影响到数值结果的精度。
三.实验内容
对,计算定积分
.
算法1:利用递推公式
, ,
取 .
算法2:利用递推公式
.
注意到
,
取 .:
四.实验程序及运行结果
程序一:
t=log(6)-log(5);
n=1;
y(1)=t;
for k=2:1:20
y(k)=1/k-5*y(k-1);
n=n+1;
end
y
y =0.0884
y =0.0581
y =0.0431
y =0.0346
y =0.0271
y =0.0313
y =-0.0134
y =0.1920
y =-0.8487
y =4.3436
y =-21.6268
y =108.2176
y =-541.0110
y =2.7051e+003
y =-1.3526e+004
y =6.7628e+004
y =-3.3814e+005
y =1.6907e+006
y =-8.4535e+006
y =4.2267e+007
程序2:
y=zeros(20,1);
n=1;
y1=(1/105+1/126)/2;y(20)=y1;
for k=20:-1:2
y(k-1)=1/(5*k)-(1/5)*y(k);
n=n+1;
end
运行结果:y =
0.0884
0.0580
0.0431
0.0343
0.0285
0.0212
0.0188
0.0169
0.0154
0.0141
0.0130
0.0120
0.0112
0.0105
0.0099
0.0093
0.0089
实验二、插值法
一、实验目的
1、理解插值的基本概念,掌握各种插值方法,包括拉格朗日插值和牛顿插值等,注意其不同特点;
2、通过实验进一步理解并掌握各种插值的基本算法。
二.实验原理
插值法是函数逼近的一种重要方法,它是数值积分、微分方程数值解等数值计算的基础与工具,其中多项式插值是最常用和最基本的方法。拉格朗日插值多项式的优点是表达式简单明确,形式对称,便于记忆,它的缺点是如果想要增加插值节点,公式必须整个改变,这就增加了计算工作量。而牛顿插值多项式对此做了改进,当增加一个节点时只需在原牛顿插值多项式基础上增加一项,此时原有的项无需改变,从而达到节省计算次数、节约存储单元、应用较少节点达到应有精度的目的。
三.实验内容
1、 已知函数表
0.56160 0.56280 0.56401 0.56521
0.82741 0.82659 0.82577 0.82495
用二次拉格朗日插值多项式求时的函数近似值。
2、 已知函数表
0.4 0.55 0.65 0.8 0.9
0.41075 0.57815 0.69675 0.88811 1.02652
用牛顿插值多项式求和。
四.实验程序及运行结果
1.程序如下:
function [y,R]=lagranzi(X,Y,x,M)
n=length(X); m=length(x);
for i=1:m
z=x(i);s=0.0;
for k=1:n
p=1.0; q1=1.0; c1=1.0;
for j=1:n
if j~=k
p=p*(z-X(j))/(X(k)-X(j));
end
q1=abs(q1*(z-X(j)));c1=c1*j;
end
s=p*Y(k)+s;
end
y(i)=s;
end
R=M*q1/c1;
在MATLAB工作窗口输入程序:
>> x=0.5635;
>> M=1;
>> X=[0.56280,0.56401];
>> Y=[0.82659,0.82577];
>> [y,R]=lagranzi(X,Y,x,M)
实验结果如下:
y =0.8261
R =1.7850e-007
2.程序如下:
function [y,R]= newcz(X,Y,x,M)
n=length(X); m=length(x);
for t=1:m
z=x(t); A=zeros(n,n);A(:,1)=Y';
s=0.0; p=1.0; q1=1.0; c1=1.0;
for j=2:n
for i=j:n A(i,j)=(A(i,j-1)-A(i-1,j-1))/(X(i)-X(i-j+1));
end
q1=abs(q1*(z-X(j-1)));c1=c1*j;
end
C=A(n,n);q1=abs(q1*(z-X(n)));
for k=(n-1):-1:1
C=conv(C,poly(X(k)));d=length(C); C(d)=C(d)+A(k,k);
end
y(k)= polyval(C, z);
end
R=M*q1/c1;
在MATLAB工作窗口输入程序:
三次牛顿差值程序如下:
>> X=[0.4,0.55,0.6];
>> Y=[0.41075,0.57815,0.69675];
>> [y,R]= newcz(X,Y,x,M)
实验结果如下:
y =0.6861
R =6.0107e-006
四次牛顿差值程序如下:
>> x=0.895;
>> X=[0.55,0.65,0.8,0.9];
>> Y=[0.57815,0.69675,0.88811,1.02652];
实验结果如下:
y =1.0194
R =1.6729e-006
实验三、解线性方程组的直接法
一、实验目的
1.了解求线性方程组的直接法的有关理论和方法;
2.会编制列主元消去法、LU分解法的程序;
二.实验原理
解线性方程组的直接法是指经过有限步运算后能求得方程组精确解的方法。但由于实际计算中舍入误差是客观存在的,因而使用这类方法也只能得到近似解。目前较实用的直接法是古老的高斯消去法的变形,即主元素消去法及矩阵的三角分解法。引进选主元的技巧是为了控制计算过程中舍入误差的增长,减少舍入误差的影响。一般说来,列主元消去法及列主元三角分解法是数值稳定的算法,它具有精确度较高、计算量不大和算法组织容易等优点,是目前计算机上解中、小型稠密矩阵方程组可靠而有效的常用方法。
三.实验内容
1. 用列主元高斯消去法求解方程组
.
2.用矩阵直接三角分解法求解方程组,其中
, .
四.实验程序及运行结果
1.主程序
function [RA,RB,n,X]=liezhu(A,b)
B=[A b]; n=length(b); RA=rank(A);
RB=rank(B);zhica=RB-RA;
if zhica>0,
disp('请注意:因为RA~=RB,所以此方程组无解.')
return
end
if RA==RB
if RA==n
disp('请注意:因为RA=RB=n,所以此方程组有唯一解.')
X=zeros(n,1); C=zeros(1,n+1);
for p= 1:n-1
[Y,j]=max(abs(B(p:n,p))); C=B(p,:);
B(p,:)= B(j+p-1,:); B(j+p-1,:)=C;
for k=p+1:n
m= B(k,p)/ B(p,p);
B(k,p:n+1)= B(k,p:n+1)-m* B(p,p:n+1);
end
end
b=B(1:n,n+1);A=B(1:n,1:n); X(n)=b(n)/A(n,n);
for q=n-1:-1:1 X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);
end
else
disp('请注意:因为RA=RB<n,所以此方程组有无穷多解.')
end
end
在MATLAB工作窗口输入程序:
>> A=[0.101 2.304 3.555;-1.347 3.712 4.623;-2.835 1.072 5.643];
b=[1.183;2.137;3.035];
[RA,RB,n,x]=liezhu(A,b)
运行结果RA =
3
RB =
3
n =
3
x =
-0.3982
0.0138
0.3351
2.主程序
function X=LUjfcz(A,b)
[n,n] =size(A);
X=zeros(n,1);
Y=zeros(n,1);
C=zeros(1,n);
r=1:n;
for p=1:n-1
[max1,j]=max(abs(A(p:n,p)));
C=A(p,:);
A(p,:)= A(j+p-1,:);
A(j+p-1,:)=C;
g=r(p);
r(p)= r(j+p-1);
r(j+p-1)=g;
if A(p,p)==0
disp('A是奇异阵,方程组无唯一解');
break;
end
for k=p+1:n
H= A(k,p)/A(p,p);
A(k,p) = H;
A(k,p+1:n)=A(k,p+1:n)- H* A(p,p+1:n);
end
end
Y(1)=b(r(1));
for k=2:n
Y(k)= b(r(k))- A(k,1:k-1)* Y(1:k-1);
end
X(n)= Y(n)/ A(n,n);
for i=n-1:-1:1
X(i)= (Y(i)- A(i, i+1:n) * X (i+1:n))/ A(i,i);
end
在MATLAB工作窗口输入程序:
>> A=[1 2 -12 8;5 4 7 -2;-3 7 9 5;6 -12 -8 3];
b=[27;4;11;49];
X=LUjfcz(A,b)
运行结果
X =
3.0000
-2.0000
1.0000
5.0000
实验四、解线性方程组的迭代法
一、实验目的
1、熟悉迭代法的有关理论和方法;
2、会编制雅可比迭代法、高斯-塞德尔迭代法的程序;
3、注意所用方法的收敛性及其收敛速度问题。
二.实验原理
解线性方程组的迭代法是用某种极限过程去逐步逼近线性方程组精确解的方法,即是从一个初始向量 出发,按照一定的迭代格式产生一个向量序列 ,使其收敛到方程组 的解。迭代法的优点是所需计算机存储单元少,程序设计简单,原始系数矩阵在计算过程中始终不变等。但迭代法存在收敛性及收敛速度问题。迭代法是解大型稀疏矩阵方程组的重要方法。
三.实验内容
1.用改进欧拉法解.
2.用龙格-库塔方法求解
四.实验程序及运行结果
1.主程序
function X=jacdd(A,b,X0,P,wucha,max1)
[n m]=size(A);
for j=1:m
a(j)=sum(abs(A(:,j)))-2*(abs(A(j,j)));
end
for k=1:max1
k
for j=1:m
X(j)=(b(j)-A(j,[1:j-1,j+1:m])*X0([1:j-1,j+1:m]))/A(j,j);
end
X,djwcX=norm(X'-X0,P); xdwcX=djwcX/(norm(X',P)+eps); X0=X';X1=A\b;
if (djwcX<wucha)&(xdwcX<wucha)
disp('请注意:雅可比迭代收敛,此方程组的精确解jX和近似解X如下:')
return
end
end
if (djwcX>wucha)&(xdwcX>wucha)
disp('请注意:雅可比迭代次数已经超过最大迭代次数max1 ')
end
a,X=X;jX=X1',
在MATLAB工作窗口输入程序:
>> A=[1 2 -2;1 1 1;2 2 1];
b=[7;2;5];
X=jacdd(A,b,X0,P,wucha,max1)
运行结果
X =
1 2 -1
2.主程序
function X=gsdddy(A,b,X0,P,wucha,max1)
D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1); dD=det(D);
if dD==0
disp('请注意:因为对角矩阵D奇异,所以此方程组无解.')
else
disp('请注意:因为对角矩阵D非奇异,所以此方程组有解.')
iD=inv(D-L); B2=iD*U;f2=iD*b;jX=A\b; X=X0;
[n m]=size(A);
for k=1:max1
X1= B2*X+f2; djwcX=norm(X1-X,P);
xdwcX=djwcX/(norm(X,P)+eps);
if (djwcX<wucha)|(xdwcX<wucha)
return
else
k,X1',k=k+1;X=X1;
end
end
if (djwcX<wucha)|(xdwcX<wucha)
disp('请注意:高斯-塞德尔迭代收敛,此A的分解矩阵D,U,L和方程组的精确解jX和近似解X如下: ')
else
disp('请注意:高斯-塞德尔迭代的结果没有达到给定的精度,并且迭代次数已经超过最大迭代次数max1,方程组的精确解jX和迭代向量X如下: ')
X=X';jX=jX'
end
end
X=X';D,U,L,jX=jX'
在MATLAB工作窗口输入程序:
>> A=[1 0.9 0.9;0.9 1 0.9;0.9 0.9 1];
b=[1.9;2.0;1.7];
X0=[0 0 0]';
X=gsdddy(A,b,X0,inf, 0.001,100)
运行结果
k =
1
ans =
1.9000 0.2900 -0.2710
k =
2
ans =
1.8829 0.5493 -0.4890
k =
3
ans =
1.8457 0.7789 -0.6622
k =
4
ans =
1.7949 0.9805 -0.7979
k =
5
ans =
1.7356 1.1560 -0.9025
k =
6
ans =
1.6718 1.3076 -0.9815
k =
7
ans =
1.6065 1.4375 -1.0396
k =
8
ans =
1.5419 1.5479 -1.0808
k =
9
ans =
1.4796 1.6411 -1.1086
k =
10
ans =
1.4208 1.7191 -1.1259
k =
11
ans =
1.3661 1.7838 -1.1349
k =
12
ans =
1.3160 1.8370 -1.1377
k =
13
ans =
1.2706 1.8804 -1.1359
k =
14
ans =
1.2300 1.9153 -1.1308
k =
15
ans =
1.1939 1.9432 -1.1234
k =
16
ans =
1.1622 1.9651 -1.1145
k =
17
ans =
1.1345 1.9820 -1.1049
k =
18
ans =
1.1106 1.9949 -1.0949
k =
19
ans =
1.0900 2.0044 -1.0850
k =
20
ans =
1.0725 2.0112 -1.0754
k =
21
ans =
1.0577 2.0159 -1.0662
k =
22
ans =
1.0453 2.0188 -1.0577
k =
23
ans =
1.0350 2.0204 -1.0499
k =
24
ans =
1.0265 2.0210 -1.0428
k =
25
ans =
1.0196 2.0209 -1.0364
k =
26
ans =
1.0140 2.0202 -1.0308
k =
27
ans =
1.0095 2.0191 -1.0258
k =
28
ans =
1.0060 2.0178 -1.0214
k =
29
ans =
1.0032 2.0164 -1.0176
k =
30
ans =
1.0012 2.0148 -1.0144
X =
0.9985
2.0118
-1.0093
实验心得
通过本次实验,我学会了将在课堂上学到的一些基本的数值分析方法运用到实践之中进行数值分析,感受到了利用计算机这个工具解决实际计算的优越性,由此也明白了为了更简单、更快速地得到一个更准确的结果,选择一个好的算法的重要性。因此,我们在今后的学习工作中应该更加重视算法的设计。另外,由于自己之前没有学习Matlab语言,所以在实验时遇到了很多问题,这次实验同时也明白了要学好Matlab语言的重要性。今后一定要利用自己的课余时间补上这一课,为将来工作中的运用打下坚实的基础。
实验报告一题目非线性方程求解摘要非线性方程的解析解通常很难给出因此线性方程的数值解法就尤为重要本实验采用两种常见的求解方法二分法和…
数值分析实验报告册课程实验报告专业年级课程名称数值分析指导教师学生姓名学号实验日期实验地点实验成绩教务处制20xx年6月20日实验…
数值分析报告运用Matlab求解非线性方程的根学院专业班级姓名学号数值分析报告1目的掌握非线性方程求根的方法并选取实例运用MATL…
数值分析课程设计实验报告姓名陈浩学号081002102班级091002指导老师任林源完成日期20xx7目录一丶概述二丶设计内容三丶…
武汉大学数学与统计学院数值分析实验报告武汉大学数学与统计学院数值分析原始书记记录实验名称关于正定矩阵cholesky分解的研究实验…
武汉大学数学与统计学院数值分析实验报告武汉大学数学与统计学院数值分析原始书记记录实验名称关于正定矩阵cholesky分解的研究实验…
武汉大学数学与统计学院数值分析实验报告武汉大学数学与统计学院数值分析原始书记记录实验名称关于正定矩阵cholesky分解的研究实验…
一Newton插值法includeltstdiohgtdefineMAXN20typedefstructtagPOINTdoubl…
实验报告一题目非线性方程求解摘要非线性方程的解析解通常很难给出因此线性方程的数值解法就尤为重要本实验采用两种常见的求解方法二分法和…