2017-06-18 2 views
0

je l'équation:Résoudre matrice récursif linéaire

S = C (BSQ) + (1-C) I dans laquelle S, B, Q sont des matrices carrées de faible nXn, C est une constante et I est matrice d'identité.S est initialisé à la matrice d'identité Je veux résoudre l'équation pour trouver S.Can je fais ceci sans prendre l'inverse des deux côtés et puis simplifier et ainsi de suite? (Je travaille avec de grands ensembles de données en prenant l'inverse pourrait être très lent) En utilisant simplement l'équation ci-dessus j'ai obtenu quelques résultats, mais je ne suis pas sûr si c'est correct car vous ne pouvez pas faire trois multiplications matricielles simultanément. Que puis-je faire pour résoudre pour S?

the answer I am getting after plugging in all the matrices with values

+0

Puisque vous ne nous dites pas quelles sont les valeurs de 'C',' B' et 'Q', même dans votre graphique, comment pourrions-nous répondre à votre question? Et que voulez-vous dire par "vous ne pouvez pas faire trois multiplications matricielles simultanément"? Il suffit de multiplier les deux premiers puis le troisième. Et l'inversion matricielle est au pire O (n ** 3) avec des algorithmes simples, ce qui est le temps polynomial, alors qu'est-ce qui ne va pas? Vos exemples spécifiques peuvent avoir des fonctionnalités qui accéléreraient encore plus le temps. S'il vous plaît nous montrer votre exemple complet, dans le texte, afin que nous puissions vérifier l'exactitude de votre réponse. –

+0

En outre, si la vitesse est importante, vous devriez probablement utiliser un tableau numpy plutôt qu'une liste de listes Python de base. –

+0

Je ne peux pas multiplier les deux premières matrices, puis la troisième parce que les deux premières sont B et S et les multiplier va changer la valeur de S.Ce sera un problème car S est présent des deux côtés de l'équation se tromper. –

Répondre

0

En fonction de vos matrices, vous pourriez être en mesure de simplement itérer cette formule et nous espérons qu'elle converge. C'est à dire. commencez par S=I et recalculez S jusqu'à ce qu'il ne change plus. Bien sûr, cela n'est pas garanti de converger, mais vous pouvez essayer.

Si vous voulez résoudre cela directement, vous pouvez dériver un système linéaire. Il suffit de factoriser le RHS (de sorte que vous obtenez une expression pour chaque entrée dans la matrice résultante) et de mettre en place des équations pour chaque entrée. Par exemple. pour la première entrée, cela ressemblerait à ceci:

s11 = 1 - c + c * (q11 * (b11 * s11 + b12 * s21 + b13 * s31 + ...) + 
        q21 * (b11 * s12 + b12 * s22 + b13 * s32 + ...) + 
        q31 * (b11 * s13 + b12 * s23 + b13 * s33 + ...) + 
        ...) 

Solve pour le s.. et vous avez terminé. Si le système admet une solution, bien sûr. Sinon, vous pourriez vouloir résoudre pour une solution des moindres carrés.

+0

Merci.Espect, il est convergent dans ce cas, mais c'est un bon conseil quand il n'est pas –

0
for t in range(100): 

     s=c*(sc.dot(sc.dot(Qin.T,s),Qin))+ (1-c)*I 

Cela résout l'équation récursive 100 times.You peut faire un test de convergence qui est Si-Si-1 = une faible valeur pour vérifier la convergence trop.