fortran程序设计题 30
这个问题是140分的,写出来了http://zhidao.baidu.com/question/439297697.html?quesup2&oldq=1的100分也给你...
这个问题是140分的,写出来了
http://zhidao.baidu.com/question/439297697.html?quesup2&oldq=1 的100分也给你
1.线性方程组求解问题。
一物理系统可用下列线性方程组来表示:如图、
从文件中读入m1、m2和θ的值,求a1、a2、N1 和N2的值。其中g取9.8,输入θ时以角度为单位。
要求:
(1)分别用两种方法(例如高斯消去法、矩阵求逆法、三角分解法、追赶法等),定义求解线性方程组Ax=b的子程序,要求该子程序能求解任意线性方程组。
(2)在主程序中分别调用上面定义的两个子程序,并对求解结果进行对比分析。
(3)绘制以上两个方法所求得的方程解的数据分布图。 展开
http://zhidao.baidu.com/question/439297697.html?quesup2&oldq=1 的100分也给你
1.线性方程组求解问题。
一物理系统可用下列线性方程组来表示:如图、
从文件中读入m1、m2和θ的值,求a1、a2、N1 和N2的值。其中g取9.8,输入θ时以角度为单位。
要求:
(1)分别用两种方法(例如高斯消去法、矩阵求逆法、三角分解法、追赶法等),定义求解线性方程组Ax=b的子程序,要求该子程序能求解任意线性方程组。
(2)在主程序中分别调用上面定义的两个子程序,并对求解结果进行对比分析。
(3)绘制以上两个方法所求得的方程解的数据分布图。 展开
展开全部
这是1L所说的彭国伦97书中所附光盘上的源代码,采用Gauss_Jordan法求解线性方程组,[3 2 1] [a] [6]
[2 1 -1] * [b] = [2]
[1 -4 5] [c] [2]
可做相应更改。
以前我也没太注意Fortran求解方程组的问题,感谢1L,我这里只是随手之劳,所以楼主若是满意就把分给1楼:
module LinearAlgebra
implicit none
contains
! Gauss_Jordan法
subroutine Gauss_Jordan(A,S,ANS)
implicit none
real :: A(:,:)
real :: S(:)
real :: ANS(:)
real, allocatable :: B(:,:)
integer :: i, N
N = size(A,1)
allocate(B(N,N))
! 保存原先的矩阵A,及数组S
B=A
ANS=S
! 把B化成对角线矩阵(除了对角线外,都为0)
call Upper(B,ANS,N) ! 先把B化成上三好敬角矩阵
call Lower(B,ANS,N) ! 再把B化成下三角矩阵
! 求解
forall(i=1:N)
ANS(i)=ANS(i)/B(i,i)
end forall
return
end subroutine Gauss_Jordan
! 输出等式
subroutine output(M,S)
implicit none
real :: M(:,:), S(:)
integer :: N,i,j
N = size(M,1)
! write中加上advance="no",可以中止断行纳樱发生洞袜丛,使下一次的
! write接续在同一行当中.
do i=1,N
write(*,"(1x,f5.2,a1)", advance="NO") M(i,1),'A'
do j=2,N
if ( M(i,j) < 0 ) then
write(*,"('-',f5.2,a1)",advance="NO") -M(i,j),char(64+j)
else
write(*,"('+',f5.2,a1)",advance="NO") M(i,j),char(64+j)
end if
end do
write(*,"('=',f8.4)") S(i)
end do
return
end subroutine output
! 求上三角矩阵的子程序
subroutine Upper(M,S,N)
implicit none
integer :: N
real :: M(N,N)
real :: S(N)
integer :: I,J
real :: E
do I=1,N-1
do J=I+1,N
E=M(J,I)/M(I,I)
M(J,I:N)=M(J,I:N)-M(I,I:N)*E
S(J)=S(J)-S(I)*E
end do
end do
return
end subroutine Upper
! 求下三角矩阵的子程序
subroutine Lower(M,S,N)
implicit none
integer :: N
real :: M(N,N)
real :: S(N)
integer :: I,J
real :: E
do I=N,2,-1
do J=I-1,1,-1
E=M(J,I)/M(I,I)
M(J,1:N)=M(J,1:N)-M(I,1:N)*E
S(J)=S(J)-S(I)*E
end do
end do
return
end subroutine Lower
end module
! 求解联立式
program main
use LinearAlgebra
implicit none
integer, parameter :: N=3 ! Size of Matrix
real :: A(N,N)=reshape( (/1,2,3,4,5,6,7,8,8/),(/N,N/) )
real :: S(N)=(/12,15,17/)
real :: ans(N)
integer :: i
write(*,*) 'Equation:'
call output(A,S)
call Gauss_Jordan(A,S,ANS)
write(*,*) 'Ans:'
do i=1,N
write(*,"(1x,a1,'=',F8.4)") char(64+i),ANS(i)
end do
stop
end program
[2 1 -1] * [b] = [2]
[1 -4 5] [c] [2]
可做相应更改。
以前我也没太注意Fortran求解方程组的问题,感谢1L,我这里只是随手之劳,所以楼主若是满意就把分给1楼:
module LinearAlgebra
implicit none
contains
! Gauss_Jordan法
subroutine Gauss_Jordan(A,S,ANS)
implicit none
real :: A(:,:)
real :: S(:)
real :: ANS(:)
real, allocatable :: B(:,:)
integer :: i, N
N = size(A,1)
allocate(B(N,N))
! 保存原先的矩阵A,及数组S
B=A
ANS=S
! 把B化成对角线矩阵(除了对角线外,都为0)
call Upper(B,ANS,N) ! 先把B化成上三好敬角矩阵
call Lower(B,ANS,N) ! 再把B化成下三角矩阵
! 求解
forall(i=1:N)
ANS(i)=ANS(i)/B(i,i)
end forall
return
end subroutine Gauss_Jordan
! 输出等式
subroutine output(M,S)
implicit none
real :: M(:,:), S(:)
integer :: N,i,j
N = size(M,1)
! write中加上advance="no",可以中止断行纳樱发生洞袜丛,使下一次的
! write接续在同一行当中.
do i=1,N
write(*,"(1x,f5.2,a1)", advance="NO") M(i,1),'A'
do j=2,N
if ( M(i,j) < 0 ) then
write(*,"('-',f5.2,a1)",advance="NO") -M(i,j),char(64+j)
else
write(*,"('+',f5.2,a1)",advance="NO") M(i,j),char(64+j)
end if
end do
write(*,"('=',f8.4)") S(i)
end do
return
end subroutine output
! 求上三角矩阵的子程序
subroutine Upper(M,S,N)
implicit none
integer :: N
real :: M(N,N)
real :: S(N)
integer :: I,J
real :: E
do I=1,N-1
do J=I+1,N
E=M(J,I)/M(I,I)
M(J,I:N)=M(J,I:N)-M(I,I:N)*E
S(J)=S(J)-S(I)*E
end do
end do
return
end subroutine Upper
! 求下三角矩阵的子程序
subroutine Lower(M,S,N)
implicit none
integer :: N
real :: M(N,N)
real :: S(N)
integer :: I,J
real :: E
do I=N,2,-1
do J=I-1,1,-1
E=M(J,I)/M(I,I)
M(J,1:N)=M(J,1:N)-M(I,1:N)*E
S(J)=S(J)-S(I)*E
end do
end do
return
end subroutine Lower
end module
! 求解联立式
program main
use LinearAlgebra
implicit none
integer, parameter :: N=3 ! Size of Matrix
real :: A(N,N)=reshape( (/1,2,3,4,5,6,7,8,8/),(/N,N/) )
real :: S(N)=(/12,15,17/)
real :: ans(N)
integer :: i
write(*,*) 'Equation:'
call output(A,S)
call Gauss_Jordan(A,S,ANS)
write(*,*) 'Ans:'
do i=1,N
write(*,"(1x,a1,'=',F8.4)") char(64+i),ANS(i)
end do
stop
end program
更多追问追答
追问
我要的是这个问题的答案,,,,
追答
要求比1楼高多了,
例子是高斯消去法,等他人来补充——帮你按照另一种算法来求解吧。
Fortran本身并不能解决问题(3):绘制以上两个方法所求得的方程解的数据分布图。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询