主题:编辑通过,调试出问题,求大神,程序和问题参见附件
program agaus0
dimension a(4,4),b(4),x(4),js(4)
double precision a,b,x
data a/0.2368,0.1968,0.1582,1.1161,0.2471,0.2071,1.1675,0.1254,0.2568,1.2168,0.1768,0.1397,1.2671,0.2271,0.1871,0.1490/
data b/1.8471,1.7471,1.6471,1.5471/
n=4
call agaus(a,b,n,x,l,js)
if(l.ne.0)then
write(*,10)(i,x(i),i=1,4)
end if
10format(1x,'x(',i2,')=',d15.6)
end
subroutine agaus(a,b,n,x,l,js)
!a--双精度实型二维数组,体积为n*n,输入参数。存放方程组的系数矩阵,返回时将被破坏。
!b--双精度实型一维数组,长度为n,输入参数。存放方程组右端向量,返回时将被破坏。
!n--整型变量,输入参数。存放方程组的阶数。
!x--双精度实型一维数组,长度为n,输出参数,返回方程组的解向量。
!l--整型变量,输出参数。若返回l=0,说明方程组的系数矩阵奇异,求解失败;若l/=0,说明正常返回。
!Js--整型一维数组,长度为n,为本子程序的工作数组。
dimension a(n,n),x(n),b(n),js(n)
double precision a,b,x,t
l=1
do 50 k=1,n-1
do 210 i=k,n
do 210 j=k,n
if(abs(a(I,j)).gt.d)then
d=abs(a(I,j))
js(k)=j
is=i
end if
210 continue
If(d+1.0.eq.1.0)then
l=0
else
if(js(k).ne.k)then
do 220 i=1,n
t=a(i,k)
a(i,k)=a(i,js(k))
a(i,js(k))=t
220 continue
end if
if(is.ne.k)then
do 230 j=k,n
t=a(k,j)
a(k,j)=a(is,j)
a(is,j)=t
230 continue
t=b(k)
b(k)=b(is)
b(is)=t
end if
end if
if(l.eq.0)then
write(*,100)
return
end if
do 10 j=k+1,n
a(k,j)=a(k,j)/a(k,k)
10 continue
b(k)=b(k)/a(k,k)
do 30 i=k+1,n
do 20 j=k+1,n
a(i,j)=a(i,j)-a(i,k)*a(k,j)
20 continue
b(i)=b(i)-a(i,k)*b(k)
30 continue
50 continue
If(abs(a(n,n))+1.0.eq.1.0)then
l=0
write(*,100)
return
end if
x(n)=b(n)/a(n,n)
do 70 i=n-1,1,-1
t=0.0
do 60 j=i+1,n
t=t+a(i,j)*x(j)
60 continue
x(i)=b(i)-t
70 continue
100 format(1x,'fail')
js(n)=n
do 150 k=n,1,-1
if(js(k).ne.k)then
t=x(k)
x(k)=x(js(k))
x(js(k))=t
end if
150 continue
return
dimension a(4,4),b(4),x(4),js(4)
double precision a,b,x
data a/0.2368,0.1968,0.1582,1.1161,0.2471,0.2071,1.1675,0.1254,0.2568,1.2168,0.1768,0.1397,1.2671,0.2271,0.1871,0.1490/
data b/1.8471,1.7471,1.6471,1.5471/
n=4
call agaus(a,b,n,x,l,js)
if(l.ne.0)then
write(*,10)(i,x(i),i=1,4)
end if
10format(1x,'x(',i2,')=',d15.6)
end
subroutine agaus(a,b,n,x,l,js)
!a--双精度实型二维数组,体积为n*n,输入参数。存放方程组的系数矩阵,返回时将被破坏。
!b--双精度实型一维数组,长度为n,输入参数。存放方程组右端向量,返回时将被破坏。
!n--整型变量,输入参数。存放方程组的阶数。
!x--双精度实型一维数组,长度为n,输出参数,返回方程组的解向量。
!l--整型变量,输出参数。若返回l=0,说明方程组的系数矩阵奇异,求解失败;若l/=0,说明正常返回。
!Js--整型一维数组,长度为n,为本子程序的工作数组。
dimension a(n,n),x(n),b(n),js(n)
double precision a,b,x,t
l=1
do 50 k=1,n-1
do 210 i=k,n
do 210 j=k,n
if(abs(a(I,j)).gt.d)then
d=abs(a(I,j))
js(k)=j
is=i
end if
210 continue
If(d+1.0.eq.1.0)then
l=0
else
if(js(k).ne.k)then
do 220 i=1,n
t=a(i,k)
a(i,k)=a(i,js(k))
a(i,js(k))=t
220 continue
end if
if(is.ne.k)then
do 230 j=k,n
t=a(k,j)
a(k,j)=a(is,j)
a(is,j)=t
230 continue
t=b(k)
b(k)=b(is)
b(is)=t
end if
end if
if(l.eq.0)then
write(*,100)
return
end if
do 10 j=k+1,n
a(k,j)=a(k,j)/a(k,k)
10 continue
b(k)=b(k)/a(k,k)
do 30 i=k+1,n
do 20 j=k+1,n
a(i,j)=a(i,j)-a(i,k)*a(k,j)
20 continue
b(i)=b(i)-a(i,k)*b(k)
30 continue
50 continue
If(abs(a(n,n))+1.0.eq.1.0)then
l=0
write(*,100)
return
end if
x(n)=b(n)/a(n,n)
do 70 i=n-1,1,-1
t=0.0
do 60 j=i+1,n
t=t+a(i,j)*x(j)
60 continue
x(i)=b(i)-t
70 continue
100 format(1x,'fail')
js(n)=n
do 150 k=n,1,-1
if(js(k).ne.k)then
t=x(k)
x(k)=x(js(k))
x(js(k))=t
end if
150 continue
return
end