列主元的高斯消元法(FORTRAN)

2021-10-09 19:30:57 字數 1819 閱讀 1014

program guass1

real,dimension(:,:),allocatable::arr

real,dimension(:),allocatable::x

real a

integer i,j,k,n

!輸入、輸出數列

write(*,*)'請輸入需要計算的係數矩陣的大小n='

read*,n

allocate(arr(n,n+1))

allocate(x(n))

write(*,*)'請以列為主次序依次輸入矩陣元素(係數矩陣:常係數矩陣\n'c

read*,arr

do i=1,n

write(*,*) arr(i,:)

end do

write(*,*)'高斯消元法\n'c

!列主元的高斯消元法

do k=1,n-1 !k代表當前消元列數

!列主元

call compare(arr,k,n)

do i=k+1,n !i代表行

a=arr(i,k)/arr(k,k)

do j=k,n+1 !j代表列

arr(i,j)=arr(i,j)-a*arr(k,j)

enddo

enddo

enddo

!輸出消元後矩陣

do i=1,n

write(*,*) arr(i,:)

end do

!回帶求解過程

x(n)=arr(n,n+1)/arr(n,n)

do i=n-1,1,-1 !行

a=0do j=n,i+1,-1 !列

a=a+arr(i,j)*x(j)

enddo

x(i)=(arr(i,n+1)-a)/arr(i,i)

enddo

write(*,*)'\n'c, x

! 100 format(1x,'arr(',i2,',',i2,')=',f8.2)

! 200 format(1x,f6.2)

pause

end!找到主元行並調換

subroutine compare(arr,k,n)

!real,dimension(:,:),allocatable::arr

real,dimension(n,n+1)::arr

!allocate(arr(n,n+1))

integer biggest,k,n,m

do m=k,n-1,1

biggest=k

if(arr(k,biggest)biggest=m+1

endif

enddo

if(biggest.ne.k)then

do m=k,n+1,1

call exchange(arr(k,m),arr(biggest,m))

enddo

endif

end subroutine

!調換兩個元素的值

subroutine exchange(a,b)

real a,b

a=a-b

b=b+a

a=b-a

write(*,*)'a=',a,'b=',b

end subroutine

列主元的高斯消元法只需要在高斯消元法的基礎上增加選取主元和交換兩行方程位置的功能即可。這個**比較好實現,在編寫過程中遇到的困難是因為才開始學習fortran,導致主程式和子程式中的陣列的呼叫出現了問題。計算過程中不可避免會產生捨入誤差,但咱學計算方法不就是為了減少捨入誤差對全部計算結果的影響麼。

高斯消元法(二) 高斯消元法原理

高斯消去法是一種常用的求解線性方程組的方法,通過逐次消元後,在回代求解,實際計算中常用的一種方法。順序消去法 將ax b按照從上至下 從左至右的順序化為上三角方程組,中間過程不對矩陣進行交換,主要步驟如下。step1 將第2行至第n行,每行分別與第一行做運算,消掉每行第乙個引數。公式如 形成如下圖所...

高斯消元(浮點數主列法消元,有剪枝細節

1 include 2 include 3 include 4 include 5 using namespace std 6const double eps 1e 8 7 8 typedef vectorvec 9 typedef vectormat 1011 vec gauss const ma...

高斯消元法

寒假前,小導師給我們布置了三道程式設計題,其中有一道是利用高斯消元法解線性方程組的。在網上搜了些資料,自己照葫蘆畫瓢編出乙個簡單的高斯消元法 利用矩陣的初等行變換 高斯消元法解線性方程組 include include include define dim 10 double a dim 1 dim...