最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

数值分析实验报告1

来源:动视网 责编:小OO 时间:2025-10-01 17:31:56
文档

数值分析实验报告1

实验一误差分析实验1.1(病态问题)实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。问题提出:考虑一个高次的代数多项式显然该多项式的全部根为1,2,…,20共计20个
推荐度:
导读实验一误差分析实验1.1(病态问题)实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。问题提出:考虑一个高次的代数多项式显然该多项式的全部根为1,2,…,20共计20个
 

实验一   误差分析

实验1.1(病态问题)

实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。

数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。

问题提出:考虑一个高次的代数多项式

显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。现考虑该多项式的一个扰动

其中是一个非常小的数。这相当于是对(1.1)中的系数作一个小的扰动。我们希望比较(1.1)和(1.2)根的差别,从而分析方程(1.1)的解对扰动的敏感性。

实验内容:为了实现方便,我们先介绍两个Matlab函数:“roots”和“poly”。

其中若变量a存储n+1维的向量,则该函数的输出u为一个n维的向量。设a的元素依次为,则输出u的各分量是多项式方程

的全部根;而函数

的输出b是一个n+1维变量,它是以n维变量v的各分量为根的多项式的系数。可见“roots”和“poly”是两个互逆的运算函数。

上述简单的Matlab程序便得到(1.2)的全部根,程序中的“ess”即是(1.2)中的。

实验要求:

(1)选择充分小的ess,反复进行上述实验,记录结果的变化并分析它们。如果扰动项的系数很小,我们自然感觉(1.1)和(1.2)的解应当相差很小。计算中你有什么出乎意料的发现?表明有些解关于如此的扰动敏感性如何?

(2)将方程(1.2)中的扰动项改成或其它形式,实验中又有怎样的现象出现?

(3)(选作部分)请从理论上分析产生这一问题的根源。注意我们可以将方程(1.2)写成展开的形式,

同时将方程的解x看成是系数的函数,考察方程的某个解关于的扰动是否敏感,与研究它关于的导数的大小有何关系?为什么?你发现了什么现象,哪些根关于的变化更敏感?

思考题一:(上述实验的改进)

在上述实验中我们会发现用roots函数求解多项式方程的精度不高,为此你可以考虑用符号函数solve来提高解的精确度,这需要用到将多项式转换为符号多项式的函数poly2sym,函数的具体使用方法可参考Matlab的帮助。

实验过程:

程序:

a=poly(1:20);

rr=roots(a);

for n=2:21

    n

    for m=1:9

        ess=10^(-6-m);

ve=zeros(1,21);

        ve(n)=ess;

r=roots(a+ve);

        -6-m

        s=max(abs(r-rr))

    end

end

利用符号函数:(思考题一)

a=poly(1:20);

y=poly2sym(a);

rr=solve(y)

for n=2:21

    n

    for m=1:8

        ess=10^(-6-m);

        ve=zeros(1,21);

        ve(n)=ess;

        a=poly(1:20)+ve;

        y=poly2sym(a);

        r=solve(y);

        -6-m

        s=max(abs(r-rr))

    end

end

数值实验结果及分析:

format long

-6-m  n-7-8-9-10
22.797226874783311.867536320091581.060527623807480.25273144219047
31.693766997674240.9231066670690.084716145697410.408040209411
40.854013934155360.199********0610.039729352958340
50.11031100538871.0429********00
60000
70000
80000
90000
100000
110000
120000
130000
140000
150000
160000
170000
180000
190000
200000
210000
-6-m  n-11-12-13-14
20.0387767393800.162565848682800.133********5980
3.021*********000
40000
50000
60000
70000
80000
90000
100000
110000
120000
130000
140000
150000
160000
170000
180000
190000
200000
210000
讨论:

利用这种方法进行这类实验,可以很精确的扰动敏感性的一般规律。即当对扰动项的系数越来越小时,对其多项式扰动的结果也就越来越小,即扰动敏感性与扰动项的系数成正比,扰动项的系数越大,对其根的扰动敏感性就越明显,当扰动的系数一定时,扰动敏感性与扰动的项的幂数成正比,扰动的项的幂数越高,对其根的扰动敏感性就越明显。

实验总结: 

利用MATLAB来进行病态问题的实验,虽然其得出的结果是有误差的,但是可以很容易的得出对一个多次的代数多项式的其中某一项进行很小的扰动,对其多项式的根会有一定的扰动的,所以对于这类病态问题可以借助于MATLAB来进行问题的分析。

