2017-10-05 7 views
1

Je suis en train de pré-conditionner une matrice en utilisant spilu, cependant, pour passer ce préconditionneur en cg (la méthode intégrée du gradient conjugué) il est nécessaire d'utiliser la fonction LinearOperator, quelqu'un peut-il m'expliquer? le paramètre matvec, et pourquoi je dois l'utiliser. Ci-dessous mon code actuelScipy LinearOperator Fonction utilisée dans Conjugate Gradient

Ainv=scla.spilu(A,drop_tol= 1e-7) 
Ainv=scla.LinearOperator(Ainv.shape,matvec=Ainv) 
scla.cg(A,b,maxiter=maxIterations, M = Ainv) 

Toutefois, ce travail ne marche pas et je me donne l'erreur TypeError: objet « SuperLU » est pas appelable. J'ai joué autour et essayé

Ainv=scla.LinearOperator(Ainv.shape,matvec=Ainv.solve) 

à la place. Cela semble fonctionner mais je veux savoir pourquoi matvec a besoin d'Ainv.solve plutôt que d'Ainv, et est-ce la bonne chose de nourrir LinearOperator?

Merci pour votre temps

Répondre

0

sans avoir beaucoup d'expérience avec cette partie de scipy, certains commentaires:

  • Selon le docs vous ne devez pas utiliser LinearOperator, mais vous pourriez faire
    • M : {sparse matrix, dense matrix, LinearOperator}, donc vous pouvez aussi utiliser des matrices explicites!
    • L'idée/avantage du LinearOperator:
      • Many iterative methods (e.g. cg, gmres) do not need to know the individual entries of a matrix to solve a linear system A*x=b. Such solvers only require the computation of matrix vector productsdocs
        • En fonction de la tâche, les approches parfois même sans matrice sont disponibles qui peuvent être beaucoup plus efficace
  • L'approche de travail vous avez présenté est en effet le bon (some other source doing it similarily, et certains course-materials doing it like that)
    • L'idée de ne pas utiliser la matrice inverse, mais en utilisantsolve()ici est de ne pas former l'inverse explicitement (ce qui peut être très coûteux)
      • Une idée similaire est très courant dans BFGS-based algorithmes d'optimisation, bien que wiki pourrait ne pas donner un aperçu beaucoup ici
        • scipy has an extra LinearOperator for this ne formant pas l'inverse explicitement! (Même si je pense qu'il est seulement utilisé pour les statistiques/achèvement/finition une certaine optimisation, mais je construire avec succès des optimiseurs à base LBFGS avec celui-ci)
      • Source @ scicomp.stackexchange en discuter sans toucher scipy
      • Et à cause de que je assumer spilu va complètement pour cela aussi (retour d'un objet avec une résolution méthode)