講義で作成したFORTRAN77コードを掲載します。
【2階微分 ルンゲクッタ法にて】
csvファイル出力をしない版はこちら
****** main ****** external f1,f2 write(*,*)'h=' read(*,*)h write(*,*)'t0=' read(*,*)t0 write(*,*)'y0=' read(*,*)y0 write(*,*)'y0''=' read(*,*)y0d write(*,*)'tend=' read(*,*)tend call rk2(f1,f2,h,t0,y0,y0d,tend) stop end ****** subroutine program******* subroutine rk2(f1,f2,h,t0,y0,y0d,tend) real*4 j1,j2,j3,j4,k1,k2,k3,k4 t =t0 y =y0 yd=y0d open(7,file='runge2.csv', status='replace') write(7,*)'h,',h write(7,*)'t,y,yd,j1,j2,j3,j4,k1,k2,k3,k4' write(7,*)t,',',y,',',yd 20 continue if((t+0.0001).gt.tend)go to 30 j1= f1(y,yd,t) k1= f2(y,yd,t) j2= f1(y+h*j1/2,yd+h*k1/2,t+h/2) k2= f2(y+h*j1/2,yd+h*k1/2,t+h/2) j3= f1(y+h*j2/2,yd+h*k2/2,t+h/2) k3= f2(y+h*j2/2,yd+h*k2/2,t+h/2) j4= f1(y+h*j3,yd+h*k3,t+h) k4= f2(y+h*j3,yd+h*k3,t+h) y = y+(h/6)*(j1+2*j2+2*j3+j4) yd=yd+(h/6)*(k1+2*k2+2*k3+k4) t =t+h write(7,*)t,',',y,',',yd,',',j1,',',j2,',',j3,',',j4 a,',',k1,',',k2,',',k3,',',k4 goto 20 30 write(*,*)' y =',y write(7,*)'y,',y close(7) return end ****** function f1 ******* function f1(y,yd,t) f1 = yd return end ****** function f2 ******* function f2(y,yd,t) f2 = t + 1 return end |