学号:050210

姓名:万轩

实验二   插值法

实验2.1(多项式插值的振荡现象)

问题提出:考虑一个固定的区间上用插值逼近一个函数。显然拉格朗日插值中使用的节点越多,插值多项式的次数就越高。 我们自然关心插值多项式的次数增加时,L(x)是否也更加靠近被逼近的函数。龙格给出了一个极著名例子。设区间[-1,1]上函数

                        f(x)=1/(1+25x^2)

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

            x(i)=-1+2i/n,i=0,1,2…,n

泽拉格朗日插值多项式为:

            L(x)=∑l(i)(x)/(1+25x(j)^2 ) i=0,1,…n

其中l(i)(x), i=0,1,…n,n是n次拉格朗日插值基函数。

实验要求:

⑴ 选择不断增大的分点数目n=2,3…,画出f(x)及插值多项式函数L(x)在[-1,1]上的图象,比较分析实验结果。

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

          h(x)=x/(1+x^4) ,  g(x)=arctanx

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

     (3)区间[a,b]上切比雪夫点的定义为:

              xk=(b+a)/2+((b-a)/2)cos((2k-1)π/(2(n+1))),k=1,2,^,n+1

          以x1,x2^x(n+1)为插值节点构造上述各函数的拉格朗日插值多项式,比较其结果。

实验过程:

程序:

多项式插值的震荡现象(实验2.1)

for m=1:6

    subplot(2,3,m)                  %把窗口分割成2*3大小的窗口

    largrang(6*m)                  %对largrang函数进行运行

    if m==1

        title('longn=6')

    elseif m==2

        title('longn=12')

    elseif m==3

        title('longn=18')

    elseif m==4

        title('longn=24')

    elseif m==5

        title('longn=30')

    elseif m==6

        title('longn=36')

    end                        %对每个窗口分别写上标题为插值点的个数

end

保存为:chazhi.m

function largrang(longn)

mm=input('please input mm(运行第几个函数就输入mm为几):mm=')

if mm==1                         %d表示定义域的边界值

    d=1;

elseif mm==2||mm==3

    d=5;

end

x0=linspace(-d,d,longn);              %x的节点

if mm==1

    y0=1./(1.+25.*x0.^2);

elseif mm==2

    y0=x0./(1.+x0.^4);

elseif mm==3

    y0=atan(x0);

end

x=sym('x');n=length(x0); s=0.0;

for k=1:n

    p=1.0;

    for j=1:n

        if j~=k

            p=p*(x-x0(j))/(x0(k)-x0(j));

        end

    end

    s=p*y0(k)+s;

end

y=s;

if mm==1

    ezplot('1/(1+25*x^2)')

elseif mm==2

    ezplot('x/(1+x^4)')

elseif mm==3

    ezplot('atan(x)')

end

hold on

ezplot(y,[-d,d])

hold off

保存为:largrang.m

数值实验结果及分析:

对于第一个函数f(x)=1/(1+25x2)

对于第二个函数h(x)=x/(1+x4)

对于第三个函数g(x)=arctan(x)

讨论:

通过对三个函数得出的largrang插值多项式并在数学软件中的运行,得出函数图象,说明了对函数的支点不是越多越好,而是在函数的两端而言支点越多,而largrang插值多项式不是更加靠近被逼近的函数,反而更加远离函数,在函数两端的跳动性更加明显,argrang插值多项式对函数不收敛。

实验总结:

利用MATLAB来进行函数的largrang插值多项式问题的实验,虽然其得出的结果是有误差的,但是增加支点的个数进行多次实验,可以找出函数的largrang插值多项式的一般规律,当支点增加时,largrang插值多项式对函数两端不收敛,不是更加逼近,而是更加远离,跳动性更强。所以对于函数的largrang插值多项式问题可以借助于MATLAB来进行问题的分析,得到比较准确的实验结规律。

学号:050210

姓名:万轩

实验五  解线性方程组的直接方法

实验5.1 (主元的选取与算法的稳定性)

问题提出:Gauss消去法是我们在线性代数中已经熟悉的。但由于计算机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保Gauss消去法作为数值算法的稳定性呢?Gauss消去法从理论算法到数值算法,其关键是主元的选择。主元的选择从数学理论上看起来平凡,它却是数值分析中十分典型的问题。

