矩阵数值分析上机作业

《矩阵与数值分析》课程数值实验报告

教学班号:

任课老师:

学部:

专业:

姓名:

学号:

1.方程在x=3.0附近有根,试写出其三种不同的等价形

式以构成两种不同的迭代格式,再用这两种迭代求根,并绘制误差下降曲线,观察这两种迭代是否收敛及收敛的快慢

newton迭代法

function x=juz1(x1,tol,max)

%x1为初值,tol为误差终止条件,max为最大迭代次数

xo=x1;

T=[];%创建T矩阵储存每次迭代的结果

i=1;

while i

xn=xo-(2*xo^3-5*xo^2-19*xo+42)/(6*xo^2-10*xo-19);

T(i)=xn;

if abs(xn-xo)

disp('迭代法收敛');

disp([xn]);

i

R=xn-T;%计算误差

a=linspace(0,0.1,i);

plot(a,R,'r');%绘制误差下降曲线

title('误差下降曲线');

return;

else

xo=xn;

i=i+1;

end

end

disp('迭代法不收敛');

disp('迭代最大次数的结果为:');

xn

>> juz1(3,10^-5,20)

迭代法收敛

3.5000

i =

6

弦截法

function x=juz11(x1,x2,tol,max)

%x1,x2为初值,tol为误差终止条件,max为最大迭代次数

xo=x1;

xp=x2;

i=1;

while i

xn=xp-(2*xp^3-5*xp^2-19*xp+42)/(2*xp^2+2*xp*xo+2*xo^2-5*xp-5*xo-19); T(i)=xn;

if abs(xn-xp)

disp('迭代法收敛');

disp([xn]);

i

R=xn-T;

a=linspace(0,1,i);

plot(a,R,'r');%绘制误差下降曲线

title('误差下降曲线');

return;

else

xo=xp;

xp=xn;

i=i+1;

end

end

disp('迭代法不收敛');

disp('迭代最大次数的结果为:');

xn

>> juz11(2.9,3,10^-5,20)

迭代法收敛

3.5000

i =

8

2.用复化梯形公式、复化辛普森公式、龙贝格公式求下列定积分,要求绝对误差为

,并将计算结果与精确解进行比较:

(1)(2)

(1)用复化梯形公式求积分

function f=Txing1(a,b,n)

% a,b分别为积分下限和上限,n为划分的区间个数

while n<10^4

h1=(b-a)/n;%h1为积分区间长度

x1=zeros(1,n+1);

for i=1:n+1

x1(i)=a+(i-1)*h1;%计算n+1个节点储存在x1中

end

y1=(2/3)*(x1.^3).*exp(x1.^2);%计算每个节点对应的函数值 to=0;

for i=1:n

to=to+h1/2*(y1(i)+y1(i+1));%用梯形公式求积分

end

h2=(b-a)/(n+1);%h2为积分区间长度

x2=zeros(1,n+2);

for i=1:n+2

x2(i)=a+(i-1)*h2;%计算n+2个节点储存在x2中

end

y2=(2/3)*(x2.^3).*exp(x2.^2);%计算每个节点对应的函数值 tn=0;

for i=1:n+1

tn=tn+h2/2*(y2(i)+y2(i+1));%用梯形公式求积分

end

if abs(tn-to)<0.5*10^(-8)%进行误差判断

I=tn %计算结果

N=n+1 %实际分割区间个数

r=exp(4)-tn %计算误差

return;

else

n=n*2;

end

end

disp('分割区间太长达不到精度要求');

n/2+1

tn

>> Txing1(1,2,5)

I =

54.5982

N =

5121

r =

-5.0604e-06

复化辛普森求积分

function f=Simpson1(a,b,n)

%a,b分别为积分下限和上限

%n为分割区间个数

while n<10^8

T=[];

for n=n:n+1

h1=(b-a)/n;%将积分区间n等分

x1=zeros(1,n+1);

for i=1:n+1

x1(i)=a+(i-1)*h1;%计算n+1个求积节点值并储存在x中

end

z1=(2/3)*x1.^3.*exp(x1.^2);%计算n+1个求积节点处的函数值

y1=zeros(1,n);

for i=1:n

