主题:各位高手来看下怎么改
wufan_1988
[专家分:0] 发布于 2010-05-15 21:03:00
这程序运行不出结果来,大家来帮忙改改啊。灰常谢谢!!
implicit none
integer i,p,n
real q(20,20),a(20),b(20),c(20),h(20),y(20),x(20),D(20),K(20), qa(20),sx(20)
real t,z,ET,R,r1,r2
real,parameter::e=2.7128
qa(0)=0.28
n=20
t=1
z=2
ET=0
R=0.0208
a(0)=0
D(0)=1671.8*(qa(0)/0.462)**4.978
K(0)=(2.7E-8)*(e**(47.3*qa(0)))
b(0)=D(0)/z
c(0)=-b(0)
h(0)=R-K(0)-ET
y(0)=h(0)/b(0)
x(0)=c(0)/b(0)
r1=t/z**2
r2=t/(2*z)
i=1
do
D(i)=1671.8*((qa(i)/0.462)**4.978)
K(i)=(2.7E-8)*(e**(47.3*qa(i)))
a(i)=-r1*(D(i)+D(i-1))/2
c(i)=-r1*(D(i)+D(i+1))/2
b(i)=1-(a(i)+c(i))
h(i)=qa(i)-r2*(K(i+1)-K(i-1))
y(i)=(h(i)-a(i)*y(i-1))/(b(i)-a(i)*x(i-1))
x(i)=c(i)/(b(i)-a(i)*x(i-1))
i=i+1
if (i==n-2)exit
qa(n-1)=(h(n-1)-a(n-1)*y(n-2))/(b(n-1)-a(n-1)*x(n-2))
end do
do i=n-2,0
qa(i)=y(i)-x(i)*qa(i+1)
print*,qa(i)
end do
p=1
do
q(i,p)=qa(i)
q(i,p-1)=q(i,p)
sx(p)=abs((q(i,p)-q(i,p-1))/q(i,p-1))
p=p+1
if(sx(p)<=0.01)exit
end do
qa(i)=q(i,p)
print*,qa(i)
end
最后更新于:2010-05-16 13:16:00
回复列表 (共12个回复)
沙发
asymptotic [专家分:16630] 发布于 2010-05-15 21:25:00
网上求助,建议你先把 read 语句换成赋值,否则,别人未必知道您输入值。
3 楼
shine_666 [专家分:310] 发布于 2010-05-16 17:53:00
我刚才复制到程序里测试了一下,发现你的很多数组时从零开始的,而你的声明却是默认的,就是从一开始,所以会发生错误,要把比如a(20)改成A(0:20)
4 楼
wufan_1988 [专家分:0] 发布于 2010-05-16 18:19:00
行,我去试试,有问题在问你行不?
非常谢谢!!
5 楼
asymptotic [专家分:16630] 发布于 2010-05-16 20:41:00
经如下修改,程序可以运行,但还有 错误,因为不知道你程序到底是要干什么,所以,不好修改。
program main
implicit none
integer:: i, p, n
real:: q(0 : 20, 0 : 20)
real:: a(0 : 20),b(0 : 20),c(0 : 20)
real:: h(0 : 20),y(0 : 20),x(0 : 20)
real:: D(0 : 20), K(0 : 20)
real:: qa(0 : 20), sx(20)
real:: t,z,ET,R,r1,r2
real, parameter:: e = 2.7128
qa(0) = 0.28
n = 20
t = 1
z = 2
ET = 0
R=0.0208
a(0)=0
D(0)=1671.8*(qa(0)/0.462)**4.978
K(0)=(2.7E-8)*(e**(47.3*qa(0)))
b(0)=D(0)/z
c(0)=-b(0)
h(0)=R-K(0)-ET
y(0)=h(0)/b(0)
x(0)=c(0)/b(0)
r1=t/z**2
r2=t/(2*z)
i=1
do
D(i)=1671.8*((qa(i)/0.462)**4.978)
K(i)=(2.7E-8)*(e**(47.3*qa(i)))
a(i)=-r1*(D(i)+D(i-1))/2
c(i)=-r1*(D(i)+D(i+1))/2
b(i)=1-(a(i)+c(i))
h(i)=qa(i)-r2*(K(i+1)-K(i-1))
y(i)=(h(i)-a(i)*y(i-1))/(b(i)-a(i)*x(i-1))
x(i)=c(i)/(b(i)-a(i)*x(i-1))
i=i+1
if (i==n-2)exit
qa(n-1)=(h(n-1)-a(n-1)*y(n-2))/(b(n-1)-a(n-1)*x(n-2))
end do
do i = n - 2, 0, -1
qa(i) = y(i)-x(i)*qa(i+1)
write(*, *) qa(i)
end do
p=1
do
q(i,p)=qa(i)
q(i,p-1)=q(i,p)
sx(p)=abs((q(i,p)-q(i,p-1))/q(i,p-1))
p=p+1
if(sx(p)<=0.01)exit
end do
qa(i)=q(i,p)
write(*, *) qa(i)
stop
end program main
6 楼
wufan_1988 [专家分:0] 发布于 2010-05-17 15:12:00
我现在把整个程序分解成几个小的
implicit none
real a(20),b(20),c(20),h(20),y(20),x(20),D(20),K(20),qa(20)
real t,z,r1,r2
real,parameter::e=2.7128
read*,t,z
qa(0)=0.28
D(0)=138.2131
K(0)=1.4843927E-02
h(0)=5.9560733E-03
a(0)=0
x(0)=-1
b(0)=D(0)/z
c(0)=-b(0)
y(0)=h(0)/b(0)
r1=t/(z**2)
r2=t/(2*z)
qa(1)=(y(0)-qa(0))/x(0)
D(1)=1671.8*((qa(1)/0.462)**4.978)
K(1)=(2.7E-8)*(e**(47.3*qa(1)))
a(1)=-r1*D(0)
c(1)=-r1*D(1)
b(1)=1-(a(1)+c(1))
h(1)=qa(1)-r2*(K(1)-K(0))
y(1)=(h(1)-a(1)*y(0))/(b(1)-a(1)*x(0))
x(1)=c(1)/(b(1)-a(1)*x(0))
qa(2)=(y(1)-qa(1))/x(1)
D(2)=1671.8*((qa(2)/0.462)**4.978)
K(2)=(2.7E-8)*(e**(47.3*qa(2)))
a(2)=-r1*D(1)
c(2)=-r1*D(2)
b(2)=1-(a(2)+c(2))
h(2)=qa(2)-r2*(K(2)-K(1))
y(2)=(h(2)-a(2)*y(1))/(b(2)-a(2)*x(1))
x(2)=c(2)/(b(2)-a(2)*x(1))
print*,qa(2),D(2),K(2),a(2),b(2),c(2),h(2),y(2),x(2)
end
目前的问题是 那些数组这样从1开始带入能运行 用循环(i)就运行不出来
7 楼
yeg001 [专家分:14390] 发布于 2010-05-17 20:05:00
唉~ 楼主你没看明白楼上几位为什么帮你改那个"0"!!
不知道你是否有C的基础, C语言的数组序数默认是由0到n-1; 但是Fortran恰好不是. (估计没翻书或者翻书不认真)
所以你调用qa(0)本身就是越界, 越界不一定不能运行, 但是编程不允许的. 你一定要序数有0开始就用3楼和5楼的定义.
8 楼
wufan_1988 [专家分:0] 发布于 2010-05-17 20:36:00
[em8] 我C和FORTRAN都看过,会混了,丢人啊,呵呵
9 楼
yeg001 [专家分:14390] 发布于 2010-05-17 22:58:00
犯错误不丢人, 改过来就是了. 那个初学都这样走过来.
我也是学了C在转过来的, 只要注意一下Fortran的特点, 其实有C的基础Fortran挺好上手的.
10 楼
xiaoruo331 [专家分:100] 发布于 2010-05-18 09:34:00
深圳华信群英科技有限公司,目前主要从事软件外包开发、高级软件人才定向输送等业务,面对日益严峻的大学生就业难和IT企业招聘难,自2006以来,与知名通信软件公司正式签订定向输送人才的合作协议,针对想进入软件行业的人员提供企业实训,实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段,共计900学时。
企业订单委培,内训前签订就业安置协议,100%保证就业。实训结束之后,在华信群英科技及其战略合作伙伴从事通信软件研发工作。欢迎有意向者加QQ:649846168咨询。
我来回复