数值分析实验报告(包含源程序)

课程实验报告

课程实验报告

课程实验报告

课程实验报告

 

第二篇:数值分析实验报告

实验一、误差分析

一、实验目的

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语言的重要性。今后一定要利用自己的课余时间补上这一课,为将来工作中的运用打下坚实的基础。

相关推荐