| New Reply |
Solving a linear system with Gauss-Seidel's method |
Share Thread |
| Jun27-11, 03:26 PM | #1 |
|
|
Solving a linear system with Gauss-Seidel's method
Edit: Problem solved. Look at the bottom of this post.
Ok so far I've made a working program that can solve for x in Ax=b using Jacobi method. I've tried to use Gauss-Seidel method too, but I failed in doing so. I took as an example, the following A matrix: Code:
4 -1 0 -1 0 0 -1 4 -1 0 -1 0 0 -1 4 0 0 -1 -1 0 0 4 -1 0 0 -1 0 -1 4 -1 0 0 -1 0 -1 4 Code:
1 1 1 1 1 1 Code:
1 1 1 1 1 1 As a result, I should get a value for the vector x close to Code:
0.57024383544921875 0.71393871307373047 0.57024383544921875 0.57118320465087891 0.71261024475097656 0.57118320465087891 Code:
0.27777910232543945 0.62212115526199341 0.54369938373565674 0.48600935935974121 0.66520172357559204 0.55222527682781219 Code:
program hope
implicit none
integer :: p, n, n_max
real :: tol
98 write(*,*)"In order to solve the linear system, do you want to use Jacobi(1)'s method or Gauss-Seidel(2)'s one?"
read(*,*)p
write(*,*)"Enter the order n of the matrix A, a tolerance and a maximum number of iterations"
read(*,*)n, tol, n_max
if (p==1) then
call jacobi(n_max,n,tol)
else if (p==2) then
call gauss(n_max,n,tol)
else
write(*,*)"Please choose a valid option"
goto 98
end if
end program
subroutine jacobi (n_max,n,tol)
implicit none
integer :: i,j,k
real :: sup_sum, low_sum, norm
integer, intent(in) :: n_max, n
real, dimension(n) :: b, u,x
real, intent(in) :: tol
real, dimension(n,n) :: A
open(unit=10,file="A_matrix.dat")
open(unit=15,file="b_vector.dat")
open(unit=20,file="initial_vector.dat")
do i=1,n
read(10,*) (A(i,j),j=1,n)
read(15,*) b(i)
read(20,*) x(i)
end do
close(10)
close(15)
close(20)
k=1
norm=100
do while ( (k<=n_max).and.(tol<norm) )
sup_sum = b(1)
do j=2,n
sup_sum = sup_sum - A(1,j)*x(j)
end do
u(1)=sup_sum/a(1,1)
do i=2,n
low_sum=dot_product( A(i,1:i-1), x(1:i-1))
sup_sum=dot_product( A(i,i+1:n), x(i+1:n))
u(i)=(b(i)-low_sum-sup_sum)/A(i,i)
end do
norm=0
do i=1,n
norm=norm+abs(x(i)-u(i))
end do
do i=1,n
x(i)=u(i)
end do
write(*,*) k, norm
k=k+1
end do
open(unit=25,file="final_vectorjacobi.dat")
do i=1,n
write(25,*) x(i)
end do
close(25)
end subroutine
subroutine gauss (n_max,n,tol)
implicit none
integer :: i, j, k
real :: low_sum, sup_sum, norm
real, dimension(n,n) :: A
real, dimension(n) :: b, x, oldx
integer, intent(in) :: n_max
real, intent(in) :: tol
integer, intent(in) :: n
open(unit=10,file="A_matrix.dat")
open(unit=15,file="b_vector.dat")
open(unit=20,file="initial_vector.dat")
do i=1,n
read(10,*) (A(i,j),j=1,n)
read(15,*) b(i)
read(20,*) x(i)
end do
close(10)
close(15)
close(20)
k=1
norm=100
x=0
do while ( (k<=n_max).and.(tol<norm) )
oldx=x
do j=2,n
sup_sum = sup_sum - A(1,j)*x(j)
end do
x(1)=sup_sum/a(1,1)
do i=2,n
low_sum=dot_product( A(i,1:i-1), x(1:i-1))
sup_sum=dot_product( A(i,i+1:n), x(i+1:n))
x(i)=(b(i)-low_sum-sup_sum)/A(i,i)
end do
norm=0
norm=sum(abs(x-oldx))
write(*,*) k, norm
k=k+1
end do
open(unit=25,file="final_vectorgauss.dat")
do i=1,n
write(25,*) x(i)
end do
close(25)
end subroutine
I'd appreciate any help to search the error(s). Thanking you in advance. EDIT: Sorry guys! I think I've found out the error by a pure lucky guess. I changed the 2 starting values for the loops from 1 to n instead of from 2 to n. Well I won't erase this thread, so that everyone can use this code :) |
| New Reply |
Similar discussions for: Solving a linear system with Gauss-Seidel's method
|
||||
| Thread | Forum | Replies | ||
| Is there any Fortran code for solving such a linear system with least square method? | Linear & Abstract Algebra | 1 | ||
| gauss seidel method of convergence | General Math | 2 | ||
| Gauss-Seidel Method | General Math | 0 | ||
| SOlving power flow using gauss seidel and matlab, HELP | Engineering, Comp Sci, & Technology Homework | 1 | ||
| Simple intuitive/graphical interpretation of the Gauss-Seidel method | Linear & Abstract Algebra | 8 | ||