实验内容:考虑线性方程组

          

编制一个能自动选取主元,又能手动选取主元的求解线性方程组的Gauss消去过程。

实验要求:

(1)取矩阵,则方程有解。取n=10计算矩阵的条件数。让程序自动选取主元,结果如何?

(2)现选择程序中手动选取主元的功能。每步消去过程总选取按模最小或按模尽可能小的元素作为主元,观察并记录计算结果。若每步消去过程总选取按模最大的元素作为主元,结果又如何?分析实验的结果。

(3)取矩阵阶数n=20或者更大,重复上述实验过程,观察记录并分析不同的问题及消去过程中选择不同的主元时计算结果的差异,说明主元素的选取在消去过程中的作用。

(4)选取其他你感兴趣的问题或者随机生成矩阵,计算其条件数。重复上述实验,观察记录并分析实验结果。

实验过程:

程序:

建立M文件:

function x=gauss(n,r)

n=input('请输入矩阵A的阶数:n=')

A=diag(6*ones(1,n))+diag(ones(1,n-1),1)+diag(8*ones(1,n-1),-1)

b=A*ones(n,1)

p=input('条件数对应的范数是p-范数:p=')

pp=cond(A,p)

pause

[m,n]=size(A);

nb=n+1;Ab=[A b]

r=input('请输入是否为手动,手动输入1,自动输入0:r=')

for i=1:n-1

    if r==0

      [pivot,p]=max(abs(Ab(i:n,i)));

      ip=p+i-1;

      if ip~=i

         Ab([i ip],:)=Ab([ip i],:);disp(Ab); pause

      end

    end  

    if r==1

        i=i

        ip=input('输入i列所选元素所处的行数:ip=');

        Ab([i ip],:)=Ab([ip i],:);disp(Ab); pause

    end    

    pivot=Ab(i,i);

    for k=i+1:n

        Ab(k,i:nb)=Ab(k,i:nb)-(Ab(k,i)/pivot)*Ab(i,i:nb);

    end

    disp(Ab); pause

end

x=zeros(n,1);x(n)=Ab(n,nb)/Ab(n,n);

for i=n-1:-1:1

   x(i)=(Ab(i,nb)-Ab(i,i+1:n)*x(i+1:n))/Ab(i,i);

end

数值实验结果及分析:

⑴取矩阵A的阶数:n=10,自动选取主元:

>> format long

>> gauss

请输入矩阵A的阶数:n=10

n =    10

条件数对应的范数是p-范数:p=1

p =     1

pp =    2.557500000000000e+003

请输入是否为手动,手动输入1,自动输入0:r=0

r =     0

⑵取矩阵A的阶数:n=10,手动选取主元:

①选取绝对值最大的元素为主元:

>> gauss

请输入矩阵A的阶数:n=10

n =    10

条件数对应的范数是p-范数:p=2

p =     2

pp=    1.727556024913903e+003

请输入是否为手动,手动输入1,自动输入0:r=1

r =     1

ans=     1     1     1     1     1     1     1     1     1     1

②选取绝对值最小的元素为主元:

>> gauss

请输入矩阵A的阶数:n=10

n =    10

条件数对应的范数是p-范数:p=2

p =     2

pp =    1.727556024913903e+003

请输入是否为手动,手动输入1,自动输入0:r=1

r =     1

ans =

   1.00000000000000    1.00000000000000    1.00000000000000

 1.00000000000000    1.00000000000000    1.00000000000000

   0.99999999999999    1.00000000000001    0.99999999999998

   1.00000000000003

⑶取矩阵A的阶数:n=20,手动选取主元:

1选取绝对值最大的元素为主元:

>> gauss

请输入矩阵A的阶数:n=20

条件数对应的范数是p-范数:p=1

p =     1

pp =    2.621437500000000e+006

ans =   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 1  1  1

2选取绝对值最小的元素为主元:

>> gauss

请输入矩阵A的阶数:n=20.

n =    20

条件数对应的范数是p-范数:p=2

p =     2

pp =     1.7670565881683e+006

请输入是否为手动,手动输入1,自动输入0:r=1

r =     1

ans =

   1.00000000000000    1.00000000000000    1.00000000000000 1.00000000000000    1.00000000000000    1.00000000000000  1.00000000000001    0.99999999999997    1.00000000000006

   0.999999999999    1.00000000000023    0.99999999999955

   1.00000000000090    0.99999999999821    1.00000000000352

   0.99999999999318    1.00000000001273    0.99999999997817

   1.00000000002910

