计算材料学考试.docx
《计算材料学考试.docx》由会员分享,可在线阅读,更多相关《计算材料学考试.docx(13页珍藏版)》请在冰豆网上搜索。
计算材料学考试
分别用前向2点后向2点,对称3点对称5点方法计算f(x=lnx在x=2处的一
阶导数和误差,给出不同h值(0.5,0.2,0.1,0.05,0.02,0.01,0.005,0.002,
0.001,0.0005,0.0002,0.000仆各方法的误差
1.1对称三点法
programlx
implicitnone
doubleprecision,parameter:
:
x=2.0d0doubleprecision:
:
exact,h,f_sym3,diff_sym3
h=0.5d0
exact=x**(-1
dowhile(h>0
write(*,*"Entervalueofh(<=0tostop"
read(*,*h
if(h<=0.0then
stop"h<=0"
endif
f_sym3=(dlog(X+h-dlog(x-h/(2*h
diff_sym3=exact-f_sym3
write(*,*
"h=",h,"F_SYM3=",f_sym3,"E_SYM3=",diff_sym3enddo
endprogramlx
1.2前向两点法
programlx
implicitnone
doubleprecision,parameter:
:
x=2.0d0doubleprecision:
:
exact,h,f_sym3,diff_sym3h=0.5d0
exact=x**(-1
dowhile(h>0
write(*,*"Entervalueofh(<=0tostop"
read(*,*h
if(h<=0.0then
stop"h<=0"
endif
f_sym3=(dlog(x+h-dlog(x/(h
diff_sym3=exact-f_sym3
write(*,*
"h=",h,"F_SYM3=",f_sym3,"E_SYM3=",diff_sym3enddo
endprogramlx
1.3后向两点法
programlx
implicitnone
doubleprecision,parameter:
:
x=2.0d0doubleprecision:
:
exact,h,f_sym3,diff_sym3h=0.5d0
exact=x**(-1
dowhile(h>0
write(*,*"Entervalueofh(<=0tostop"
read(*,*h
if(h<=0.0then
stop"h<=0"
endif
f_sym3=(dlog(x-dlog(x-h/(h
diff_sym3=exact-f_sym3
write(*,*
"h=",h,"F_SYM3=",f_sym3,"E_SYM3=",diff_sym3enddo
endprogramlx
1.4对称五点法
programlx
implicitnone
doubleprecision,parameter:
:
x=2.0d0doubleprecision:
:
exact,h,f_sym5,diff_sym5
h=0.5d0
exact=x**(-1
dowhile(h>0
write(*,*"Entervalueofh(<=0tostop"
read(*,*h
if(h<=0.0d0then
stop"h<=0"
endif
f_sym5=(dlog(x-2*h-8*dlog(x-h+8*dlog(x+h-dlog(x+2*h/(12*h
diff_sym5=exact-f_sym5
write(*,"(5(A,F8.6,2X"
"h=",h,"F_SYM5=",f_sym5,"E_SYM5=",diff_sym5enddo
endprogramlx
分别用梯形法,Simpson法,Simpson3/8法,Bode法计算
20cos3d
xx
n
给出8个不同N值下各方法的误差
3.1梯形法
doubleprecisionfunctionfunc(x
implicitnone
doubleprecision:
:
x
func=cos(3*x
endfunctionfunc
programintegral
implicitnone
integer:
:
i,n=1
doubleprecision:
:
pi,limit_down,limit_updoubleprecision:
:
exact,h,integ,summ,diff,xdoubleprecision:
:
func
exact=-1.0/3.0
pi=acos(-1.0d0
limit_down=0.0d0
limit_up=pi/2.0
dowhile(n>0
write(*,*"EntervalueofN(even,>=2"
read(*,*n
if(n<2then
stop"n<2"
endif
h=(limit_up-limit_down/n
summ=func(limit_down
doi=1,n-1
x=i*h
summ=summ+func(x*2
enddo
summ=summ+func(limit_up
integ=h*summ/2
diff=exact-integ
write(*,"(A,l6,2X,5(A,F12.9,2X"
"N=",n,"h=",h,"Integ=",integ,"ERROR=",diffenddo
endprogramintegral
3.2辛普森法
doubleprecisionfunctionfunc(x
implicitnone
doubleprecision:
:
x
func=cos(3*x
endfunctionfunc
programintegral
implicitnone
integer:
:
i,fac,n=1
doubleprecision:
:
pi,limit_down,limit_updoubleprecision:
:
exact,h,integ,summ,diff,xdoubleprecision:
:
func
exact=-1.0/3.0
pi=acos(-1.0d0
limit_down=0.0d0
limit_up=pi/2
dowhile(n>0
write(*,*"EntervalueofN(even,>=2"read(*,*n
if(n<2then
stop"n<2"
endif
h=(limit_up-limit_down/n
summ=func(limit_down
fac=2
doi=1,n-1
if(fac==2then
fac=4
else
fac=2
endif
x=i*h
summ=summ+func(x*fac
enddo
summ=summ+func(limit_up
integ=h*summ/3
diff=exact-integ
write(*,"(A,l6,2X,5(A,F12.9,2X"
"N=",n,"h=",h,"Integ=",integ,"ERROR=",diffenddo
endprogramintegral
3.3辛普森3/8法
doubleprecisionfunctionfunc(x
implicitnone
doubleprecision:
:
x
func=cos(3*x
endfunctionfunc
programintegral
implicitnone
integer:
:
i,n=1
doubleprecision:
:
pi,limit_down,limit_up
doubleprecision:
:
exact,h,integ,summ,diff,x,modireal:
:
fac(3
doubleprecision:
:
func
exact=-1.0/3.0
pi=acos(-1.0d0
limit_down=O.OdO
limit_up=pi/2
dowhile(n>0
write(*,*"EntervalueofN(even,>=2"
read(*,*n
if(n<2then
stop"n<2"
endif
h=(limit_up-limit_down/nsumm=func(limit_downdoi=1,n-1modi=mod(i,3if(modi==0thenfac(1=2
elseif(modi==1then
fac(2=3
elseif(modi==2thenfac(3=3endif
x=i*h
summ=summ+func(x*fac(modi+1enddo
summ=summ+func(limit_up
integ=3*h*summ/8
diff=exact-integ
write(*,"(A,l6,2X,5(A,F12.9,2X"
"N=",n,"h=",h,"lnteg=",integ,"ERROR=",diff
enddo
endprogramintegral
3.4Bode法
doubleprecisionfunctionfunc(x
implicitnone
doubleprecision:
:
x
func=cos(3*x
endfunctionfunc
programintegral
implicitnone
integer:
:
i,n=1
doubleprecision:
:
pi,limit_down,limit_up
doubleprecision:
:
exact,h,integ,summ,diff,x,modireal:
:
fac(4
doubleprecision:
:
func
exact=-1.0/3.0
pi=acos(-1.0d0
limitdown=O.OdO
limit_up=pi/2
dowhile(n>0
write(*,*"EntervalueofN(even,>=2"
read(*,*n
if(n<2then
stop"n<2"
endif
h=(limit_up-limit_down/n
summ=func(limit_down*7
doi=1,n-1
modi=mod(i,4
if(modi==0then
fac(1=14
elseif(modi==1then
fac(2=32
elseif(modi==2then
fac(3=12
elseif(modi==3then
fac(4=32
endif
x=i*h
summ=summ+func(x*fac(modi+1
enddo
summ=summ+func(limit_up*7
integ=2*h*summ/45
diff=exact-integ
write(*,"(A,l6,2X,5(A,F12.9,2X"
"N=",n,"h=",h,"Integ=",integ,"ERROR=",diff
enddo
endprogramintegral
分别用搜索法,牛顿法,弦割法求解
f(x=x2-5
的正根,改变初始猜测值,观察各方法的收敛行为
5.1搜索法
doubleprecisionfunctionfunc(x
implicitnone
doubleprecision:
:
x
func=x**2-5
endfunctionfunc
programroot
implicitnone
integer:
:
iter=0
doubleprecision:
:
x,dx,guess_st,tolx,fold,exact,func
exact=sqrt(5.0d0
guess_st=1.0d0
dx=0.5
tolx=1.0d-8
x=guess_st
fold=func(x
dowhile(abs(dx>tolx
iter=iter+1
x=x+dx
if(fold*func(x>0.0then
cycle
else
x=x-dx
dx=dx/2
endif
write(*,"(l4,6f12.8"iter,x,exact-xenddo
endprogramroot
5.2牛顿法
doubleprecisionfunctionfunc(x
implicitnone
doubleprecision:
:
x
func=x**2-5
endfunctionfunc
doubleprecisionfunctionfunc_prime(x
implicitnone
doubleprecision:
:
x
func_prime=2*x
endfunctionfunc_prime
programroot
implicitnone
integer:
:
iter=0
doubleprecision:
:
x,xO,dx,guess_st,tolx,exact,func,func_prime
exact=sqrt(5.0d0
guess_st=1.OdO
dx=0.5
tolx=1.0d-8x=guess_stdowhile(abs(dx>tolxiter=iter+1
x0=x
x=x0-func(x0/func_prime(x0dx=x-x0
write(*,"(l4,6f12.8"iter,x,exact-xenddo
endprogramroot
5.3弦割法
doubleprecisionfunctionfunc(ximplicitnone
doubleprecision:
:
x
func=x**2-5
endfunctionfunc
programroot
implicitnone
integer:
:
iter=0
doubleprecision:
:
x,x0,dx,guess_st,x3_st,xold,tolx,exact,func
exact=sqrt(5.0d0
guess_st=1.0d0
dx=0.5
tolx=1.0d-8
x=guess_st
dowhile(abs(dx>tolx
iter=iter+1
xold=x0
x0=x
if(iter==1then
x=x3_st
else
x=x0-func(x0*(x0-xold/(func(x0-func(xoldendif
dx=x-x0
write(*,"(l4,6f12.8"iter,x,exact-xenddo
endprogramroot