Fortran Coder

查看: 10047|回复: 1
打印 上一主题 下一主题

[数值问题] 求解运行时的问题。daltA1没算进去

[复制链接]

17

帖子

5

主题

0

精华

入门

F 币
86 元
贡献
52 点
跳转到指定楼层
楼主
发表于 2014-5-13 11:28:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的程序没有出现错误,运行的时候有两个问题:
1.不知道为啥daltA1没算进去
2.A3和daltA1循环的时候位置对调,结果就不一样
谢谢大家关注,以下是我的程序
[Fortran] 纯文本查看 复制代码
001program tu5
002 implicit none
003 real*8 A1,A2,A4
004 real*8 Z0,Zr,Zi
005 real*8 A,B,C,D
006 real*8 E
007 real*8 F
008 real*8 ref,Rf
009 real*8 C1,D1,E1,F1,refs,t
010 real,parameter::pi=3.14159
011 real*8::A3=0.0
012 integer i
013 real*8::daltA1=0.0
014 integer k
015 character(len=80)::filename="data.txt"
016 integer,parameter::fileid=10
017 
018 !!!!!!!!!!
019 A2=0.25
020 A4=0.425
021 A1=0.625
022 Z0=50
023 Zr=2
024 Zi=-3
025 !!!!!!!!!!************************************************
026 open(10,file="data.txt")
027    do k=1,100
028       daltA1=daltA1+0.001
029       do i=1,int(0.2/0.001)
030          A3=A3+0.001
031 
032    call Get_Rf(A3,daltA1,A1,A2,A4,Zi,Zr,Z0,t,E,F,E1,F1,ref,refs,Rf)
033   write(*,*)t
034 write(*,"('A3:'F8.5,'Rf:'F8.5,'daltA1:'F8.5)")A3,Rf,daltA1
035 write(10,"('A3:'F8.5,'Rf:'F8.5,'daltA1:'F8.5)")A3,Rf,daltA1
036 
037 end do
038 end do
039 close(fileid)
040 stop
041 end
042 !!!!!!!!***************************************************
043 
044 !!!!!!!!!!!!!***********************************************求ref(A1)*****************
045subroutine A3_to_A(A3,A2,A4,A)
046 implicit none
047 real*8 A2,A3,A4,A
048 real,parameter::pi=3.14159
049 
050 A=cos(2.0*pi*A2)*cos(2.0*pi*A4)-sin(2.0*pi*A2)*(-cos(2.0*pi*A4)/tan(2.0*pi*A3)+sin(2.0*pi*A4))              !!A的函数式
051!write(*,*)A
052 return
053 end
054 
055 subroutine A3_to_B(A3,A2,A4,Z0,B)
056 implicit none
057 real*8 A2,A4,B,Z0,A3
058 real,parameter::pi=3.14159
059 
060 
061 B=Z0*(cos(2.0*pi*A2)*sin(2.0*pi*A4)+sin(2.0*pi*A2)*(sin(2.0*pi*A4)/tan(2.0*pi*A3)+cos(2.0*pi*A4)))            !!B的函数式
062!write(*,*)B
063 return
064 end
065 subroutine A3_to_C(A3,A1,A2,A4,Z0,C)
066 implicit none
067 real*8 A1,A2,A3,A4,C,Z0
068 real,parameter::pi=3.14159
069 
070 
071 C=1.0/Z0*(cos(2.0*pi*A4)*((-cos(2.0*pi*A2))/tan(2.0*pi*A1)+sin(2.0*pi*A2))+(sin(2.0*pi*A2)/tan(2.0*pi*A1)+cos(2.0*pi*A2))*((-cos(2.0*pi*A4))/tan(2.0*pi*A3)+sin(2.0*pi*A4)))
072 !write(*,*)C
073 return
074 end
075 
076 subroutine A3_to_D(A3,A1,A2,A4,D)
077 implicit none
078 real*8 A1,A2,A3,A4,D
079 real,parameter::pi=3.14159
080 
081 D=-sin(2.0*pi*A4)*(-cos(2.0*pi*A2)/tan(2.0*pi*A1)+sin(2.0*pi*A2))+(sin(2.0*pi*A2)/tan(2.0*pi*A1)+cos(2.0*pi*A2))*(sin(2.0*pi*A4)/tan(2.0*pi*A3)+cos(2.0*pi*A4))
082 !write(*,*)D
083 return
084 end
085 !!!!!!!!!!!***************************************E,F,ref*******
086 subroutine Get_E(Z0,Zi,Zr,A3,A1,A2,A4,E)
087 implicit none
088 real*8 A,B,C,D,Z0,Zi,Zr,A3,E,A1,A2,A4
089 
090 call A3_to_A(A3,A2,A4,A)
091 call A3_to_B(A3,A2,A4,Z0,B)
092 call A3_to_C(A3,A1,A2,A4,Z0,C)
093 call A3_to_D(A3,A1,A2,A4,D)
094 
095 
096 E=(A*Zr*(D-C*Zi)+C*Zr*(B+A*Zi))/(((D-C*Zi)**2+Zr**2*C**2)*Z0)
097 !write(*,*)E
098 return
099 end
100 
101 subroutine Get_F(A3,Z0,Zi,Zr,A1,A2,A4,F)
102 implicit none
103 real*8 A,B,C,D,Zi,Zr,Z0,F,A3,A1,A2,A4
104 
105 call A3_to_A(A3,A2,A4,A)
106 call A3_to_B(A3,A2,A4,Z0,B)
107 call A3_to_C(A3,A1,A2,A4,Z0,C)
108 call A3_to_D(A3,A1,A2,A4,D)
109 
110 F=((B+A*Zi)*(D-C*Zi)-A*C*Zr**2)/(((D-C*Zi)**2+Zr**2*C**2)*Z0)
111 !write(*,*)F
112 return
113 end
114 
115 subroutine Get_ref(A3,A1,A2,A4,Z0,Zi,Zr,E,F,ref)
116 implicit none
117 real*8 E,F,A3,ref,Z0,Zi,Zr,A1,A2,A4
118 call Get_E(Z0,Zi,Zr,A3,A1,A2,A4,E)
119 call Get_F(A3,Z0,Zi,Zr,A1,A2,A4,F)
120 
121 ref=((E**2-1+F**2)**2+4*F**2)/(((E+1)**2+F**2)**2)
122 !write(*,*)ref
123 return
124 end
125 !!!!!!!!!!!!!!!!!!**********************************************************
126 !!!!!!!!!!!!!!!!!!!*******************求ref(A1+daltA1)********************
127subroutine daltA1_t0_t(daltA1,A1,t)
128 implicit none
129 real*8 daltA1,A1,t
130 
131 t=daltA1+A1
132 
133 !write(*,*)t
134 return
135 end
136 
137 subroutine Get_C1(A3,daltA1,A1,A2,A4,Z0,t,C1)
138 implicit none
139 real*8 A1,A2,A3,A4,C1,Z0,daltA1,t
140 real,parameter::pi=3.14159
141 
142 call daltA1_t0_t(daltA1,A1,t)
143 
144 C1=1.0/Z0*(cos(2.0*pi*A4)*((-cos(2.0*pi*A2))/tan(2.0*pi*t)+sin(2.0*pi*A2))+(sin(2.0*pi*A2)/tan(2.0*pi*t)+cos(2.0*pi*A2))*((-cos(2.0*pi*A4))/tan(2.0*pi*A3)+sin(2.0*pi*A4)))
145 !write(*,*)C1
146 return
147 end
148 
149 subroutine Get_D1(A3,daltA1,A1,A2,A4,t,D1)
150 implicit none
151 real*8 A1,A2,A3,A4,daltA1,t,D1
152 real,parameter::pi=3.14159
153 
154 call daltA1_t0_t(daltA1,A1,t)
155 
156 D1=-sin(2.0*pi*A4)*(-cos(2.0*pi*A2)/tan(2.0*pi*t)+sin(2.0*pi*A2))+(sin(2.0*pi*A2)/tan(2.0*pi*t)+cos(2.0*pi*A2))*(sin(2.0*pi*A4)/tan(2.0*pi*A3)+cos(2.0*pi*A4))
157 !write(*,*)D1
158 return
159 end
160 !!!!!!!!!!******************E1,F1,refs**********************
161 subroutine Get_E1(A3,daltA1,A1,A2,A4,Z0,Zi,Zr,t,E1)
162 implicit none
163 real*8 A,B,C1,D1,Z0,Zi,Zr,A3,E1,daltA1,t,A1,A2,A4
164 
165 call A3_to_A(A3,A2,A4,A)
166 call A3_to_B(A3,A2,A4,Z0,B)
167 call Get_C1(A3,daltA1,A1,A2,A4,Z0,t,C1)
168 call Get_D1(A3,daltA1,A1,A2,A4,t,D1)
169 
170 
171 E1=(A*Zr*(D1-C1*Zi)+C1*Zr*(B+A*Zi))/(((D1-C1*Zi)**2+Zr**2*C1**2)*Z0)
172 
173 return
174 end
175 subroutine Get_F1(A3,daltA1,A1,A2,A4,Zi,Zr,Z0,t,F1)
176 implicit none
177 real*8 A,B,C1,D1,Zi,Zr,Z0,F1,A3,daltA1,t,A1,A2,A4
178 
179 call A3_to_A(A3,A2,A4,A)
180 call A3_to_B(A3,A2,A4,Z0,B)
181 call Get_C1(A3,daltA1,A1,A2,A4,Z0,t,C1)
182 call Get_D1(A3,daltA1,A1,A2,A4,t,D1)
183 
184 
185 F1=((B+A*Zi)*(D1-C1*Zi)-A*C1*Zr**2)/(((D1-C1*Zi)**2+Zr**2*C1**2)*Z0)
186 
187 return
188 end
189 
190 subroutine Get_refs(A3,A1,A2,A4,Zi,Zr,Z0,E1,F1,t,refs)
191 implicit none
192 real*8 E1,F1,A3,refs,daltA1,A1,A2,A4,Z0,Zi,Zr,t
193 call Get_E1(A3,daltA1,A1,A2,A4,Z0,Zi,Zr,t,E1)
194 call Get_F1(A3,daltA1,A1,A2,A4,Zi,Zr,Z0,t,F1)
195 
196 refs=((E1**2-1+F1**2)**2+4*F1**2)/(((E1+1)**2+F1**2)**2)
197 !write(*,*)refs
198 return
199 end
200 !!!!!!!!!!!!!!!!!!!!!!!!*********************************************
201 subroutine Get_Rf(A3,daltA1,A1,A2,A4,Zi,Zr,Z0,t,E,F,E1,F1,ref,refs,Rf)
202 implicit none
203 real*8 ref,refs,Rf
204 real*8 A3,daltA1,E,F,E1,F1,A1,A2,A4,Z0,Zi,Zr,t
205 call Get_ref(A3,A1,A2,A4,Z0,Zi,Zr,E,F,ref)
206 call Get_refs(A3,A1,A2,A4,Zi,Zr,Z0,E1,F1,t,refs)
207 
208 Rf=refs/ref
209 
210 return
211 end

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

742

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
726 元
贡献
371 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2014-5-13 11:33:05 | 只看该作者
让别人熟悉你的代码是一件困难的事情,何况没有任何注释。

第一
do k=1,100
       daltA1=daltA1+0.001
       do i=1,int(0.2/0.001)
          A3=A3+0.001
这里的 daltA1 和 A3 位于不同的循环嵌套内,更换位置,自然会不同,这很正常。

第二.
什么叫 daltA1 没有算进去?我不知道你希望怎么算。
关于计算结果不符合预期,别人往往帮不了你,因为别人不知道你的“预期”。所以,学会 Debug 调试是关键。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-29 19:38

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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