[RISOLTO] Codice per risolvere equazioni lineari con parametri liberi
Salve premetto che sto utilizzando Sagemath per la scrittura del codice (dovrebbe essere molto simile a python).
Sto scrivendo un codice che, data una matrice rettangolare $A$ numerica e una $B$ fatta di incognite, sia in grado di risolvermi il sistema lineare $A*B=I$ dove $I$ è la matrice identità e che mi restituisca dunque la matrice $B$.
(La matrice A deve essere $n*m$ con $m>n$ e B deve $m*n$)
Sto avendo un po' di problemi con la risoluzione del sistema.
Vorrei sapere come potrei risolvere il tutto o direttamente come potrei ovviarlo proprio. Perché ad ora stavo utilizzando il codice pseudoinverse() che mi calcola semplicemente la pseudoinversa di A ma diventa seriamente problematico per matrici più articolate e quindi inutile. Vi scrivo il codice:
Questa parte di codice, genera le matrici e le equazioni lineari.
Ad esempio
$A=( ( 1 , 2 , 2 ),( 1, 2 , 0 ) ) $
$B=( ( a , b ),( c , d ),( e , g ) )$
Quindi
$"equazioni"=[a+2c+2e=1,b+2d+2g=0,a+2c=0,b+2d=1]$
Dopodiché
Chiedo che mi si risolva il sistema a patto che le soluzioni vengano salvate a mo' di dizionario.
Qua iniziano i problemi. Perché chiaramente mi stampa le soluzioni con dei parametri liberi. Ad esempio:
$[{a: -2*r134, b: r135, c: r134, d: -1/2*r135 + 1/2, e: 1/2, g: -1/2}]$
Allora avevo iniziato a scrivere un codice in grado di sostituirmi tali valori. Spulciando un po' su internet e le varie guide, sono riuscito ad abbozzare questo:
Dunque ad esempio $"expr"= -2*r134$ e $"freevar"=r134$
Il problema è che .subs() effettua una sostituzione temporanea e chiaramente nemmeno valida per l'intero sistema di equazioni lineari.
So che ci sono parametri che si ripetono, per quello potrei inserire qualche controllo preliminare.
Ad esempio una versione semplificata di questo codice è
Chiaramente funziona però effettua una sostituzione temporanea e solo nella parte richiesta.
Vi ringrazio per l'aiuto!
Sto scrivendo un codice che, data una matrice rettangolare $A$ numerica e una $B$ fatta di incognite, sia in grado di risolvermi il sistema lineare $A*B=I$ dove $I$ è la matrice identità e che mi restituisca dunque la matrice $B$.
(La matrice A deve essere $n*m$ con $m>n$ e B deve $m*n$)
Sto avendo un po' di problemi con la risoluzione del sistema.
Vorrei sapere come potrei risolvere il tutto o direttamente come potrei ovviarlo proprio. Perché ad ora stavo utilizzando il codice pseudoinverse() che mi calcola semplicemente la pseudoinversa di A ma diventa seriamente problematico per matrici più articolate e quindi inutile. Vi scrivo il codice:
reset() m=3 n=2 alfabeto = 'abcdeghijklopqrstuvwxyz' variabili = [var(alfabeto[i]) for i in range(m*n)] A=random_matrix(SR,n,m) show(A) I=identity_matrix(SR,n) show(I) B=matrix(SR,m,n,variabili) show(B) equazioni = [] for i in range(n): for j in range(n): equazioni.append(sum(A[i, k] * B[k, j] for k in range(m)) == I[i, j]) show(equazioni) show(A*B)
Questa parte di codice, genera le matrici e le equazioni lineari.
Ad esempio
$A=( ( 1 , 2 , 2 ),( 1, 2 , 0 ) ) $
$B=( ( a , b ),( c , d ),( e , g ) )$
Quindi
$"equazioni"=[a+2c+2e=1,b+2d+2g=0,a+2c=0,b+2d=1]$
Dopodiché
sol1 = solve(equazioni,variabili, solution_dict=True) show(sol1)
Chiedo che mi si risolva il sistema a patto che le soluzioni vengano salvate a mo' di dizionario.
Qua iniziano i problemi. Perché chiaramente mi stampa le soluzioni con dei parametri liberi. Ad esempio:
$[{a: -2*r134, b: r135, c: r134, d: -1/2*r135 + 1/2, e: 1/2, g: -1/2}]$
Allora avevo iniziato a scrivere un codice in grado di sostituirmi tali valori. Spulciando un po' su internet e le varie guide, sono riuscito ad abbozzare questo:
for i in range(m*n): expr = sol1[0][variabili[i]] (stampa la riga di dizionario corrispondente) freevar = sol1[0][variabili[i]].variables()[0] (stampa la variabile presente nella riga di dizionario) expr.subs({freevar:ZZ.random_element(1, 10)})
Dunque ad esempio $"expr"= -2*r134$ e $"freevar"=r134$
Il problema è che .subs() effettua una sostituzione temporanea e chiaramente nemmeno valida per l'intero sistema di equazioni lineari.
So che ci sono parametri che si ripetono, per quello potrei inserire qualche controllo preliminare.
Ad esempio una versione semplificata di questo codice è
sol1 = solve([x+y==1], x, y, solution_dict=True) sol1 [{y: r3, x: -r3 + 1} sol1[0][x] -r3 + 1 sol1[0][x].variables()[0] freevar = sol1[0][x].variables()[0] expr = sol1[0][x] expr -r3 + 1 expr.subs({freevar:10}) -9
Chiaramente funziona però effettua una sostituzione temporanea e solo nella parte richiesta.
Vi ringrazio per l'aiuto!
Risposte
Non mi è del tutto chiaro che cosa tu stia cercando di fare. Hai ovviamente che il tuo sistema ha più incognite che equazioni lineari e dipende quindi da dei parametri liberi. Stai cercando di ottenere una matrice qualsiasi che vada bene?
Ciao, perdonami se sono stato confusionario.
Sì, data una matrice A, devo trovare una matrice qualunque $B$ di dimensioni prefissate , di modo che $A*B=I$((esclusivamente rettangolari)
L'unico modo che mi era venuto in mente era quello di risolvere il sistema lineare che si ottiene.
Sì, data una matrice A, devo trovare una matrice qualunque $B$ di dimensioni prefissate , di modo che $A*B=I$((esclusivamente rettangolari)
L'unico modo che mi era venuto in mente era quello di risolvere il sistema lineare che si ottiene.
Edit
Ho risolto! chiedo scusa per il disturbo. Se vi interessa, vi scrivo il codice
Ho risolto! chiedo scusa per il disturbo. Se vi interessa, vi scrivo il codice

"ghira":
Qualcosa come https://en.wikipedia.org/wiki/Moore%E2% ... se_inverse ?
Allora all'inizio avevo usato proprio la pseudoinversa. Però funzionava bene solo per piccole matrici e con numeri interi tra -2 e 2. Nel momento in cui ho iniziato a scrivere numeri irrazionali o matrici più grandi, smetteva di funzionare tutto nel senso che venivano fuori mostri di immane bruttezza.
Però nulla, per fortuna ho risolto