y1(i)=a+(2*i-1)*h1/2;%计算n个区间中点值

end

r1=(2/3)*y1.^3.*exp(y1.^2);%计算n个区间中点对应的函数值

t=0;

for i=1:n;

t=t+h1/6*(z1(i)+4*r1(i)+z1(i+1));%用复化simpson公式求积分end

T=[T,t];

end

if abs(T(2)-T(1))<0.5*10^(-8)%进行误差判断

I=T(2) %计算结果

N=n+1 %实际分割区间个数

r=exp(4)-T(2) %计算误差

return;

else

n=2*n;

end

end

disp('分割区间太长达不到精度要求');

T(2)

n/2+1

>> Simpson1(1,2,3)

I =

54.5982

N =

160

r =

-2.9586e-08

龙贝格公式求积分

function f=romberg1(a,b)

t(1,1)=(b-a)/2*(2*a^3*exp(a^2)/3+2*b^3*exp(b^2)/3);

n=1;

while n<100

for k=1:n

aa=0;

for i=0:(power(2,(k-1))-1);

aa=aa+2*(a+(2*i+1)*(b-a)/2^k)^3*exp((a+(2*i+1)*(b-a)/2^k)^2)/3; end

t(1,k+1)=0.5*t(1,k)+(b-a)/(2^k)*aa;

end

for m=1:n

h=1/((4^m)-1);

for k=m:n

t(m+1,k+1)=((4^m)*t(m,k+1)-t(m,k))*h;

end

end

if (abs(t(n,n)-t(n+1,1+n))<0.5*10^(-8))

I=t(n,n)

return;

else

n=n+1;

end

end

disp('超出最大迭代次数');

>> romberg1(1,2)

I =

54.5982

(2)复化梯形公式求积分

function f=Txing2(a,b,n)

% a,b分别为积分下限和上限,n为划分的区间个数

while n<10000

h1=(b-a)/n;%h为积分区间长度

x1=zeros(1,n+1);

for i=1:n+1

x1(i)=a+(i-1)*h1;%计算n+1个节点储存在x1中 end

y1=2*x1./(x1.^2-3);%计算每个节点对应的函数值

to=0;

for i=1:n

to=to+h1/2*(y1(i)+y1(i+1));%用梯形公式求积分 end

h2=(b-a)/(n+1);%h2为积分区间长度

x2=zeros(1,n+2);

for i=1:n+2

x2(i)=a+(i-1)*h2;%计算n+2个节点储存在x2中 end

y2=2*x2./(x2.^2-3);%计算每个节点对应的函数值

tn=0;

for i=1:n+1

tn=tn+h2/2*(y2(i)+y2(i+1));%用梯形公式求积分 end

if abs(tn-to)<0.5*10^(-8)%进行误差判断

I=tn %计算结果

N=n+1 %实际分割区间个数

r=log(6)-tn %计算结果与精确值比较 return;

else

n=n*2;

end

end

disp('分割区间太长达不到精度要求');

n/2+1

tn

>> Txing2(2,3,4)

I =

1.7918

N =

1025

r =

-1.0576e-06

复化辛普森公式求积分

function f=Simpson2(a,b,n)

%a,b分别为积分下限和上限

%n为分割区间个数

while n<10000

T=[];%生成空矩阵以储存计算结果

for n=n:n+1

h=(b-a)/(2*n);%将积分区间分成2n份

x=zeros(1,2*n+1);

for i=1:2*n+1

x(i)=a+(i-1)*h;%计算n+1个求积节点值并储存在x中

end

z=2*x./(x.^2-3);%计算2n+1个求积节点处的函数值

t=0;

for i=1:n;

t=t+h/3*(z(2*i-1)+4*z(2*i)+z(2*i+1));%用复化simpson公式求积分end

T=[T,t];%将分成n份和n+1份结果储存在T中

end

if abs(T(2)-T(1))<0.5*10^(-8)%进行误差判断

I=T(2) %计算结果

N=n+1 %实际分割区间个数

r=log(6)-t %计算误差

return;

else

n=2*n;

end

end

disp('分割区间太长达不到精度要求');

T(2)

n/2+1

>> Simpson2(2,3,4)

I =

1.7918

N =

96

r =

