用高斯消元法求解线性方程组
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例如:
3 -1 -1 5 10 -1 -2 -1 10 -2 4.2 7.2 8.3 Output 文件格式: 1、方程个数 n 2、方程的解 例如对以上的 Input 文件内容,其 Output 结果为: 3 1.1000000 1.2000000 1.3000000
!用高斯消去法求线性方程组的解 Ax=b,n*n !数据输入文件 input 的数据格式为 n,A,其中 A 按行优先 subroutine Gauss(input,output) character *(20) input,output real A(1:100,1:100),x(1:100),b(1:100),xx(1:100) integer n,k,i,j,flag,s,q,choice integer location(1:100),maxi,maxj,lch real temp,swap write(*,*)'****调用 Gauss 函数求解线性方程组****' write(*,*)'检验传入的数据' write(*,*)'检验 A(i,j)' open(10,file=input) read(10,*) n do i=1,n read(10,*) (A(i,j),j=1,n) write(*,*) (A(i,j),j=1,n) if(A(i,i).eq.0) choice=1
enddo write(*,*)'检验 b(i)' do i=1,n read(10,*) b(i) write(*,*) b(i) location(i)=i !初始 x(i)的位置 enddo write(*,*)'传入数据检验结束' close(10) do k=1,n-1 !利用全主元素消元法 write(*,*)'' write(*,*)'------>进行第 k 次消元,k=',k maxi=k makj=k do i=k,n do j=k,n if(A(i,j).gt.A(maxi,maxj)) then !记住ቤተ መጻሕፍቲ ባይዱ大值位置 maxi=i maxj=j end if enddo enddo write(*,*)'最大系数位置为:',maxi,maxj !交换行位置 do j=1,n temp=A(k,j) A(k,j)=A(maxi,j) A(maxi,j)=temp enddo temp=b(k) b(k)=b(maxi) b(maxi)=temp !交换列位置 do i=1,n temp=A(i,k) A(i,k)=A(i,maxj) A(i,maxj)=temp enddo write(*,*)'交换后的 A(i,j)' do i=1,n write(*,*) (A(i,j),j=1,n) enddo write(*,*)'交换后的 b(i)' write(*,*) (b(i),i=1,n) !记住列原本 x(i)交换后的位置 location(maxj)=k location(k)=maxj
!开始消元 do i=k+1,n b(i)=b(i)-b(k)*A(i,k)/A(k,k) do j=k+1,n A(i,j)=A(i,j)-A(k,j)*A(i,k)/A(k,k) enddo A(i,k)=0 enddo write(*,*)'消元结果 A(i,j)' do i=1,n write(*,*)(A(i,j),j=1,n) enddo write(*,*)'消元结果 b(i)' write(*,*)(b(i),i=1,n) enddo !输出消元结果 write(*,*)'************最终消元结果************' do i=1,n write(*,*) '线性方程:',i write(*,*) (A(i,j),j=1,n),b(i) enddo write(*,*)'************最终消元结果************' !回代方程 x(n)=b(n)/A(n,n) do i=n-1,1,-1 temp=0.0 do j=i+1,n temp=temp+A(i,j)*x(j) enddo x(i)=(b(i)-temp)/A(i,i) enddo write(*,*)'Gauss 函数求解结果:' open(20,file=output) write(20,*) n !还原 x(i)到初始位置 do i=1,n xx(location(i))=x(location(i)) enddo !输出最终结果 do i=1,n write(*,*) xx(i) write(20,*) xx(i) enddo close(20) write(*,*)'****高斯消元法调用结束****' return end
!主程序 character *(20) input,output input='test.dat' output='result.dat' call Gauss(input,output) end
高斯消元法解线性方程组-- Fortran 语言 陈洋洋 程序说明: 子过程 Gauss(input,output)用来求解线性方程组 Ax=b,参数 input 为输入文件名,output 为 输出文件名。
Input 文件格式: 1、给出系数矩阵的阶数 n 2、给出系数矩阵 A(行优先) 3、给出向量 b
3 -1 -1 5 10 -1 -2 -1 10 -2 4.2 7.2 8.3 Output 文件格式: 1、方程个数 n 2、方程的解 例如对以上的 Input 文件内容,其 Output 结果为: 3 1.1000000 1.2000000 1.3000000
!用高斯消去法求线性方程组的解 Ax=b,n*n !数据输入文件 input 的数据格式为 n,A,其中 A 按行优先 subroutine Gauss(input,output) character *(20) input,output real A(1:100,1:100),x(1:100),b(1:100),xx(1:100) integer n,k,i,j,flag,s,q,choice integer location(1:100),maxi,maxj,lch real temp,swap write(*,*)'****调用 Gauss 函数求解线性方程组****' write(*,*)'检验传入的数据' write(*,*)'检验 A(i,j)' open(10,file=input) read(10,*) n do i=1,n read(10,*) (A(i,j),j=1,n) write(*,*) (A(i,j),j=1,n) if(A(i,i).eq.0) choice=1
enddo write(*,*)'检验 b(i)' do i=1,n read(10,*) b(i) write(*,*) b(i) location(i)=i !初始 x(i)的位置 enddo write(*,*)'传入数据检验结束' close(10) do k=1,n-1 !利用全主元素消元法 write(*,*)'' write(*,*)'------>进行第 k 次消元,k=',k maxi=k makj=k do i=k,n do j=k,n if(A(i,j).gt.A(maxi,maxj)) then !记住ቤተ መጻሕፍቲ ባይዱ大值位置 maxi=i maxj=j end if enddo enddo write(*,*)'最大系数位置为:',maxi,maxj !交换行位置 do j=1,n temp=A(k,j) A(k,j)=A(maxi,j) A(maxi,j)=temp enddo temp=b(k) b(k)=b(maxi) b(maxi)=temp !交换列位置 do i=1,n temp=A(i,k) A(i,k)=A(i,maxj) A(i,maxj)=temp enddo write(*,*)'交换后的 A(i,j)' do i=1,n write(*,*) (A(i,j),j=1,n) enddo write(*,*)'交换后的 b(i)' write(*,*) (b(i),i=1,n) !记住列原本 x(i)交换后的位置 location(maxj)=k location(k)=maxj
!开始消元 do i=k+1,n b(i)=b(i)-b(k)*A(i,k)/A(k,k) do j=k+1,n A(i,j)=A(i,j)-A(k,j)*A(i,k)/A(k,k) enddo A(i,k)=0 enddo write(*,*)'消元结果 A(i,j)' do i=1,n write(*,*)(A(i,j),j=1,n) enddo write(*,*)'消元结果 b(i)' write(*,*)(b(i),i=1,n) enddo !输出消元结果 write(*,*)'************最终消元结果************' do i=1,n write(*,*) '线性方程:',i write(*,*) (A(i,j),j=1,n),b(i) enddo write(*,*)'************最终消元结果************' !回代方程 x(n)=b(n)/A(n,n) do i=n-1,1,-1 temp=0.0 do j=i+1,n temp=temp+A(i,j)*x(j) enddo x(i)=(b(i)-temp)/A(i,i) enddo write(*,*)'Gauss 函数求解结果:' open(20,file=output) write(20,*) n !还原 x(i)到初始位置 do i=1,n xx(location(i))=x(location(i)) enddo !输出最终结果 do i=1,n write(*,*) xx(i) write(20,*) xx(i) enddo close(20) write(*,*)'****高斯消元法调用结束****' return end
!主程序 character *(20) input,output input='test.dat' output='result.dat' call Gauss(input,output) end
高斯消元法解线性方程组-- Fortran 语言 陈洋洋 程序说明: 子过程 Gauss(input,output)用来求解线性方程组 Ax=b,参数 input 为输入文件名,output 为 输出文件名。
Input 文件格式: 1、给出系数矩阵的阶数 n 2、给出系数矩阵 A(行优先) 3、给出向量 b