Sistema di "quasi-equazioni" lineari
Ciao a tutti.
Devo risolvere vari sistemi di N equazioni lineari in 8 incognite (con \(\displaystyle N\geq 8 \)) in cui i termini noti non sono "precisi", poiché approssimati all'intero più vicino. Le 8 incognite sono reali positive (non nulle).
Cerco di spiegarmi con questo esempio inventato:
Il sistema non ha soluzione se considero ogni linea come un'equazione. Il motivo è proprio il fatto che i termini noti sono arrotondati all'intero più vicino (quindi, ad esempio, la prima equazione potrebbe avere un termine noto pari a 89,734 oppure pari a 90,333).
Ogni singola equazione di questo sistema, quindi, dovrebbe essere considerata a rigor di logica come un "mini-sistema" di 2 disequazioni a 8 incognite di questo tipo (prendo ad esempio la prima equazione del sistema):
Questo produce il raddoppiamento delle dimensioni del sistema, che sostanzialmente diventa un sistema di 16 disequazioni lineari in 8 incognite.
Come risolvo sistemi di questo tipo? Grazie mille.
Devo risolvere vari sistemi di N equazioni lineari in 8 incognite (con \(\displaystyle N\geq 8 \)) in cui i termini noti non sono "precisi", poiché approssimati all'intero più vicino. Le 8 incognite sono reali positive (non nulle).
Cerco di spiegarmi con questo esempio inventato:
\(\displaystyle \begin{cases}
2x_1+10x_2+18x_3+26x_4+34x_5+42x_6+50x_7+58x_8\simeq90\\
3x_1+11x_2+19x_3+27x_4+35x_5+43x_6+51x_7+59x_8\simeq91\\
4x_1+12x_2+20x_3+28x_4+36x_5+44x_6+52x_7+60x_8\simeq92\\
5x_1+13x_2+21x_3+29x_4+37x_5+45x_6+53x_7+61x_8\simeq93\\
6x_1+14x_2+22x_3+30x_4+38x_5+46x_6+54x_7+62x_8\simeq94\\
7x_1+15x_2+23x_3+31x_4+39x_5+47x_6+55x_7+63x_8\simeq95\\
8x_1+16x_2+24x_3+32x_4+40x_5+48x_6+56x_7+64x_8\simeq96\\
9x_1+17x_2+25x_3+33x_4+41x_5+49x_6+57x_7+65x_8\simeq97
\end{cases} \)
2x_1+10x_2+18x_3+26x_4+34x_5+42x_6+50x_7+58x_8\simeq90\\
3x_1+11x_2+19x_3+27x_4+35x_5+43x_6+51x_7+59x_8\simeq91\\
4x_1+12x_2+20x_3+28x_4+36x_5+44x_6+52x_7+60x_8\simeq92\\
5x_1+13x_2+21x_3+29x_4+37x_5+45x_6+53x_7+61x_8\simeq93\\
6x_1+14x_2+22x_3+30x_4+38x_5+46x_6+54x_7+62x_8\simeq94\\
7x_1+15x_2+23x_3+31x_4+39x_5+47x_6+55x_7+63x_8\simeq95\\
8x_1+16x_2+24x_3+32x_4+40x_5+48x_6+56x_7+64x_8\simeq96\\
9x_1+17x_2+25x_3+33x_4+41x_5+49x_6+57x_7+65x_8\simeq97
\end{cases} \)
Il sistema non ha soluzione se considero ogni linea come un'equazione. Il motivo è proprio il fatto che i termini noti sono arrotondati all'intero più vicino (quindi, ad esempio, la prima equazione potrebbe avere un termine noto pari a 89,734 oppure pari a 90,333).
Ogni singola equazione di questo sistema, quindi, dovrebbe essere considerata a rigor di logica come un "mini-sistema" di 2 disequazioni a 8 incognite di questo tipo (prendo ad esempio la prima equazione del sistema):
\(\displaystyle \begin{cases}
2x_1+10x_2+18x_3+26x_4+34x_5+42x_6+50x_7+58x_8\geq89,5\\
2x_1+10x_2+18x_3+26x_4+34x_5+42x_6+50x_7+58x_8<90,5\\
\end{cases} \)
2x_1+10x_2+18x_3+26x_4+34x_5+42x_6+50x_7+58x_8\geq89,5\\
2x_1+10x_2+18x_3+26x_4+34x_5+42x_6+50x_7+58x_8<90,5\\
\end{cases} \)
Questo produce il raddoppiamento delle dimensioni del sistema, che sostanzialmente diventa un sistema di 16 disequazioni lineari in 8 incognite.
Come risolvo sistemi di questo tipo? Grazie mille.
Risposte
.
Buona domenica, sellacollesella, e grazie per la risposta!
Sinceramente non ne ho idea da dove nasca questa richiesta di mio figlio. Se può servire a inquadrare il problema, glielo chiederò.
C'è un'ulteriore condizione che mi sono completamente dimenticato di riportare: la somma delle incognite deve fare 1. Come posso implementare nel tuo codice questa condizione? Inoltre, il tuo codice cambia se il numero di equazioni fosse superiore al numero di incognite o basterebbe semplicemente aggiungere nuove righe alle matrici A e b?
Ti ringrazio!
"sellacollesella":
In ogni modo, se spieghi un po' come nascono queste equazioni/disequazioni forse può aiutare.
Sinceramente non ne ho idea da dove nasca questa richiesta di mio figlio. Se può servire a inquadrare il problema, glielo chiederò.
C'è un'ulteriore condizione che mi sono completamente dimenticato di riportare: la somma delle incognite deve fare 1. Come posso implementare nel tuo codice questa condizione? Inoltre, il tuo codice cambia se il numero di equazioni fosse superiore al numero di incognite o basterebbe semplicemente aggiungere nuove righe alle matrici A e b?
Ti ringrazio!
.
"sellacollesella":
Aggiungi al sistema l'equazione \(x_1+x_2+x_3+x_4+x_5+x_6+x_7+x_8=1\).
Purtroppo in questo modo la condizione citata viene rispettata con errori troppo grandi (mediamente del 5-6% circa). Ho bisogno invece che l'errore sia di almeno un ordine di grandezza inferiore