-4.9476e-09

龙贝格公示求积分

function f=romberg2(a,b)

t(1,1)=(b-a)/2*(2*a/(a^2-3)+2*b/(b^2-3));

n=1;

while n<100

for k=1:n

aa=0;

for i=0:(power(2,(k-1))-1);

aa=aa+2*(a+(2*i+1)*(b-a)/2^k)/((a+(2*i+1)*(b-a)/2^k)^2-3); end

t(1,k+1)=0.5*t(1,k)+(b-a)/(2^k)*aa;

end

for m=1:n

h=1/((4^m)-1);

for k=m:n

t(m+1,k+1)=((4^m)*t(m,k+1)-t(m,k))*h;

end

end

if (abs(t(n,n)-t(n+1,1+n))<0.5*10^(-8))

I=t(n,n)

return;

else

n=n+1;

end

end

disp('超出最大迭代次数');

>> romberg2(2,3)

I =

1.7918

3.使用带选主元的分解法求解线性方程组,其中,,

当时.对于的情况分别求解.

精确解为.对得到的结果与精确解的差异进行解释.

function f=LU(n)

%生成矩阵A

A=zeros(n);

for i=1:n

for j=1:n

A(i,j)=i^(j-1);

end

end

%生成右边项b

b=zeros(n,1);

b(1)=n;

for i=2:n

b(i)=(i^n-1)/(i-1);

end

x=zeros(n,1);

y=zeros(n,1);

a=zeros(n,1);%储存矩阵A的换行元素

c=0;%储存右边项的换行元素

for i=1:n-1

[e,m]=max(abs(A(i:n,i)));%寻找最大元素及其位置

a=A(i,:);

A(i,:)=A(m+i-1,:);

A(m+i-1,:)=a;

c=b(i);

b(i)=b(m+i-1);

b(m+i-1)=c;

if A(i,i)==0

disp('A是奇异矩阵,方程组没有唯一解');

return;

end

for j=i+1:n

d=A(j,i)/A(i,i);

A(j,i)=d;

A(j,i+1:n)=A(j,i+1:n)-d*A(i,i+1:n);

end

end

%求解Ly=b

y(1)=b(1);

for k=2:n

y(k)=b(k)-A(k,1:k-1)*y(1:k-1);

end

%求解Ux=y x(n)=y(n)/A(n,n); for k=n-1:-1:1

x(k)=(y(k)-A(k,k+1:n)*x(k+1:n))/A(k,k); end x

>> LU(3) x =

1 1 1 >> LU(7) x =

1 1 1 1 1 1 1 >> LU(11) x =

1.0001 0.9997 1.0004 0.9998 1.0001 1.0000 1.0000 1.0000 1.0000 1.0000

1.0000

进行LU 分解时,系数矩阵出现病态,产生误差 4. 用4阶Runge-kutta 法求解微分方程

t t t te e t u u u u u 22210

