jacobi.jl 677 B

123456789101112131415161718192021222324252627282930313233343536
  1. function jacobi(A::SparseMatrixCSC,b::Vector;tol::Real=1e-2,maxIter::Int=1,out::Int=0,storeInterm::Bool=false;)
  2. n = length(b)
  3. OmInvD = 1./diag(A) #D矩阵 并乘以omega
  4. x = zeros(eltype(A),n)
  5. r = copy(b)
  6. rnorm0 = norm(b)
  7. res = 0
  8. value = 0.0
  9. flag = -1
  10. iter = 0
  11. dx = 0
  12. for iter = 1:maxIter
  13. println(iter)
  14. dr = zeros(eltype(A),n)
  15. for j = 1:n
  16. dx = r[j] * OmInvD[j]
  17. x[j] += dx
  18. for gidx = A.colptr[j] : A.colptr[j+1]-1
  19. dr[A.rowval[gidx]] -= A.nzval[gidx] * dx
  20. end
  21. end
  22. r += dr
  23. res = norm(r) / rnorm0
  24. println(res)
  25. if res < tol
  26. flag = 0; break
  27. end
  28. end
  29. return x,flag,iter
  30. end