回 帖 发 新 帖 刷新版面

主题:程序结果如何求和

下面是迭代法的程序,我想把运行结果的前一半都加在一起,所以增加了do i=1,0.5*(n+1)
s=0.0
s=s+x(i)
enddo 
write(*,*) 's=',s
但是结果不正确,请问哪位可以帮忙修改一下。



subroutine ssor(a,n,b,x,eps,om,ii)
parameter(imax=10000)
real a(n,n),b(n),x(n)
integer i,j,ii
real r,rx
do i=1,n
   r=1/a(i,i)
   b(i)=b(i)*r
   do j=1,n
      a(i,j)=a(i,j)*r
    end do
end do
do ii=1,imax
   rx=0.0
   do i=1,n
      r=b(i)
      do j=1,n
         r=r-a(i,j)*x(j)
      enddo
      if (abs(r)>rx)rx=abs(r)
         x(i)=x(i)+om*r
      enddo
      if(om*rx<=eps) return 
 enddo
pause 'too many iterations'
end subroutine ssor

 program dir12
 ! drive program for routine ssor
 parameter(n=199,eps=1.e-7,om=1.3)
 parameter(v=0.5,u=0.03141593)
 dimension a(n,n),c(n,n),r(n),b(n),x(n)
 real s
a(1,1)=-(1+v*cos(0.5*u))**3-(1+v*cos(1.5*u))**3
a(1,2)=(1+v*cos(1.5*u))**3
a(199,198)=(1+v*cos(198.5*u))**3
a(199,199)=-(1+v*cos(198.5*u))**3-(1+v*cos(199.5*u))**3
do i=2,n-1
 a(i,i)=-(1+v*cos((i-0.5)*u))**3-(1+v*cos((i+0.5)*u))**3
 a(i,i+1)=(1+v*cos((i+0.5)*u))**3
 a(i,i-1)=(1+v*cos((i-0.5)*u))**3
 enddo
 do i=1,n
 b(i)=3*u*v*(cos((i+0.5)*u)-cos((i-0.5)*u))
 enddo

 do i=1,n
    do j=1,n
    c(i,j)=a(i,j)
    enddo
enddo
do l=1,n
   r(l)=b(l)
   x(l)=0.0
enddo
call ssor(c,n,r,x,eps,om,ii)
write(*,*) 'solution vector'
write(*,'(1x,199f12.9)') (x(l),l=1,n)
!test results with original matrix
write(*,*) 'right-hand side vector'
write(*,'(1x,199f12.9)') (b(l),l=1,n)
write(*,*) 'result of matrix applied to sol''n vector'
do l=1,n
   b(l)=0.0
   do j=1,n
     b(l)=b(l)+a(l,j)*x(j)
    enddo
enddo
write(*,'(1x,199f12.9)') (b(l),l=1,n)
write(*,*) 'iteration times=',ii

do i=1,0.5*(n+1)
s=0.0
s=s+x(i)
enddo 

write(*,*) 's=',s
end



回复列表 (共3个回复)

沙发

do i=1,0.5*(n+1)
这样的代码已经在新标准被废除了.
而且你这段代码有很严重的问题...

do i=1,0.5*(n+1)
s=0.0
s=s+x(i)
enddo
 
每次循环进去都会重设s=0.0之前算的就白费了. 改成

s=0.0
do i=1,<建议修改, 应改成什么你比我清楚>
s=s+x(i)
enddo 

fortran有个内部函数可以直接对矢量求和的, 不妨翻翻查查.

板凳


非常感谢,问题已解决。再次谢谢。

3 楼


用sum(1:(n+1)/2.)更简洁

我来回复

您尚未登录,请登录后再回复。点此登录或注册