Fortran Coder

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

初学Fortran,根据算法编译的程序结果显示都是0,烦请指点.

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
10 点
跳转到指定楼层
楼主
发表于 2016-4-1 14:40:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
001module bicgstabj
002!----------------------------------------module coment
003! Version : V1.0
004! Coded by : syz
005! Date : 2016-4-1
006!-----------------------------------------------------
007! Description : 稳定双共轭梯度法
008!
009!-----------------------------------------------------
010! Parameters :
011! 1. IMAX--最大允许迭代次数
012! 2. tol--误差容限
013!
014! Contains :
015! 1. solve 迭代法方法函数
016! 2.
017! 3. dr(r,N) 计算向量长度平方函数
018! 4. Ar(A,r,N) 计算矩阵乘以向量函数,返回向量
019! 5. rAr(A,r,N) 计算(Ar,r)函数
020!-----------------------------------------------------
021! Post Script :
022! 1. 里面的三个函数,可以简化程序,同时可以用在其他地方
023! 2.
024!-----------------------------------------------------
025implicit real*8(a-z)
026integer::IMAX=200
027real*8::tol=1d-7
028contains
029subroutine solve(A,b,x,x0,N)
030!---------------------------------subroutine comment
031! Version : V1.0
032! Coded by : syz
033! Date : 2016-4-1
034!-----------------------------------------------------
035! Purpose : 稳定双共轭梯度法
036! 用于计算方程AX=b
037!-----------------------------------------------------
038! Input parameters :
039! 1. A,b 意义即 AX=b
040! 2. x0 迭代初值
041! 3. N 方程的维数
042! Output parameters :
043! 1. x 方程的解
044! 2.
045! Common parameters :
046!
047!----------------------------------------------------
048implicit real*8(a-z)
049integer::N
050integer::i,j,k
051real*8::A(N,N),b(N),x(N),x0(N)
052real*8::r0(N),r1(N),r(N),r00(N),p0(N),p1(N)
053real*8::x1(N),x2(N)
054!写入标题
055write(102,501)
056501 format(//,18x,'稳定双共轭梯度法中间结果',//)
057x1=x0
058r0=b-Ar(A,x1,N)
059p0=r0
060r00=r0
061do k=1,IMAX
062tmp1=rAr(r00,r0,N)
063tmp2=rAr(r00,Ar(A,p0,N),N)
064afa=tmp1/tmp2
065x3=x1+afa*p0
066r3=r0-afa*Ar(A,p0,N)
067oumiga=rAr(A,r3,N)/dr(Ar(A,r3,N),N)
068x2=x3+oumiga*r3
069!记录迭代中间值
070write(102,502)k,x2
071502 format(I3,4F12.8)
072!如果r0 接近于,则停止迭代
073dr_s=dsqrt(dr(r0,N))
074if (dr_s<tol) exit
075r1=r3-oumiga*Ar(A,r,N)
076tmp3=rAr(r1,r00,N)
077beta=(afa/oumiga)*(tmp3/tmp1)
078p1=r1+beta*(p0-oumiga*Ar(A,p0,N))
079!全部更新
080r0=r1
081p0=p1
082x1=x2
083end do
084x=x2
085end subroutine solve
086function dr(r,N)
087!---------------------------------subroutine comment
088! Version : V1.0
089! Coded by : syz
090! Date : 2016-4-1
091!-----------------------------------------------------
092! Purpose : 计算向量长度平方 (r,r)
093!
094!-----------------------------------------------------
095! Input parameters :
096! 1. r 向量
097! 2. N 维数
098! Output parameters :
099! 1. dr 长度平方
100! 2.
101! Common parameters :
102!
103!----------------------------------------------------
104implicit real*8(a-z)
105integer::N,i
106real*8::r(N),dr
107s=0
108do i=1,N
109s=s+r(i)**2
110end do
111dr=s
112end function dr
113function Ar(A,r,N)
114!---------------------------------subroutine comment
115! Version : V1.0
116! Coded by : syz
117! Date : 2016-4-1
118!-----------------------------------------------------
119! Purpose : !计算 A*r,返回N 维向量
120!
121!-----------------------------------------------------
122! Input parameters :
123! 1. r 向量
124! 2. N 维数
125! 3. A 矩阵
126! Output parameters :
127! 1. Ar 返回向量
128! 2.
129! Common parameters :
130!
131!----------------------------------------------------
132implicit real*8(a-z)
133integer::i,N
134real*8::A(N,N),r(N),temp(N),Ar(N)
135temp=0
136do i=1,N
137do j=1,n
138temp(i)=temp(i)+A(i,j)*r(j)
139end do
140end do
141Ar=temp
142end function ar
143function v1v2(v1,v2,N)
144!---------------------------------subroutine comment
145! Version : V1.0
146! Coded by : syz
147! Date : 2016-4-1
148!-----------------------------------------------------
149! Purpose : 向量点乘 v1v2=v1(1)*v2(1)+v1(2)*v(2)+...
150!
151! Post Script :
152! 1.
153! 2.
154! 3.
155!
156!-----------------------------------------------------
157! Input parameters :
158! 1. v1,v2 向量
159! 2. N 向量维数
160! Output parameters :
161! 1. v1,v2 向量点乘值
162! 2.
163! Common parameters :
164! 1.
165! 2.
166!----------------------------------------------------
167implicit real*8(a-z)
168integer::n
169real*8::v1(n),v2(n)
170integer::i
171v1v2=0
172do i=1,n
173v1v2=v1v2+v1(i)*v2(i)
174end do
175end function
176function rAr(A,r,N)
177!---------------------------------subroutine comment
178! Version : V1.0
179! Coded by : syz
180! Date : 2016-4-1
181!-----------------------------------------------------
182! Purpose : !计算(Ar,r),返回标量
183!
184!-----------------------------------------------------
185! Input parameters :
186! 1. r 向量
187! 2. N 维数
188! 3. A 矩阵
189! Output parameters :
190! 1. Ar 返回标量
191! 2.
192! Common parameters :
193!----------------------------------------------------
194implicit real*8(a-z)
195integer::i,N
196real*8::A(N,N),r(N),temp(N)
197temp=Ar(A,r,N)
198rAr=v1v2(r,temp,N)
199end function rAr
200end module bicgstabj
201program main
202!--------------------------------------program comment
203! Version : V1.0
204! Coded by : syz
205! Date : 2016-4-1
206!-----------------------------------------------------
207! Purpose : 采用稳定双共轭梯度法计算线性方程
208!
209!-----------------------------------------------------
210! In put data files :
211! 1.
212! 2.
213! Output data files :
214! 1. Im_result.txt 计算的中间数据
215! 2. result.txt 计算结果
216!-----------------------------------------------------
217use bicgstabj
218implicit real*8(a-z)
219integer,parameter::N=4
220real*8 ::A(N,N),b(N),x(N),x0(N)
221open(unit=101,file='result.txt')
222open(unit=102,file='Im_result.txt')
223!迭代初值
224x0=(/1d0,1d0,1d0,1d0/)
225!系数
226b=(/62d0,87d0,91d0,90d0/)
227A=reshape((/5d0,7d0,6d0,5d0,&
2287d0,10d0,8d0,7d0,&
2296d0,8d0,10d0,9d0,&
2305d0,7d0,9d0,10d0/),(/4,4/))
231! 调用函数
232call solve(A,b,x,x0,N)
233write(101,501)x
234501 format(/,T10,'稳定双共轭梯度法',//,&
2352x,'x(1)=',F15.8,/,&
2362x,'x(2)=',F15.8,/,&
2372x,'x(3)=',F15.8,/,&
2382x,'x(4)=',F15.8)
239end program main

算法.png (621.51 KB, 下载次数: 204)

算法.png
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2016-4-1 21:58:51 | 只看该作者
1. 你使用什么编译器?
2. 我使用 gfortran 编译上述程序,会报错。
3. 修改代码后,得到结果
  x(1)=    22.85115620
  x(2)=   160.18391519
  x(3)=  -140.46884071
  x(4)=   209.15349955

不知是否正确?
4. 修改方法是:
53 行 real*8::x1(N),x2(N),x3(N),r3(N)!//要定义x3,r3
133 行 integer::i,N,j!//要定义j
5. 强烈建议,每个程序都写上 Implicit None
请回答我的第一个问题,谢谢

2016-04-01 21-57-27屏幕截图.png (17.89 KB, 下载次数: 218)

2016-04-01 21-57-27屏幕截图.png
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-29 20:32

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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