数值分析上机作业总.docx

上传人:b****5 文档编号:11752456 上传时间:2023-03-31 格式:DOCX 页数:22 大小:45.91KB
下载 相关 举报
数值分析上机作业总.docx_第1页
第1页 / 共22页
数值分析上机作业总.docx_第2页
第2页 / 共22页
数值分析上机作业总.docx_第3页
第3页 / 共22页
数值分析上机作业总.docx_第4页
第4页 / 共22页
数值分析上机作业总.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

数值分析上机作业总.docx

《数值分析上机作业总.docx》由会员分享,可在线阅读,更多相关《数值分析上机作业总.docx(22页珍藏版)》请在冰豆网上搜索。

数值分析上机作业总.docx

数值分析上机作业总

数值分析上机实验

一、解线性方程组直接法(教材49页14题)

追赶法程序如下:

functionx=followup(A,b)

n=rank(A);

for(i=1:

n)

if(A(i,i)==0)

disp('Error:

对角有元素为0');

return;

end

end;

d=ones(n,1);

a=ones(n-1,1);

c=ones(n-1);

for(i=1:

n-1)

a(i,1)=A(i+1,i);

c(i,1)=A(i,i+1);

d(i,1)=A(i,i);

end

d(n,1)=A(n,n);

for(i=2:

n)

d(i,1)=d(i,1)-(a(i-1,1)/d(i-1,1))*c(i-1,1);

b(i,1)=b(i,1)-(a(i-1,1)/d(i-1,1))*b(i-1,1);

end

x(n,1)=b(n,1)/d(n,1);

for(i=(n-1):

-1:

1)

x(i,1)=(b(i,1)-c(i,1)*x(i+1,1))/d(i,1);

end

主程序如下:

functionzhunganfa

A=[2-2000000;-25-200000;0-25-20000;00-25-2000;000-25-200;0000-25-20;00000-25-2;000000-25];

b=[220/27;0;0;0;0;0;0;0];

x=followup(A,b)

计算结果:

x=

8.1478

4.0737

2.0365

1.0175

0.5073

0.2506

0.1194

0.0477

二、解线性方程组直接法(教材49页15题)

程序如下:

functiontiaojianshu(n)

A=zeros(n);

forj=1:

1:

n

fori=1:

1:

n

A(i,j)=(1+0.1*i)^(j-1);

end

end

c=cond(A)

d=rcond(A)

当n=5时

c=

5.3615e+005

d=

9.4327e-007

当n=10时

c=

8.6823e+011

d=

5.0894e-013

当n=20时

c=

3.4205e+022

d=

8.1226e-024

备注:

对于病态矩阵A来说,d为接近0的数;对于非病态矩阵A来说,d为接近1的数。

三、解线性方程组的迭代法(教材74页14题)

(1)用Jacobi迭代法求:

Jacobi迭代法程序如下:

function[x,n]=jacobi(A,b,x0,eps,varargin)

ifnargin==3

eps=1.0e-6;

M=200;

elseifnargin<3

error

return

elseifnargin==5

M=varargin{1};

end

D=diag(diag(A));

L=-tril(A,-1);

U=-triu(A,1);

B=D\(L+U);

f=D\b;

x=B*x0+f;

n=1;

whilenorm(x-x0)>=eps

x0=x;

x=B*x0+f;

n=n+1;

if(n>=M)

disp('Warning:

迭代次数太多,可能不收敛');

return;

end

end

本题主程序如下:

functionyakebidiedai

A=[101234;19-12-3;2-173-5;32312-1;4-3-5-115];

b=[12;-27;14;-17;12];

x0=[0;0;0;0;0];

[x,n]=jacobi(A,b,x0)

计算结果:

x=

1.0000

-2.0000

3.0000

-2.0000

1.0000

n=

67

经过67次迭代,得到最终结果

(2)用Gauss-Seidel迭代法求:

Gauss-Seidel迭代法程序如下:

function[x,n]=gauseidel(A,b,x0,eps,M)

ifnargin==3

eps=1.0e-6;

M=200;

elseifnargin==4

M=200;

elseifnargin<3

error

return;

end

D=diag(diag(A));

L=-tril(A,-1);

U=-triu(A,1);

G=(D-L)\U;

f=(D-L)\b;

x=G*x0+f;

n=1;

whilenorm(x-x0)>=eps

x0=x;

x=G*x0+f;

n=n+1;

if(n>=M)

disp('Warning:

迭代次数太多,可能不收敛');

return;

end

end

本题主程序如下:

functiongaosidiedai

A=[101234;19-12-3;2-173-5;32312-1;4-3-5-115];

b=[12;-27;14;-17;12];

x0=[0;0;0;0;0];

[x,n]=gauseidel(A,b,x0)

计算结果:

x=

1.0000

-2.0000

3.0000

-2.0000

1.0000

n=

38

经过38次迭代,得到最终结果。

四、矩阵特征值与特征向量的计算(教材100页13题)

幂法求最大特征值的程序:

function[l,v,s]=pmethod(A,x0,eps)

ifnargin==2

eps=1.0e-6;

end

v=x0;

M=5000;

m=0;

l=0;

for(k=1:

M)

y=A*v;

m=max(y);

v=y/m;

if(abs(m-l)

l=m;

s=k;

return;

else

if(k==M)

disp('收敛速度过慢');

l=m;

s=M;

else

l=m;

end

end

end

求解本题程序如下:

functionmifa

A=[19066-8430;6630342-36;336-168147-112;30-3628291];

x0=[0001]';

[l,v,s]=pmethod(A,x0)

求解结果:

l=

343.0000

v=

-0.6667

-2.0000

0

1.0000

s=

114

结论:

经过114次迭代,求得此矩阵的最大特征值为343.0000,及其对应特征向量为[-0.6667;-2.0000;0;1.0000]

五、函数逼近(教材164页16题)

本题采用最小二乘法进行拟合:

线性最小二乘法程序如下:

function[a,b]=LZXEC(x,y)

if(length(x)==length(y))

n=length(x);

else

disp('x和y的维数不相等');

return;

end

A=zeros(2,2);

A(2,2)=n;

B=zeros(2,1);

fori=1:

n

A(1,1)=A(1,1)+x(i)*x(i);

A(1,2)=A(1,2)+x(i);

B(1,1)=B(1,1)+x(i)*y(i);

B(2,1)=B(2,1)+y(i);

end

A(2,1)=A(1,2);

s=A\B;

a=s

(1);

b=s

(2);

首先利用1/y代替y,1/x代替x并采用线性最小二乘法求出a与b:

functionzuixiaoercheng

x1=[2356791011121416171920];

y1=[106.42108.26109.58109.50109.86110.00109.93110.59110.60110.72110.90110.76111.10111.30];

x2=1./x1;

y2=1./y1;

[b,a]=LZXEC(x2,y2)

计算结果:

b=

8.4169e-004

a=

0.0090

绘制图形:

fplot('x/(0.0090*x+8.4169e-004)',[2,20])

gridon

title('最小二乘拟合')

六、数值微分与数值积分(教材207页26题)

本题采用高斯—勒让德求积公式求解:

高斯—勒让德求积公式程序如下:

functionI=IntGauss(f,a,b,n,AK,XK)

if(n<5&&nargin==4)

AK=0;

XK=0;

else

XK1=((b-a)/2)*XK+((a+b)/2);

I=((b-a)/2)*sum(AK.*subs(sym(f),findsym(f),XK1));

End

ta=(b-a)/2;

tb=(a+b)/2;

switchn

case0,

I=2*ta*subs(sym(f),findsym(sym(f)),tb);

case1,

I=ta*(subs(sym(f),findsym(sym(f)),ta*0.5773503+tb)+...

subs(sym(f),findsym(sym(f)),-ta*0.5773503+tb));

case2,

I=ta*(0.55555556*subs(sym(f),findsym(sym(f)),ta*0.7745967+tb)+...

0.55555556*subs(sym(f),findsym(sym(f)),-ta*0.7745967+tb)+...

0.88888889*subs(sym(f),findsym(sym(f)),tb));

case3,

I=ta*(0.3478548*subs(sym(f),findsym(sym(f)),ta*0.8611363+tb)+...

0.3478548*subs(sym(f),findsym(sym(f)),-ta*0.8611363+tb)+...

0.6521452*subs(sym(f),findsym(sym(f)),ta*0.3398810+tb)...

+0.6521452*subs(sym(f),findsym(sym(f)),-ta*0.3398810+tb));

case4,

I=ta*(0.2369269*subs(sym(f),findsym(sym(f)),ta*0.9061793+tb)+...

0.2369269*subs(sym(f),findsym(sym(f)),-ta*0.9061793+tb)+...

0.4786287*subs(sym(f),findsym(sym(f)),ta*0.5384693+tb)...

+0.4786287*subs(sym(f),findsym(sym(f)),-ta*0.5384693+tb)+...

0.5688889*subs(sym(f),findsym(sym(f)),tb));

end

本题计算程序如下(采用4个节点):

functionshuzhijifen

a=1;

b=1;

fors=-5:

0.05:

5

q1(1,a)=IntGauss('cos(1/2*x^2)',0,s,4);

q2(1,b)=IntGauss('sin(1/2*x^2)',0,s,4);

a=a+1;

b=b+1;

end

plot(q1,q2);

绘制图形:

 

七、非线性方程及非线性方程组的解法

本题采用牛顿法进行求解:

牛顿法解非线性方程程序如下:

function[r,n]=mulNewton(F,x0,eps)

ifnargin==2

eps=1.0e-4;

end

x0=transpose(x0);

Fx=subs(F,findsym(F),x0);

var=findsym(F);

dF=Jacobian(F,var);

dFx=subs(dF,findsym(dF),x0);

r=x0-inv(dFx)*Fx;

n=1;

tol=1;

whiletol>eps

x0=r;

Fx=subs(F,findsym(F),x0);

dFx=subs(dF,findsym(dF),x0);

r=x0-inv(dFx)*Fx;

tol=norm(r-x0);

n=n+1;

if(n>100000)

disp('迭代步数太多,可能不收敛');

return;

end

end

本题解决方案如下:

首先,绘制此方程的图形,大概确定其与X轴的交点位置。

由于

,可以得出

因此绘制程序如下:

ezplot('log((513+0.6651*x)/(513-0.6651*x))-x/(1400*0.0918)',[-772,772,-10,10]);

gridon

得到图形如下图所示:

经过放大后,发现图形与x轴的交点接近

处。

计算非零根:

为牛顿法接非线性方程的初值。

程序如下:

symsx

f=log((513+0.6651*x)/(513-0.6651*x))-x/(1400*0.0918);

x0=-765

[r,n]=mulNewton(f,x0)

解得:

r=-767.3861

x0=765

[r,n]=mulNewton(f,x0)

解得:

r=767.3861

结论:

此方程的两个非零根分别为:

八、常微分方程数值解法(教材266页19题)

本题分别采用四阶ADAMS预测—校正算法和经典RK法进行求解:

四阶ADAMS预测—校正算法如下:

functiony=DEYCJZ_yds(f,h,a,b,y0,varvec)

formatlong;

N=(b-a)/h;

y=zeros(N+1,1);

x=a:

h:

b;

y

(1)=y0;

y

(2)=y0+h*Funval(f,varvec,[x

(1)y

(1)]);

y(3)=y

(2)+h*Funval(f,varvec,[x

(2)y

(2)]);

y(4)=y(3)+h*Funval(f,varvec,[x(3)y(3)]);

fori=5:

N+1

v1=Funval(f,varvec,[x(i-4)y(i-4)]);

v2=Funval(f,varvec,[x(i-3)y(i-3)]);

v3=Funval(f,varvec,[x(i-2)y(i-2)]);

v4=Funval(f,varvec,[x(i-1)y(i-1)]);

t=y(i-1)+h*(55*v4-59*v3+37*v2-9*v1)/24;

ft=Funval(f,varvec,[x(i)t]);

y(i)=y(i-1)+h*(9*ft+19*v4-5*v3+v2)/24;

end

经典RK算法程序如下:

functiony=DELGKT4_lungkuta(f,h,a,b,y0,varvec)

formatlong;

N=(b-a)/h;

y=zeros(N+1,1);

y

(1)=y0;

x=a:

h:

b;

var=findsym(f);

fori=2:

N+1

K1=Funval(f,varvec,[x(i-1)y(i-1)]);

K2=Funval(f,varvec,[x(i-1)+h/2y(i-1)+K1*h/2]);

K3=Funval(f,varvec,[x(i-1)+h/2y(i-1)+K2*h/2]);

K4=Funval(f,varvec,[x(i-1)+hy(i-1)+h*K3]);

y(i)=y(i-1)+h*(K1+2*K2+2*K3+K4)/6;

end

其中FUNVAL函数程序如下:

functionfv=Funval(f,varvec,varval)

var=findsym(f);

iflength(var)<4

ifvar

(1)==varvec

(1)

fv=subs(f,varvec

(1),varval

(1));

else

fv=subs(f,varvec

(2),varval

(2));

end

else

fv=subs(f,varvec,varval);

end

本题解决方案如下(步长h=0.1):

程序:

functionchangweifen

symsxy;

z=-y+2*cos(x);

yy1=DELGKT4_lungkuta(z,0.1,0,pi,1,[xy]);

yy2=DEYCJZ_yds(z,0.1,0,pi,1,[xy]);

a=0:

0.1:

pi;

yy3=cos(a)+sin(a);

plot(a,yy1,'r*');

gridon;

holdon;

plot(a,yy2,'b+');

plot(a,yy3,'-go');

legend('RK','Adams','准确解')

整体图形:

局部放大图形:

继续放大:

数据结果:

yy1(RK)

yy2(ADAMS)

yy3(准确解)

yy1-yy3

yy2-yy3

1

1

1

0

0

1.094837464

1.1

1.094837582

-1.18389E-07

0.005162418

1.178735678

1.189000833

1.178735909

-2.30293E-07

0.010264924

1.250856361

1.266114065

1.250856696

-3.351E-07

0.01525737

1.310478904

1.324215642

1.310479336

-4.32217E-07

0.013736305

1.357007579

1.369446642

1.3570081

-5.21089E-07

0.012438542

1.389977487

1.401242287

1.389978088

-6.012E-07

0.011264199

1.409059202

1.419252042

1.409059875

-6.72089E-07

0.010192167

1.414062067

1.423285143

1.4140628

-7.33353E-07

0.009222343

1.404936093

1.41328163

1.404936878

-7.84658E-07

0.008344753

1.381772465

1.389323897

1.381773291

-8.25739E-07

0.007550607

1.344802625

1.351635461

1.344803481

-8.56415E-07

0.00683198

1.294395964

1.300578527

1.29439684

-8.76584E-07

0.006181686

1.231056128

1.236650238

1.231057014

-8.86229E-07

0.005593224

1.155415987

1.160477584

1.155416873

-8.85423E-07

0.005060711

1.068231314

1.072811013

1.068232188

-8.74325E-07

0.004578825

0.970373228

0.974516833

0.970374081

-8.53183E-07

0.004142752

0.862819494

0.866568452

0.862820316

-8.22334E-07

0.003748136

0.746644754

0.75003657

0.746645536

-7.82199E-07

0.003391034

0.623009788

0.626078402

0.623010521

-7.33279E-07

0.003067882

0.493149914

0.495926042

0.49315059

-6.76156E-07

0.002775452

0.358362651

0.360874088

0.358363262

-6.11484E-07

0.002510826

0.219994747

0.222266651

0.219995287

-5.39985E-07

0.002271364

0.079428728

0.081483866

0.079429191

-4.62442E-07

0.002054676

-0.061930915

-0.060071936

-0.061930535

-3.7969E-07

0.001858599

-0.202671764

-0.200990293

-0.202671471

-2.92614E-07

0.001681178

-0.341387584

-0.339866738

-0.341387382

-2.02132E-07

0.001520644

-0.476692371

-0.475316868

-0.476692262

-1.09196E-07

0.001375394

-0.607234205

-0.605990211

-0.607234191

-1.47751E-08

0.00124398

-0.731708756

-0.730583746

-0.731708836

8.01498E-08

0.00112509

-0.848872314

-0.847854952

-0.848872489

1.74596E-07

0.001017537

-0.95755422

-0.95663424

-0.957554488

2.6759E-07

0.000920247

结论:

通过图形和数据结果可以看出,在本题中利用经典RK方法获得解的精确度比4阶ADAMS方法要高很多。

 

《数值计算方法》

上机实验

 

姓名:

刘天博

学号:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 实习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1