Résolution d'un système linéaire avec des arguments matriciels

10

Nous connaissons tous les nombreuses méthodes de calcul pour résoudre le système linéaire standard

Ax=b.
Cependant, je suis curieux de savoir s'il existe des méthodes de calcul "standard" pour résoudre un système linéaire plus général (de dimension finie) de la forme

LA=B,
où, disons,A est unematricem1×n1 ,B est unematricem2×n2 etL est un opérateur linéaire prenantm1×n1 matrices enm2×n2 matrices, ce quin'implique pas la vectorisation des matrices, c'est-à-dire tout convertir en la forme standardAx=b .

La raison pour laquelle je demande est que je dois résoudre l'équation suivante pour u :

(RR+λI)u=f
R est la transformée de Radon 2d,R son adjoint, etu etf sonttous les deux destableaux (images). Il est possible de vectoriser cette équation, mais c'est pénible, surtout si on passe en 3D.

Plus généralement, qu'en est-il des tableaux nD ? Par exemple, résoudre LA=BA et B sont des tableaux 3D (je devrai également le faire avec la transformation de Radon à un moment donné).

Merci d'avance et n'hésitez pas à m'envoyer vers un autre StackExchange si vous en ressentez le besoin.

icurays1
la source
1
Vous pourrez peut-être créer un préconditionneur efficace à plusieurs niveaux, puis utiliser un gradient conjugué. J'ai un problème similaire où c'est assez efficace et très parallélisable. Si vous voulez des méthodes directes, envisagez des réductions sous forme de schur comme dans cet article sur l'équation de Lyapunov: cs.cornell.edu/cv/ResearchPDF/Hessenberg.Schur.Method.pdf
Nick Alger
Excellent, merci pour la réf! Je viens de faire travailler efficacement CG, donc je suis content.
icurays1

Réponses:

9

Oui, vous avez raison et cela fonctionnera bien lorsque vous passerez à la 3D. La partie la plus simple, vraiment, est le produit intérieur --- il suffit de faire un produit scalaire standard sur l'équivalent, R n dérouléRny,xRe(yHx)

Une chose à laquelle vous devez faire attention lorsque vous implémentez CG (ou des approches itératives similaires) avec des opérateurs linéaires généraux est d'implémenter correctement l' adjoint de votre opérateur linéaire. Autrement dit, les gens obtiennent souvent correctement, mais commettent une erreur en mettant en œuvre .y=F(x)z=F(y)

Je recommande d'implémenter un test simple qui tire parti de l'identité suivante: pour tout et conforme , Donc, ce que vous faites est de générer des valeurs aléatoires de et , de les exécuter à travers vos opérations directes et adjointes, respectivement, et de calculer les deux produits internes ci-dessus. Assurez-vous qu'ils correspondent à une précision raisonnable et répétez plusieurs fois.xy

y,F(x)=F(y),x.
xy

EDIT: que faites-vous si votre opérateur linéaire est supposé être symétrique? Eh bien, vous devez également vérifier cette symétrie. Utilisez donc le même test, notant simplement que --- appliquez la même opération à et . Bien sûr, l'OP a à la fois un opérateur asymétrique et un opérateur symétrique à gérer ...F=Fxy

Michael Grant
la source
Merci @ChristianClason! Je sais par expérience à quel point les erreurs dans les calculs adjoints peuvent être frustrantes. :) Dans notre package TFOCS, nous avons implémenté une linop_test.mroutine pour cette raison. Ce package prend également en charge les matrices, les tableaux et les produits cartésiens dans les espaces vectoriels.
Michael Grant
3

RR+λIrkTrkpkTApk

A,B=i,jAijBij

Je soupçonne que cela se passera très bien lorsque je passerai aux tableaux 3D, bien que je n'aie pas encore vu le produit interne Frobenius défini sur les tableaux 3D (je travaillerai en supposant que je peux à nouveau simplement résumer le produit ponctuel).

Je serais toujours intéressé par des méthodes plus générales si quelqu'un en connaissait!

icurays1
la source