Fortran Coder

查看: 8376|回复: 2
打印 上一主题 下一主题

[子程序] 调用二分法子程序解方程出错,求助

[复制链接]

4

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
14 点
跳转到指定楼层
楼主
发表于 2020-5-19 11:13:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Karmi 于 2020-5-19 11:13 编辑

[Fortran] 纯文本查看 复制代码
01Program test
02Implicit none
03Integer :: i
04Real :: Maact1,Maact2
05Real,dimension(3) ::fact
06fact(1)=26.
07fact(2)=30.
08fact(3)=32.
09Do i=1,3                                      !输出的结果Maact1和Maact2结果一致,都为1.985840
10  Call equation(fact(i),Maact1)               !但是把9-12行注释掉的话,
11  Write(*,*) Maact1                           !输出的Maact2结果为2.1938,是正确的
12End Do
13Call equation(31.57,Maact2)
14Write(*,*) Maact2
15End Program test
16 
17Subroutine equation(f,Ma)              !已知函数值,根据普朗特-迈耶函数求马赫数,1<=Ma<=3
18Implicit none
19Real,intent(in) :: f                   !输入普朗特-迈耶函数值
20Real,intent(out) :: Ma                 !输出马赫数
21Real :: eps=0.001                      !计算精度
22Real :: Ma1=1.0                        !区间下限
23Real :: Ma2=3.0                        !区间上限
24Real :: f_Ma1,f_Ma2,f_Ma               !对应函数值
25Real :: gamma=1.4
26Real,External :: P_Ma                  !普朗特迈耶函数
27!二分法解方程
28Ma=(Ma1+Ma2)/2
29f_Ma=P_Ma(Ma)-f
30f_Ma1=P_Ma(Ma1)-f
31f_Ma2=P_Ma(Ma2)-f
32Do while((abs(f_ma)>eps).and.((Ma2-Ma1)>eps))
33  If(f_Ma*f_Ma1<0.) then
34    Ma2=Ma
35    Ma=(Ma1+Ma2)/2
36    f_Ma2=f_Ma
37  Else
38    Ma1=Ma
39    Ma=(Ma1+Ma2)/2
40    f_Ma1=f_Ma
41  End If
42  f_Ma=P_Ma(Ma)-f
43End Do
44 
45!f_Ma1=P_Ma(Ma1)-f
46!f_Ma2=P_Ma(Ma2)-f
47!Do
48!  Ma=(Ma1+Ma2)/2
49!  f_Ma=P_Ma(Ma)-f
50!  If ((abs(f_Ma)<=eps).or.abs(Ma1-Ma2)<=eps) exit
51!  If (f_Ma1*f_Ma<0) then
52!    Ma2=Ma
53!    f_Ma2=f_Ma
54!  Else
55!    Ma1=Ma
56!    f_Ma1=f_Ma
57!  End if
58!End do
59End subroutine equation
60 
61Real Function P_Ma(Ma)
62Implicit None
63Real,Intent(in) :: Ma
64Real :: gamma=1.4
65P_Ma=sqrt((gamma+1)/(gamma-1))*atand(sqrt((gamma-1)/(gamma+1)*(Ma**2-1)))-atand(sqrt(Ma**2-1))
66End FUnction P_Ma
当我调用子程序的时候,输入如果是一个具体的数字的话,就能得到正确结果,但如果输入一个赋值的变量名的话就结果错误。
二分法也换了种写法,但还是同样的问题,是我的调用有什么问题吗?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

838

帖子

2

主题

0

精华

大宗师

F 币
3937 元
贡献
2339 点
沙发
发表于 2020-5-19 12:10:59 | 只看该作者
本帖最后由 li913 于 2020-5-19 12:12 编辑

在定义变量时进行赋值,变量具有save属性,会保存前一次的计算结果。所以,把22,23行改一下就是。

QQ截图20200519121047.png (54.87 KB, 下载次数: 306)

QQ截图20200519121047.png

4

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
14 点
板凳
 楼主| 发表于 2020-5-19 12:38:06 | 只看该作者
li913 发表于 2020-5-19 12:10
在定义变量时进行赋值,变量具有save属性,会保存前一次的计算结果。所以,把22,23行改一下就是。 ...

原来是这样,非常感谢,那么我把Ma1,Ma2作为参数输入来处理也是可以的了。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-5-1 09:23

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表