主题:程序结果如何求和
下面是迭代法的程序,我想把运行结果的前一半都加在一起,所以增加了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
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