⑷将M文件中的第三行:

A=diag(6*ones(1,n))+diag(ones(1,n-1),1)+diag(8*ones(1,n-1),-1)

改为:

A=hilb(n)

①>> gauss

请输入矩阵A的阶数:n=7

n =     7

条件数对应的范数是p-范数:p=1

p =     1

pp =     9.851948872610030e+008

请输入是否为手动,手动输入1,自动输入0:r=1

r =     1

ans =

   1.00000000000051    0.99999999997251    1.00000000031354

   0.999999998133    1.00000000268805    0.99999999754181

   1.00000000084337

②>> gauss

请输入矩阵A的阶数:n=7

n =     7

条件数对应的范数是p-范数:p=2

p =     2

pp =     4.753673569067072e+008

请输入是否为手动,手动输入1,自动输入0:r=1

r =     1

ans =

   0.99999999999869    1.00000000004337    0.999999999299

   1.00000000121143    0.99999999803038    1.00000000152825

   0.99999999954491

该问题在主元选取与算出结果有着很大的关系,取绝对值大的元素作为主元比取绝对值小的元素作为主元时产生的结果比较准确,即选取绝对值小的主元时结果产生了较大的误差,条件数越大产生的误差就越大。

讨论:

在gauss消去法解线性方程组时,主元的选择与算法的稳定性有密切的联系,选取绝对值大的元素作为主元比绝对值小的元素作为主元时对结果产生的误差较小。条件数越大对用gauss消去法解线性方程组时,对结果产生的误差就越大。

实验总结:

对用gauss消去法解线性方程组时,主元的选取与算法的稳定性有密切的联系,选取适当的主元有利于得出稳定的算法,在算法的过程中,选取绝对值较大的主元比选取绝对值较小的主元更有利于算法的稳定,选取绝对值最大的元素作为主元时,得出的结果相对较准确较稳定。条件数越小,对用这种方法得出的结果更准确。在算除法的过程中要尽量避免使用较小的数做为除数,以免发生结果数量级加大,使大数吃掉小数,产生舍入误差。

学号:050210

姓名:万轩

实验5.2(线性代数方程组的性态与条件数的估计)

问题提出:理论上,线性代数方程组的摄动满足

          

矩阵的条件数确实是对矩阵病态性的刻画,但在实际应用中直接计算它显然不现实,因为计算通常要比求解方程还困难。

实验内容:Matlab中提供有函数“condest”可以用来估计矩阵的条件数,它给出的是按1-范数的条件数。首先构造非奇异矩阵A和右端,使得方程是可以精确求解的。再人为地引进系数矩阵和右端的摄动,使得充分小。

实验要求:

(1)假设方程Ax=b的解为x,求解方程,以1-范数,给出的计算结果。

(2)选择一系列维数递增的矩阵(可以是随机生成的),比较函数“condest”所需机器时间的差别.考虑若干逆是已知的矩阵,借助函数“eig”很容易给出cond2(A)的数值。将它与函数“cond(A,2)”所得到的结果进行比较。

(3)利用“condest”给出矩阵A条件数的估计,针对(1)中的结果给出的理论估计,并将它与(1)给出的计算结果进行比较,分析所得结果。注意,如果给出了cond(A)和的估计,马上就可以给出的估计。

(4)估计著名的Hilbert矩阵的条件数。

实验过程:

程序:

n=input('please input n:n=')          %输入矩阵的阶数

a=fix(100*rand(n))+1              %随机生成一个矩阵a

x=ones(n,1)                      %假设知道方程组的解全为1

b=a*x                          %用矩阵a和以知解得出矩阵b

data=rand(n)*0.00001             %随即生成扰动矩阵data

datb=rand(n,1)*0.00001           %随即生成扰动矩阵datb

A=a+data

B=b+datb

xx=geshow(A,B)                 %解扰动后的解

x0=norm(xx-x,1)/norm(x,1)        %得出的理论结果

保存为:fanshu.m

function x=geshow(A,B)          %用高斯消去法解方程组

[m,n]=size(A);

nb=n+1;AB=[A B];

for i=1:n-1

    pivot=AB(i,i);

    for k=i+1:n

        AB(k,i:nb)=AB(k,i:nb)-(AB(k,i)/pivot)*AB(i,i:nb);

    end

