首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的Fortran Runge-Kutta只得到0

我的Fortran Runge-Kutta只得到0
EN

Stack Overflow用户
提问于 2017-06-27 09:14:09
回答 1查看 59关注 0票数 0

好的,我试着解决一个初值问题,试着用龙格-库塔2找到f函数给出的速度,我的程序会编译,但当我运行它时,我在任何时候都会得到相同的v值,但我就是找不到哪里做错了。有人能帮帮我吗?

代码语言:javascript
复制
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

当我运行它时,我得到并输出如下所示:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-06-27 10:12:59

我认为您的问题出在您的函数f中,特别是在下面这一行:

代码语言:javascript
复制
f = -(gr)-((c1/m)*v)

函数有自己的作用域,即在主程序中为其赋值的变量都不能被函数访问,相反,它有自己的变量grc1m。只有ty被传递给它,但是该函数的结果仍然太小,无法在v中注册任何有意义的更改。(当我运行您的代码时,f的结果是-2e-314的顺序,但是因为您从来没有初始化函数内部的变量,所以您的值可能会不同。)

至于你能做什么:

  1. grc1m的初始化移到函数中。
  2. 将整个函数移到主程序中,并从函数中删除grc1m的显式声明。这样,它将在父对象的作用域中查找变量:

程序运行...end do close(1)包含实数(8)函数f(t,y)隐式无实数(8) ::t,y f= -(gr)-((c1/m)*v) end函数f end program runge

请注意,在function.

  • Put中没有声明grc1mv将函数及其所依赖的变量转换为模块:

模my_mod隐式无实数(8) gr,c1,m,v包含实(8)函数f(t,y) ...结束函数结束模块程序运行使用my_mod隐式无gr =9.81...结束程序

注意,在这里,主程序中没有gr等的声明,因为这些变量是由模块提供的。

还有很多其他的问题,这里只是几个例子:

  • 你的函数有虚拟变量ty,但实际上从来没有用过它们,你在单元1上打开一个文件,这可能会干扰其他的i/o,这取决于你的编译器。我只使用大于10的单位,甚至更好,为我的单位声明一个整数,并使用open(newunit=myunit, file=....)打开,然后使用read(myunit, ...write(myunit, ...
  • Your进行读写,使用real(8)是不独立于编译器的。更好的方法是这样:

程序运行使用iso_fortran_env隐式无实数(Real64) ::gr ...

但这不是这里的问题,所以我将省略它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44770941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档