主题:如何将fortran算出来的数据保存到文件
我Runge_Kutta 方法算了一个微分方程,但是不知道怎么将得到的数组储存到新的文件夹里面并用那些数组来画图。程序如下。希望大家能够帮小弟改进一下。谢谢。急需啊,在线等。谢谢!
!RK方法求解微分方程
program RK
implicit none
!定义变量
real :: X0, Y0, X1, Y1
real :: Xn, H, Err
integer :: N, I, Item
real, external :: Rung_Kutta_Vs
!屏幕提示
print *, '求解微分方程: dy/dx = y*y - x*x'
print *, '请输入常微分方程的初始条件[X0,Y0]:'
read(*, *) X0, Y0
print *, '请选择计算的终点和步数[Xn, N]:'
read(*, *) Xn, N
print *, '请输入误差精度:'
read(*, *) Err
H = (Xn - X0)/N
! 打印求解过程
write(*, 100) X0, Y0
do I = 1, N
X1 = H*I + X0
Y1 = Rung_Kutta_Vs(X0, Y0, X1, Err, Funx)
write(*, 200) I, X1, I, Y1
enddo
!格式说明
100 format(5X, 'X00=', F10.6, ' Y00=', F10.6)
200 format(5X, 'X', I2.2, '=', F10.6, ' Y', I2.2, '=', F10.6)
contains
!原型函数
real function Funx(Y,X)
implicit none
real :: Y, X
Funx = Y*Y - X*X
return
end function Funx
end program RK
!变步长RK方法
function Rung_Kutta_Vs(X, Y, X1, Err, F) result(Y1)
implicit none
!变量定义
real :: X, Y, X1, Y1, Err
real, external :: F
real :: X0, Y0, H, Temp
integer :: N, M, I
real :: K0, K1, K2, K3
!初始化及各步系数
X0 = X
Y0 = Y
N = 1
H = (X1 - X0)/N
K0 = H*F(Y0, X0)
K1 = H*F(Y0 + K0/2, X0 + H/2)
K2 = H*F(Y0 + K1/2, X0 + H/2)
K3 = H*F(Y0 +K2, X0 + H)
Temp = Y0 + (K0 + 2*K1 + 2*K2 + K3)/6.0
!自适应步长确定
M = 0
do
M = M + 1
X0 = X
Y0 = Y
N = 2*N
H = (X1 - X0)/N
Y1 = Temp
do I = 1, N
K0 = H*F(Y0, X0)
K1 = H*F(Y0 + K0/2, X0 + H/2)
K2 = H*F(Y0 + K1/2, X0 + H/2)
K3 = H*F(Y0 +K2, X0 + H)
Temp = Y0 + (K0 + 2*K1 + 2*K2 + K3)/6.0
X0 = X0 + H
Y0 = Temp
enddo
if(ABS((Temp - Y1)/Y1)<=Err .OR. M>5000) exit
enddo
if(M>5000) then
print *, 'Warning!迭代次数超过5000次!'
endif
Y1 = Temp
return
end function Rung_Kutta_Vs
!RK方法求解微分方程
program RK
implicit none
!定义变量
real :: X0, Y0, X1, Y1
real :: Xn, H, Err
integer :: N, I, Item
real, external :: Rung_Kutta_Vs
!屏幕提示
print *, '求解微分方程: dy/dx = y*y - x*x'
print *, '请输入常微分方程的初始条件[X0,Y0]:'
read(*, *) X0, Y0
print *, '请选择计算的终点和步数[Xn, N]:'
read(*, *) Xn, N
print *, '请输入误差精度:'
read(*, *) Err
H = (Xn - X0)/N
! 打印求解过程
write(*, 100) X0, Y0
do I = 1, N
X1 = H*I + X0
Y1 = Rung_Kutta_Vs(X0, Y0, X1, Err, Funx)
write(*, 200) I, X1, I, Y1
enddo
!格式说明
100 format(5X, 'X00=', F10.6, ' Y00=', F10.6)
200 format(5X, 'X', I2.2, '=', F10.6, ' Y', I2.2, '=', F10.6)
contains
!原型函数
real function Funx(Y,X)
implicit none
real :: Y, X
Funx = Y*Y - X*X
return
end function Funx
end program RK
!变步长RK方法
function Rung_Kutta_Vs(X, Y, X1, Err, F) result(Y1)
implicit none
!变量定义
real :: X, Y, X1, Y1, Err
real, external :: F
real :: X0, Y0, H, Temp
integer :: N, M, I
real :: K0, K1, K2, K3
!初始化及各步系数
X0 = X
Y0 = Y
N = 1
H = (X1 - X0)/N
K0 = H*F(Y0, X0)
K1 = H*F(Y0 + K0/2, X0 + H/2)
K2 = H*F(Y0 + K1/2, X0 + H/2)
K3 = H*F(Y0 +K2, X0 + H)
Temp = Y0 + (K0 + 2*K1 + 2*K2 + K3)/6.0
!自适应步长确定
M = 0
do
M = M + 1
X0 = X
Y0 = Y
N = 2*N
H = (X1 - X0)/N
Y1 = Temp
do I = 1, N
K0 = H*F(Y0, X0)
K1 = H*F(Y0 + K0/2, X0 + H/2)
K2 = H*F(Y0 + K1/2, X0 + H/2)
K3 = H*F(Y0 +K2, X0 + H)
Temp = Y0 + (K0 + 2*K1 + 2*K2 + K3)/6.0
X0 = X0 + H
Y0 = Temp
enddo
if(ABS((Temp - Y1)/Y1)<=Err .OR. M>5000) exit
enddo
if(M>5000) then
print *, 'Warning!迭代次数超过5000次!'
endif
Y1 = Temp
return
end function Rung_Kutta_Vs