end

x=zeros(n,1);

x(n)=AB(n,nb)/AB(n,n);

for i=n-1:-1:1

    x(i)=(AB(i,nb)-AB(i,i+1:n)*x(i+1:n))/AB(i,i);

end

保存为:geshow.m

function cond2(A)           %自定义求二阶条件数

B=A'*A;

[V1,D1]=eig(B);

[V2,D2]=eig(B^(-1));

cond2A=sqrt(max(max(D1)))*sqrt(max(max(D2)))

end

保存为:cond2.m

format long

for n=10:10:100

n=n                  %n为矩阵的阶

    A=fix(100*randn(n));   %随机生成矩阵A

    condestA=condest(A)   %用condest求条件数

    cond2(A)             %用自定义的求条件数

    condA2=cond(A,2)     %用cond求条件数

    pause                %运行一次暂停

end

保存为:shiyan52.m

n=input('please input n:n=')       %输入矩阵的阶数

a=fix(100*rand(n))+1;           %随机生成一个矩阵a

x=ones(n,1);                   %假设知道方程组的解全为1

b=a*x;                        %用矩阵a和以知解得出矩阵b

data=rand(n)*0.00001;           %随即生成扰动矩阵data

datb=rand(n,1)*0.00001;         %随即生成扰动矩阵datb

A=a+data;

B=b+datb;

xx=geshow(A,B);                %利用第一小问的geshow.m求出解阵

x0=norm(xx-x,1)/norm(x,1)        %得出的理论结果

x00=cond(A)/(1-norm(inv(A))*norm(xx-x))*(norm((xx-x))/(norm(A))+norm(datb)/norm(B))                        %得出的估计值

datx=abs(x0-x00)                %求两者之间的误差

保存为:sy5_2.m

format long

for n=4:11

    n=n                       %n为矩阵的阶数

Hi=hilb(n);                 %生成Hilbert矩阵

cond1Hi=cond(Hi,1)         %求Hilbert矩阵得三种条件数

    cond2Hi=cond(Hi,2)

    condinfHi=cond(Hi,inf)

    pause

end

数值实验结果及分析:

⑴>> fanshu

please input n:n=6

n =

     6

a =

    14    25    16    88    19    

    32    93    85    48    92    60

    14    40    88    50    13    16

    23    52    19    29     2    32

    40    10   100     7    37    24

    14     3    72    27    70     1

x = 

    1     1     1     1     1     1

b =

   251   410   221   157   218   187

data =  

1.0e-005 *

   0.39690379186910   0.78196184196050   0.63712194084590   0.820368228574   0.66093213223947   0.514880318783

   0.986813059250   0.23756508204022   0.54592415509902   0.97047237460911   0.35801711338781   0.22157934638561

   0.08500060621463   0.19573076378328   0.84805722441693   0.48692499554190   0.93819943010121   0.72500937095222

   0.76880950325876   0.26321391517561   0.80209765848011   0.81746853554695   0.487666974787   0.06824661097009

   0.96970170497170   0.713785059614   0.668301006672   0.157116784600   0.09099035774397   0.912426837254

   0.71479723187621   0.97759973943565   0.67098263396985   0.30634935951390   0.67383411686207   0.20765658836866

datb =

  1.0e-005 *

   0.16111822555138   0.63822138259275   0.000228172162

   0.33563294335217   0.27509982146621   0.04452752039203

A = 

 1.0e+002 *

   0.14000003969038   0.25000007819618   0.16000006371219   0.880000082037   0.19000006609321   0.000005148803

   0.320000098681   0.93000002375651   0.85000005459242   0.48000009704724   0.92000003580171   0.60000002215793

   0.14000000850006   0.40000001957308   0.88000008480572   0.50000004869250   0.130********994   0.16000007250094

   0.23000007688095   0.52000002632139   0.19000008020977   0.29000008174685   0.02000004876670   0.32000000682466

   0.40000009697017   0.10000007137851   1.000000066830   0.070000015712   0.37000000909904   0.240000091243

   0.14000007147972   0.03000009775997   0.72000006709826   0.27000003063494   0.70000006738341   0.01000002076566

B =

  1.0e+002 *

   2.51000001611182   4.10000006382214   2.21000000002282

   1.57000003356329   2.180********998   1.87000000445275