"energy-engineer":
Ho bisogno invece che l'errore sia di almeno un ordine di grandezza inferiore
Se l'equazione di normalizzazione a 1 è prioritaria devi in qualche modo enfatizzarla. Ad esempio potresti provare ad aumentare il peso dell'equazione in questione moltiplicando entrambi i membri per un numero elevato tipo 10-100.
In alternativa potresti cambiare approccio e imporre la condizione in questione come funzione obiettivo di un problema di ottimo scrivendo le altre come disequazioni di vincolo.
Questo approccio può anche essere fatto con il Solver di Excel.
"ingres":
Se l'equazione di normalizzazione a 1 è prioritaria devi in qualche modo enfatizzarla. Ad esempio potresti provare ad aumentare il peso dell'equazione in questione moltiplicando entrambi i membri per un numero elevato tipo 10-100.
Risolto niente

"ingres":
In alternativa potresti cambiare approccio e imporre la condizione in questione come funzione obiettivo di un problema di ottimo scrivendo le altre come disequazioni di vincolo.
Questo approccio può anche essere fatto con il Solver di Excel.
Molto interessante anche quest'idea! Ci provo!
Dopo aver adeguatamente provato entrambi i metodi proposti, posso dire che questi sistemi non convergono ad alcuna soluzione accettabile. Grazie mille per il vostro aiuto e buona giornata!

Noto immediatamente che se sottraggo ogni equazione alla precedente ottengo qualcosa nella forma:
\[ \sum_{i=1}^8 x_i \approx 1. \]
In effetti ci è stato detto in seguito che questa equazione è esatta. Quindi di fatto il sistema è del tutto equivalente a
\[
\begin{cases}
\sum_{i=1}^8 \big(2 + 8\,(i-1)\big)\,x_i \ge 89.5 \\
\sum_{i=1}^8 \big(2 + 8\,(i-1)\big)\,x_i \le 90.5 \\
\sum_{i=1}^8 x_i = 1
\end{cases}
\]
Il sistema ha quindi certamente troppi gradi di libertà. Dall'equazione possiamo eliminare un grado di libertà (sostituendo ad esempio \(x_8 = 1 - \sum_{i=1}^7 x_i\)) ma a quel punto abbiamo comunque ancora due disequazioni lineari con 7 gradi di libertà.
\[ \sum_{i=1}^8 x_i \approx 1. \]
In effetti ci è stato detto in seguito che questa equazione è esatta. Quindi di fatto il sistema è del tutto equivalente a
\[
\begin{cases}
\sum_{i=1}^8 \big(2 + 8\,(i-1)\big)\,x_i \ge 89.5 \\
\sum_{i=1}^8 \big(2 + 8\,(i-1)\big)\,x_i \le 90.5 \\
\sum_{i=1}^8 x_i = 1
\end{cases}
\]
Il sistema ha quindi certamente troppi gradi di libertà. Dall'equazione possiamo eliminare un grado di libertà (sostituendo ad esempio \(x_8 = 1 - \sum_{i=1}^7 x_i\)) ma a quel punto abbiamo comunque ancora due disequazioni lineari con 7 gradi di libertà.
Probabilmente un modo migliore per scrivere quell'approssimazione era comunque usare una variabile aggiuntiva e dire che era compresa tra \(-0.5\) e \(0.5\).