好的,我试着解决一个初值问题,试着用龙格-库塔2找到f函数给出的速度,我的程序会编译,但当我运行它时,我在任何时候都会得到相同的v值,但我就是找不到哪里做错了。有人能帮帮我吗?
program runge
implicit none
real(8) :: f,t,y,g,v,c1
real(8) a,b,h
real(8) k1,k2,l1,l2,v0,gr,m
integer i,n,j
n=10
a=0
b=100
h=(b-a)/n
gr=9.8100
m=70.0
c1=15.0
v0=20.0
y=0.0
v=v0
t=a
open(1, file="velocidad.txt")
write(1,*) a,v
print*, " t", " v"
do i=1,n
k1 = f(t,v)
k2 = f(t + h, v + h*k1)
v = v + h*(k1 + k2)/2
t = a + i*h
write(1,*) t, v
print*, t, v
end do
close(1)
end program runge
real(8) function f(t,y)
implicit none
real(8) :: t,y,c1,gr,v,m
f = -(gr)-((c1/m)*v)
end function f当我运行它时,我得到并输出如下所示:
t v
10.000000000000000 20.000000000000000
20.000000000000000 20.000000000000000
30.000000000000000 20.000000000000000
40.000000000000000 20.000000000000000
50.000000000000000 20.000000000000000
60.000000000000000 20.000000000000000
70.000000000000000 20.000000000000000
80.000000000000000 20.000000000000000
90.000000000000000 20.000000000000000
100.00000000000000 20.000000000000000发布于 2017-06-27 10:12:59
我认为您的问题出在您的函数f中,特别是在下面这一行:
f = -(gr)-((c1/m)*v)函数有自己的作用域,即在主程序中为其赋值的变量都不能被函数访问,相反,它有自己的变量gr、c1和m。只有t和y被传递给它,但是该函数的结果仍然太小,无法在v中注册任何有意义的更改。(当我运行您的代码时,f的结果是-2e-314的顺序,但是因为您从来没有初始化函数内部的变量,所以您的值可能会不同。)
至于你能做什么:
gr、c1和m的初始化移到函数中。gr、c1和m的显式声明。这样,它将在父对象的作用域中查找变量:程序运行...end do close(1)包含实数(8)函数f(t,y)隐式无实数(8) ::t,y f= -(gr)-((c1/m)*v) end函数f end program runge
请注意,在function.
gr、c1、m或v将函数及其所依赖的变量转换为模块:模my_mod隐式无实数(8) gr,c1,m,v包含实(8)函数f(t,y) ...结束函数结束模块程序运行使用my_mod隐式无gr =9.81...结束程序
注意,在这里,主程序中没有gr等的声明,因为这些变量是由模块提供的。
还有很多其他的问题,这里只是几个例子:
t和y,但实际上从来没有用过它们,你在单元1上打开一个文件,这可能会干扰其他的i/o,这取决于你的编译器。我只使用大于10的单位,甚至更好,为我的单位声明一个整数,并使用open(newunit=myunit, file=....)打开,然后使用read(myunit, ...和write(myunit, ...real(8)是不独立于编译器的。更好的方法是这样:程序运行使用iso_fortran_env隐式无实数(Real64) ::gr ...
但这不是这里的问题,所以我将省略它。
https://stackoverflow.com/questions/44770941
复制相似问题