xx =

   0.99999830779720   1.00000022569555   1.00000019341555

   0.99999909388073   0.999999964021   1.00000066032794

x0 =

    6.181368174725440e-007

的计算结果为:6.181368174725440e-007

(2)

NcondestAcond2AcondA2
101.152********3102

e+002

32.05456307542132.054563075420
203.470959631940668

e+002

65.54122384176665.54122384178720
306.050503865112835

e+002

1.126539755706398

e+002

1.126539755706322

e+002

403.5494872582470

e+002

61.3753756968344861.37537569683365
506.855018184779408

e+002

81.12139375359481.121393753482
601.0820046509367

e+004

1.704830815154781

e+003

1.704830815108527

e+003

703.234679145192132

e+003

3.878481155980936

e+002

3.878481155978439

e+002

808.318226153918658

e+002

86.2381429985251386.23814299853018
902.063634143407935

e+003

2.120696*********

e+002

2.120696*********

e+002

1001.5365928187587

e+003

1.559132035738491

e+002

1.559132035738373

e+002

>> sy5_2

please input n:n=8

n =     8

x0 =    1.095033343195828e-006

x00 =    1.705456352162135e-005

datx =    1.595953017842553e-005

给出对的估计是:1.705456352162135e-005

的理论结果是:  1.095033343195828e-006

结果相差:                 1.595953017842553e-005

(4)

ncond1Hicond2HicondinfHi
42.837499999999738

e+004

1.5513738732786

e+004

2.837499999999739

e+004

59.4365599999993

e+005

4.766072502414135

e+005

9.436559999999336

e+005

62.907027900294878

e+007

1.4951058009243

e+007

2.9070279002940

e+007

79.8519487194700

e+008

4.7536735658586

e+008

9.8519487198483

e+008

83.387279082022742

e+010

1.525757545841988

e+010

3.387279081949470

e+010

9.0996********

e+012

4.9315444391016

e+011

.0996********

e+012

103.535372424347474

e+013

1.602528637652488

e+013

3.5353724553752

e+013

111.230369955362001

e+015

5.223946*********

e+014

1.230369938308720

e+015

讨论:

线性代数方程组的性态与条件数有着很重要的关系,既矩阵的条件数是刻画矩阵性质的一个重要的依据,条件数越大,矩阵“病态”性越严重,在解线性代数方程组的过程中较容易产生比较大的误差,则在实际问题的操作过程中,我们必须要减少对条件数来求解,把条件数较大的矩阵化成条件数较小的矩阵来进行求解。

实验总结:

在本次实验中,使我们知道了矩阵条件数对线性代数方程组求解的影响,条件数越大,对最后解的影响的越大,hilbert矩阵是一个很”病态”的矩阵,他的条件数随着阶数的增加而增大,每增加一阶,条件数就增大一个数量级,在求解的过程中要尽量避免hilbert矩阵

学号:050210

姓名:万轩

实验七  非线性方程求根

实验7.1(迭代法、初始值与收敛性)

实验目的:初步认识非线性问题的迭代法与线性问题迭代法的差别,探讨迭代法及初始值与迭代收敛性的关系。

问题提出:迭代法是求解非线性方程的基本思想方法,与线性方程的情况一样,其构造方法可以有多种多样,但关键是怎样才能使迭代收敛且有较快的收敛速度。

实验内容:考虑一个简单的代数方程

          

针对上述方程,可以构造多种迭代法,如

  

在实轴上取初始值x0,请分别用迭代(7.1)-(7.3)作实验,记录各算法的迭代过程。

实验要求:

(1)取定某个初始值,分别计算(7.1)-(7.3)迭代结果,它们的收敛性如何?重复选取不同的初始值,反复实验。请自选设计一种比较形象的记录方式(如利用Matlab的图形功能),分析三种迭代法的收敛性与初值选取的关系。

(2)对三个迭代法中的某个,取不同的初始值进行迭代,结果如何?试分析迭代法对不同的初值是否有差异?

(3)线性方程组迭代法的收敛性是不依赖初始值选取的。比较线性与非线性问题迭代的差异,有何结论和问题。

实验过程:

程序:

clear

clc

s=input('请输入要运行的方程,运行第几个输入几s=');

clf

if s==1                            %决定坐标轴的范围和初始值

a=-1.5;b=2.5; y00=0; x00=input('请输入第一个函数的初值:x00=');

elseif s==2