1

)(,101)0(,2---+==

-=' (1) 令1.0=h ,使用上述程序执行20步,然后令05.0=h ,使用上述程序执行40步

(2) 比较两个近似解与精确解

(3) 当h减半时,(1)中的最终全局误差是否和预期相符?

(4) 在同一坐标系上画出两个近似解与精确解.(提示输出矩阵R包含近似解的x和y坐

标,用命令plot(R(:,1),R(:,2))画出相应图形.)

function f=Rungek(x,t)

uo=x;

tn=t;

%h=0.1,计算20步,并将计算结果储存在U1中

U1=zeros(20,1);

h1=0.1;

i=1;

while i<=20

k1=exp(-2*tn)-2*uo;

k2=exp(-2*(tn+0.5*h1))-2*(uo+0.5*h1*k1);

k3=exp(-2*(tn+0.5*h1))-2*(uo+0.5*h1*k2);

k4=exp(-2*(tn+h1))-2*(uo+h1*k3);

un=uo+h1/6*(k1+2*k2+2*k3+k4);

U1(i)=un;

i=i+1;

tn=(i-1)*h1;

uo=un;

end

%h=0.05,计算40步,并将计算结果储存在U2中

U3=zeros(40,1);

h2=0.05;

i=1;

uo=x;

tn=t;

while i<=40

s1=exp(-2*tn)-2*uo;

s2=exp(-2*(tn+0.5*h2))-2*(uo+0.5*h2*s1);

s3=exp(-2*(tn+0.5*h2))-2*(uo+0.5*h2*s2);

s4=exp(-2*(tn+h2))-2*(uo+h2*s3);

un=uo+h2/6*(s1+2*s2+2*s3+s4);

U3(i)=un;

i=i+1;

tn=(i-1)*h2;

uo=un;

end

U2=zeros(20,1);

for i=1:20

U2(i)=U3(2*i);

end

%利用函数U的表达式计算出精确结果,并储存在U中

U=zeros(20,1);

for i=1:20

t=i*0.1;

U(i)=0.1*exp(-2*t)+t*exp(-2*t);

end

%显示计算结果,其中R1是U1的绝对误差,R2是U2的绝对误差,R3是U1与U2的差U1,U2,U,R1=U-U1,R2=U-U2,R3=U1-U2

a=zeros(20,1);

for i=1:20

a(i)=i;

end

plot(a,U1,'+',a,U2,'o',a,U2,'r');

>> Rungek(0.1,0)

U1 =

0.1637

0.2011

0.2195

0.2247

0.2207

0.2108

0.1973

0.1817

0.1653

0.1489

0.1330

0.1179

0.1040

0.0912

0.0797

0.0693

0.0601

0.0519

0.0447

0.0385

U2 =

0.1637

0.2011

0.2195

0.2247

0.2207

0.2108

0.1973

0.1817

0.1653

0.1489

0.1330

0.1179

0.1040

0.0912

0.0797

0.0693

0.0601

0.0519

0.0447

0.0385 U =

0.1637

0.2011

0.2195

0.2247

0.2207

0.2108

0.1973

0.1817

0.1653

0.1489

0.1330

0.1179

0.1040

0.0912

0.0797

0.0693

0.0601

0.0519

0.0447

0.0385 R1 =

1.0e-005 *

0.2114

0.3250

0.3732

0.3791

0.3590

0.3242

0.2825

0.2389

0.1966

0.1575

0.1226

0.0924

0.0667

0.0454

0.0281

0.0142

0.0034

-0.0048

-0.0108

-0.0151 R2 =

1.0e-006 *

0.1191

0.1830

0.2098

0.2127

0.2010

0.1811

0.1574

0.1326

0.1087

0.0866

0.0670

0.0499

0.0356

0.0236

0.0140

0.0063

0.0003

-0.0042

-0.0075

-0.0097 R3 =

1.0e-005 *

-0.1995

-0.3067

-0.3522

-0.3578

-0.3389

-0.3061

-0.2667

-0.2256

-0.1857

-0.1488

-0.1159

-0.0874

-0.0632

-0.0430

-0.0267

-0.0136

-0.0034

0.0044

0.0101

0.0141

5.设

为阶的三对角方阵,是一个阶的对称正定矩阵

其中为阶单位矩阵。设为线性方程组的真解,右边的向量由这个真解给出。

(1)用Cholesky分解法求解该方程.

(2)用Jacobi迭代法和Gauss-Seidel迭代法求解该方程组,误差设为.

其中取值为4,5,6.

用Cholesky分解法求解方程:

function f=Cholesky(n)

%生成Tn矩阵

T=zeros(n);

T(i,i)=2;

end

for i=1:n-1

T(i,i+1)=-1;

end

for i=2:n

T(i,i-1)=-1;

end

%生成系数矩阵A

I=eye(n);

B=T+2*I;

C=-I;

A=zeros(n^2);

for i=1:n

A(n*(i-1)+1:i*n,n*(i-1)+1:i*n)=B; end

for i=1:n-1

A(i*n+1:(i+1)*n,(i-1)*n+1:i*n)=C; A((i-1)*n+1:i*n,i*n+1:(i+1)*n)=C; end

%生成右边项b

y=ones(n^2,1);

b=A*y;

R=chol(A);%对系数矩阵A进行Cholesky分解x=R\(R'\b)%求解方程组

>> Cholesky(4)

x =

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

>> Cholesky(5) x =

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

>> Cholesky(6) x =

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

相关文档
最新文档