a=0.1;b=6.5; y00=0; x00=input('请输入第二个函数的初值:x00=');

elseif s==3

a=0;b=2; y00=0; x00=input('请输入第三个函数的初值:x00=');

end

x=linspace(a,b,80);

y0=x;                                %计算直线y=x

y1=zxy7f(x,s);                       %计算迭代函数y=f(x)

clear y;

y=[y0;y1];

if s==1                                %画图

plot(x,y,'linewidth',1)

legend('y=x','y=f1')

    title('x(n+1)=[x(n)]^2-1')    %输出标题

elseif s==2

plot(x,y,'linewidth',2)

legend('y=x','y=f2')

    title('x(n+1)=1+1/x(n)')

elseif s==3

plot(x,y,'linewidth',3)

legend('y=x','y=f3')

    title('x(n+1)=sqrt[x(n)+1]')

end

hold on

plot([a b],[0,0],'k-',[0 0],[a b],'k-')

axis([a,b,a,b])                %画坐标轴

z=[];

for i=1:15                      %画蛛网图,迭代过程为n=15次

xt(1)=x00;yt(1)=y00;      %决定始点坐标

xt(2)=zxy7f(xt(1),s);     %决定终点坐标

yt(2)=zxy7f(xt(1),s);

zxyplot7(xt,yt,0.6)        %画蛛网图

if i<=5

        pause                    %按任意键逐次观察前5次迭代的蛛网图

    end

x00=xt(2);y00=yt(2);       %将本次迭代的终点作为下次的始点

z=[z,xt(1)];                 %保存迭代点

end

保存为:zxy7.m

function y=zxy7f(x,s)

if s==1

    y=(x.*x-1);

elseif s==2

    y=(1+1./x);

elseif s==3

    y=sqrt(x+1);

end

保存为:zxy7f.m

function out=zxyplot7(x,y,p)%画一次迭代的蛛网图,改变p调节箭头的大小

u(1)=0;v(1)=(y(2)-y(1));  %画出始点(x(1),y(1))终点(x(2),y(2))的有向折线段

u(2)=eps;v(2)=eps;

h=quiver([x(1) x(1)],

[y(1) y(2)],u,v,p);

set(h,'color','red');

hold on

u(1)=(x(2)-x(1));v(1)=0;

u(2)=eps;v(2)=eps;

h=quiver([x(1) x(2)],

[y(2) y(2)],u,v,p);

set(h,'color','red');

plot([x(1) x(1) x(2)],[y(1) y(2) y(2)],'r.-')

保存为:zxyplot7.m

数值实验结果及分析:

对于第一个迭代方程

x00=1.5

x00=0.5

x00=0.8 

x00=1.2

对于第二个迭代方程

x00=0.5

x00=3.0

x00=0.2                           

x00=5.0

对于第三个迭代方程

x00=0.2                          

x00=1.0

x00=0.6                           

x00=1.4

对于这三种迭代方程,第一个迭代方程不收敛,第二个和第三个迭代方程收敛。对于同一个迭代方程,去不同的初植,收敛的速度也是不相同的,对于第二个迭代方程,取得初始值点处对应迭代方程点处的斜率的绝对值越小,收敛速度越快。

讨论:

用迭代法来求非线性方程的根,对于同一个方程有多种不同的迭代方程,用不同的迭代法进行迭代,得到的结果也有所不同,有的收敛有的不收敛,通过上面的实验,可以得出:迭代方程收敛性与迭代方程的坡度有关,即曲线的斜率有关,斜率越小的收敛性就越好,收敛速度越快,得到真解所需要的迭代数就越少;对同一个迭代方程取不同的初始值,对迭代方程的收敛速度也有一定的影响。

对于解线性方程组用迭代法的收敛性,取决于迭代方法的系数矩阵的普半径的大小,普半径小于1就收敛,于初值的选取无关,而对于解非线性方程的根用迭代法求解的收敛性取决于迭代方程的斜率,取定初始点的斜率小于1就收敛,于初值的选取有关。

实验总结:

对于非线性方程的迭代法求根,有多种迭代方法,适当的选取迭代方程和适合的初值,有利于提高迭代方程的迭代速度,减少计算量,较快的得到理想到答案。

文档

数值分析实验报告1

实验一误差分析实验1.1(病态问题)实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。问题提出:考虑一个高次的代数多项式显然该多项式的全部根为1,2,…,20共计20个
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top