Quale e' il metodo piu' veloce, se volessi usare Excel ?
La Regola di Cramer e' la piu' indicata in questi casi ?
Massimo
ho dato un'occhiata all'help e mi pare non ci sia
scelta... lo fa tramite l'inversa. Se è davvero così e le
equazioni son tante e da risolvere spesso la cosa
potrebbe diventare noiosa mentre "una tantum", con tempo a
disposizione potrebbe essere diverso.
Però magari la mia versione di excel è vecchia e permette
altri metodi di soluzione, non so. Se li permette, prima
del problema di velocità bisogna capire se il sistema è o
potrebbe diventare mal condizionato, perché questo
potrebbe restringere la rosa dei metodi utilizzabili.
Concordo.
In ogni caso usare Cramer (che pure si potrebbe perche'
excel ha una funzione per calcolare il determinante)
e' molto inefficiente.
Meglio usare le due funzioni predefine, quella che calcola l'inversa
e quella che calcola il prodotto tra due matrici (ho controllato:
esistono).
Per risolvere il sistema Ax=b calcoli l'inversa A^(-1) di A e la
moltiplichi
per il vettore b.
Con due operazioni predefinite di Excel hai gia' finito.
ciao,
g.
.
.
.Grazie per l'Help adesso si tratta di provare ma
ho trovato un buon sito che spiega passo passo...
Tnks !
M
>devo risolvere un sistema di equazioni lineari con tante
>incognite (anche nell'ordine delle centinaia)
>
>Quale e' il metodo piu' veloce, se volessi usare Excel ?
Se ben ricordo, Excel possiede uno strumento detto Risolutore in grado di
risolvere sistemi lineari (e non) senza dover programmare nulla.
>La Regola di Cramer e' la piu' indicata in questi casi ?
Assolutamente no. Ciao
{=MMULT(MINVERSE(A),B)}
FormulaArray
Dove:
A = Matrice dei coefficienti
B = Vettore dei termini noti
Bruno
.
.
Grazie, adesso mi e' chiara la procedura.
Devo pero' prima scrivere le equazioni in
maniera da poterle scrivere in matrice.
Massimo
.
.
Mi son reso conto che in effetti, nel mio problema, ho molte
piu' equazioni rispetto alle incognite.
Purtroppo in questi casi non riesco ad impostare il tutto...
Qualche uggerimento ?
Massimo
il problema potrebbe non avere soluzione (sovracondizionato).
bye
--
In realta' 0 non � altro che l'infinito dei negativi,,verso destra......
.
.
Posso confermati invece che la soluzione esiste.
In effetti e' stato gia' risolto con un algoritmo
ricorsivo ma avrei la necessita' di risolvervlo in
maniera classica con le funzioni base di Excel...
Massimo
Generalmente se ci sono piu' equazioni che incognite
o alcune equazioni sono ridondanti e quindi potrebbero tranquillamente
venir eliminate (chiaramente si tratta di scoprire quali...),
oppure il sistema non ha una soluzione esatta.
Esistono comunque delle tecniche apposite per i sistemi
sovradimensionati.
In pratica ti puoi ricondurre a trovare la soluzione che minimizza
(rispetto ad una certa metrica) l'errore commesso nelle varie
equazioni.
Il metodo piu' semplice e' quello dei minimi quadrati.
TI invito a leggere almeno in rete un po' di materiale, perche'
onestamente trovo che sia un po' pericoloso applicare metodi
numerici senza avere un po' di basi, comunque in generale,
se hai un sistema lineare sovradimensionato
Ax = b, dove quindi A e' una matrice rettangolare,
ti puoi ricondurre al sistema lineare "standard":
(A'A) x = A' b
dove con A' indico la matrice trasposta di A (o la matrice trasposta
coniugata se la matrice
A ha coefficienti complessi).
La matrice A'A e' una matrice quadrata e quindi il sistema
C x = d dove C=A'A e d=A'b (prodotti matrice-matrice e matrice
vettore)
li puoi risolvere come ti si e' gia' detto.
Qualcosina lo trovi qui:
http://www.matematicamente.it/forum/sistemi-sovradeterminati-e-metodo-dei-minimi-quadrati-t53730.html
http://www.ce.unipr.it/~medici/geometry/node2.html
ciao,
g.
Esistono comunque delle tecniche apposite per i sistemi
sovradimensionati.
.
.
.Ho capito, bisogna che mi rimetta a studiare.... ;)
M
Qualcosina lo trovi qui:
http://www.matematicamente.it/forum/sistemi-sovradeterminati-e-metodo-dei-minimi-quadrati-t53730.html
http://www.ce.unipr.it/~medici/geometry/node2.html
.
.
.Grazie per i link... ;)
M
>> Mi son reso conto che in effetti, nel mio problema, ho molte
>> piu' equazioni rispetto alle incognite.
>>
>> Purtroppo in questi casi non riesco ad impostare il tutto...
>> Qualche uggerimento ?
>
>Esistono comunque delle tecniche apposite per i sistemi
>sovradimensionati.
>.
>.
>.Ho capito, bisogna che mi rimetta a studiare.... ;)
IMHO e' arrivato il momento che tu spieghi per bene l'origine, lo scopo e
le caratteristiche del problema, il perche' non va bene una soluzione
iterativa ecc. ecc., piuttosto che rimetterti a studiare. Ciao
.
.
Giusto ! Provo a spiegarmi meglio con un esempio... ;)
Si dispone di un certo Capitale K che si vuole investire in un certo
numero di operazioni che possono rendere un profitto pari al valore
messo in gioco che evidentemente sara' una perc.% di K.
Quindi dopo la prima operazione si avra' un Capitale pari a K + X1 se
l'operazione risulta vincente oppure a K - X1 se l'operazione risulta
perdente dove X1 e' l'importo da investire nella prima operazione.
Se impongo di perdere il Capitale K al termine delle Nt operazioni posso
massimizzare il possibile guadagno con un certo numero Nv di operazioni
previste come vincenti su un numero totale delle operazioni Nt.
L'esempio banale e' l'applicazione della Martingala dove ad esempio se
pongo K=7 con Nt=3 ed Nv=1 posso calcolare le tre possibili puntate da
piazzare in attesa che risulti vincente una delle tre operazioni.
Infatti sappiamo che le tre puntate saranno: X1=1; X2=2; X3=4
Evidentemente la progressione delle puntate si ferma nel momento in cui
realizzo l'operazione Nv prevista come vincente oppure nel caso opposto
si perde l'intero Capitale K.
Generalizzando il problema con Nv > 1 ed ovviamente Nv < Nt ho realizzato
un programma che mi consente di massimizzare i profitti nel caso in cui
sia raggiunta la condizione di ottenere un certo numero Nv di operazioni
vincenti. Evidente che la condizione contraria porta alla perdita di K.
Ad esempio posso realizzare una tabella di puntate con K=11; Nt=4 ed Nv=2:
-------------------
| 3/11 : 4/8 : 4/4 | -11
| 2/14 : 4/12 : 8/8 | -11
-------------------
16 16 16
In alto a sinistra c'e' la prima puntata, se risulta vincente si scende
in basso, se risulta perdente si passa alla puntata a destra quindi per
poter piazzare la puntata successiva e' necessario che si conosca l'esito
della operazione precedente.
In pratica con 2 operazioni vincenti su 4 posso aumentare il mio Capitale
di +5 oppure perdere il mio K che vale aoppunto 11.
Questo approccio, che puo' sembrare alquanto azzardato ha trovato notevole
interesse in ambito delle scommesse sportive, roulette, etc. ma e' ancora
poco diffuso in ambito finanziario proprio perche' prevede una condizione
molto rischiosa che deve essere considerata, la perdita di K.
Il programma su Excel e' ormai disponibile da diversi anni ed impiega come
detto un algoritmo ricorsivo per risolvere tale problema del calcolo delle
puntate. Se volete posso fornirvi di altri riferimenti.
Fatta tutta la premessa di cui sopra, adesso sto lavorando ad un programma
che preveda una ulteriore condizione da inserire nel calcolo delle puntate
ma mi risulta impossibile applicare lo stesso metodo di risoluzione adottato
in precedenza per cui vorrei una soluzione con le funzioni standard di
Excel.
Se c'e' qualche interessato potrei spiegarmi meglio di quanto fatto qui con
poche righe a disposizione. Spero cmq sia di facile lettura... ;)
Massimo
Generalmente se ci sono piu' equazioni che incognite
o alcune equazioni sono ridondanti e quindi potrebbero tranquillamente
venir eliminate (chiaramente si tratta di scoprire quali...),
oppure il sistema non ha una soluzione esatta.
Esistono comunque delle tecniche apposite per i sistemi
sovradimensionati.
.
.
.Leggendo in rete ho trovato anche questa affermazione:
"Quando un sistema di primo grado ha più equazioni che incognite
è normalmente impossibile, a meno che un'equazione non sia
combinazione lineare delle altre; in tal caso si può eliminare
un'equazione sovrabbondante e risolvere il sistema".
Che e' esattamente quello che descrivi tu !
.
.
Come posso procedere per capire quali equazioni eliminare ?
Massimo
In Excel con una decina di righe di codice VBA.
Quante sono le equazioni e quante le incognite?
Bruno
.
.
Anche centinaia per il caso piu' complesso ma
come esempio potremmo partire da un caso molto
semplice con 6 equazioni e 4 incognite.
Col VBA me la cavo bene... Come procedo ?
Massimo
Direi con alcuni Nested For... Next.
Se ce la faccio in mezz'ora te le mando.
Provaci anche tu, il primo che finisce vince una bottiglia
di Dom Perignon...
Bruno
.
.
.Scusa, non ho ben capito come fare per provare, dovrei
fare tutte le possibili combinazioni prendendo a 4 a 4
tra le 6 equazioni e vedere se risolvono anche le altre
due restanti equazioni ?
Massimo
> .Scusa, non ho ben capito come fare per provare, dovrei
> fare tutte le possibili combinazioni prendendo a 4 a 4
> tra le 6 equazioni e vedere se risolvono anche le altre
> due restanti equazioni ?
Prova questa:
============================================
Public Sub Ridondanza()
Dim Coefficienti As Range, i As Integer, j As Integer
Dim k As Integer, R As Currency, n As Integer
Dim NumRow As Integer, NumCol As Integer
Set Coefficienti = [Riepilogo!Q343:S372]
NumRow = Coefficienti.Rows.Count
NumCol = Coefficienti.Columns.Count
For i = 1 To NumRow - 1
For j = i + 1 To NumRow
If Coefficienti(i, 1) <> 0 And Coefficienti(j, 1) = 0 Then
Exit For
End If
R = Coefficienti(i, 1) / Coefficienti(j, 1)
n = 1
For k = 2 To NumCol
If Coefficienti(i, k) <> 0 And Coefficienti(j, k) = 0 Then
n = 0
Exit For
End If
If Coefficienti(i, k) = 0 And Coefficienti(j, k) = 0 Then
GoTo Continua
End If
If R <> Coefficienti(i, k) / Coefficienti(j, k) Then
n = 0
Exit For
End If
Continua:
Next
If n Then
Coefficienti(j, NumCol + 1) = "*"
End If
Next
Next
End Sub
================================================
Eseguila sulla matrice dei coefficienti poi elimina tutte le equazioni
marcate con asterisco.
Bruno
.
.
Grazie, faro' una prova... ;)
Massimo
Suggerisco che, se il sistema è iperderterminato, occorre prima
normalizzare le matrici.
Saluti
--
LSP
.
.
.In realta' il problema e' molto piu' semplice di quanto sembri!
Questo perche' in effetti l'ultima riga in basso e la colonna a
destra son sempre determinabili in altro modo. In particolare tutti
le frazioni della colonna a destra saranno sempre del tipo 1/1 e le
frazioni della riga in basso sono determinabili con la seguente:
1/(2^N-1) partendo dal vertice in basso a destra con N=1
A questo punto la soluzione ricorsiva che avevo trovato si puo'
riassumere in questo modo:
------------------------
| .... : ... : ... : 1/1 |
| .... : Xzz : Xyy : 1/1 |
| 1/15 : 1/7 : 1/3 : 1/1 |
------------------------
Da cui si puo' ricavare agevolmente prima Xyy e poi Xzz. Infatti:
1+Xyy+1/3*(1+Xyy)=(1-Xyy)+(1-Xyy)+(1-Xyy)+(1-Xyy) Da cui: Xyy=1/2
Allo stesso modo noto Xyy si ricava Xzz e cosi via in avanti in
quanto manchera' sempre e' solo una sola incognita partendo dal
quadrato 2x2 in basso ci si puo' estendere all'infinito.
Perche' in forma ricorsiva avro' sempre e solo una incognita nel
vertice piu' alto a sinistra.
Il problema e' che avevo bisogno di risolvere il problema con le
funzioni standard di Excel per ampliare questa tabella anche con
centinaia di righe e colonne ovviamente diventa onoroso se non si
risolve utilizzando una formula agevole da copiare ed incollare.
Massimo
> Il problema e' che avevo bisogno di risolvere il problema con le
> funzioni standard di Excel per ampliare questa tabella anche con
> centinaia di righe e colonne ovviamente diventa onoroso se non si
> risolve utilizzando una formula agevole da copiare ed incollare.
Hai mai provato matlab?
Prima devi scriverti un programmino che determini le combinazioni
richieste, che sono tantine, se m è parecchio più grande di n.
Temo che realizzare un metodo di eliminazione (Gauss-Jordan o
Gauss-Crout) in un foglio di calcolo non sia agevolissimo,
ma ogni programma dedicato al calcolo (Octave o simili) ha
già le librerie apposite. Il metodo dice, in modo efficiente,
se il sistema ha soluzione e, nel caso, permette di scriverla
/senza/ doversi calcolare inverse di matrici.
Ciao
Enrico
Veramente, io pensavo di fargi fare tutto a mano :-)
Hai mai provato matlab?
.
.No perche' son costretto a lavorare con Excel per
problemi di compatibilita' verso altre applicazioni.
Ripeto, il problema ritengo sia molto piu' semplice
come ho scritto nel mio mess del 11/2 20.52 dove si
vede bene che di fatto posso lavorare solo con una
cella alla volta (una incognita) che e' il vertice
alto a sinistra del rettangolo (inizialmente 2x2) che
si prende in esame.
In pratica preso lo schema di partenza dove le righe
in basso e la colonna a destra sono gia' noti posso
ricavare l'incognita Xyy agevolmente.
------------------------
| .... : ... : ... : 1/1 |
| .... : ... : Xyy : 1/1 |
| 1/15 : 1/7 : 1/3 : 1/1 |
------------------------
Poi una volta trovata Xyy posso ricavare senza problemi
sia Xzz sia Xvv in quanto vertice del rettango preso in
esame che prevede una sola incognita alla volta.
------------------------
| .... : ... : Xzz : 1/1 |
| .... : Xvv : 1/2 : 1/1 |
| 1/15 : 1/7 : 1/3 : 1/1 |
------------------------
Pero' ricavare ogni volta l'equzione e' una bel lavoro
e non capisco come farlo con le formule standard di Excel
perche' per adesso l'ho fatto in forma ricorsiva con VBA.
Massimo
> > Il problema e' che avevo bisogno di risolvere il problema con le
> > funzioni standard di Excel per ampliare questa tabella anche con
> > centinaia di righe e colonne ovviamente diventa onoroso se non si
> > risolve utilizzando una formula agevole da copiare ed incollare.
>
> Hai mai provato matlab?
>
> .
> .No perche' son costretto a lavorare con Excel per
> problemi di compatibilita' verso altre applicazioni.
Se vuoi farti del male, peggio per te. Questa "compatibilita'" in cosa
consiste?
Puoi ottenere in output file di testo da piu' o meno qualsiasi cosa, e
se questi
sono formattati nel modo giusto, Excel li puo' aprire. (CSV, testo
delimitato
da spazi o tab o quello che vuoi.)
Questo non e' il mio settore ma ho visto usare matlab per cose simili
e in matlab sospetto che sia possibile farlo in modo brutale con le
pseudo-inverse
o qualcosa del genere. In ogni caso in matlab fai roba con le matrici
molto
ma molto semplicemente.
> "Adam Atkinson" <gh...@mistral.co.uk> wrote in message
> news:7446e0de-b91c-43b7...@n10g2000yqf.googlegroups.com...
> On Feb 11, 7:52 pm, "MassimoM" <NOME.mo...@hotmail.it> wrote:
>
>> Il problema e' che avevo bisogno di risolvere il problema con le
>> funzioni standard di Excel per ampliare questa tabella anche con
>> centinaia di righe e colonne ovviamente diventa onoroso se non si
>> risolve utilizzando una formula agevole da copiare ed incollare.
Non puoi mostrarci la tabella Excel contenente tutte le ridondanti
equazioni lineari?
L'eliminazione di quelle linearmente dipendenti è una questione di
secondi...
Bruno
> Non puoi mostrarci la tabella Excel contenente tutte le ridondanti
> equazioni lineari?
> L'eliminazione di quelle linearmente dipendenti è una questione di
> secondi...
Se i valori sono _esatti_, si'. Se i valori sono numeri reali
incasinati
e i valori effettivamente presenti sono solo _quasi_ linearmente
dipendenti...
Secondo me si può usare il risolutore anche per questo. Si aggiunge una
colonna di 0/1 per ogni equazione, e si imposta una condizione sulla
somma dei valori binari di tale colonna.
Poi non ho capito perché il suggerimento di ricorrere ai minimi quadrati
è caduto nel vuoto, ma forse, anzi, probabilmente, ho letto troppo
superficialmente io il problema.
.
.
Ci provo facendo un esempio pratico, con Nt=5 ed Nv=3 ovvero almeno
3 operazioni vincenti su 5 operazioni totali.
Il Capitale iniziale si puo' omettere in quanto andro' a calcolare
solo la percentuale di esso che sara' usata in ogni operazione a partire
dalla cella in alto a sinistra.
Come detto ogni operazione comporta un rischio pari alla percentuale
messa in gioco ed un eventuale profitto pari esattamente a tale perc.
Quindi dopo la prima operazione si avra' un Capitale pari a K + X% se
l'operazione risulta vincente oppure a K - X% se l'operazione risulta
perdente dove X% e' l'importo da impiegare nella operazione.
Se impongo di perdere il Capitale K al termine delle Nt operazioni posso
impiegare tutto il Capitale residuo nell'ultimo tentativo che viene
rappresentato dalla ultima colonna a destra quindi la perc. in quel caso
sara' sempre pari al Capitale residuo.
Evidentemente la progressione delle puntate si ferma nel momento in cui
realizzo la 3.a operazione vincente per cui se mi manca ancora una sola
operazione vincente ed ho ancora N tentativi in pratica e' come se avessi
una Martingala in cui in aspetto una vincita su N tentativi.
Per il calcolo delle percentuali posso preparare la seguente tabella che
rappresenta le varie perc.% del Capitale da mettere in gioco a partire
dalla cella in alto a sinistra X00. Se l'operazione sara' vincente si
passa alla cella in basso X11 (1 giocata 1 vincente) oppure se risulta
perdente si passa alla cella a destra X10 (1 giocata 0 vincenti).
-----------------
| X00 : X10 : 1/1 |
| X11 : X21 : 1/1 |
| 1/7 : 1/3 : 1/1 |
-----------------
Nella tabella ci sono 4 incognite (X00, X11, X10, X21).
In forma ricorsiva inizio col calcolare X21 prendendo solo il quadrato
2x2 in basso a destra dove appunto c'e' solo X21 come incognita.
Per cui posso scrivere la (1):
1 + X21 + 1/3(1 + X21) = (1 - X21) + (1 - X21) + (1 - X21) + (1 - X21)
In pratica partendo da X21 l'eventuale vincita ottenuta con solo due
operazioni vincenti consecutive oppure quella che si dovrebbe ottenere
dalla perdita di X21 moltiplicato 4 (2x2 le ultime due operazioni) deve
coincidere.
Dalla (1) si ricava agovolmente che: X21 = 1/2 quindi la tabella risulta:
-----------------
| X00 : X10 : 1/1 |
| X11 : 1/2 : 1/1 |
| 1/7 : 1/3 : 1/1 |
-----------------
Allo stesso modo ottengo anche X11 = 3/11
------------------
| X00 : X10 : 1/1 |
| 3/11 : 1/2 : 1/1 |
| 1/7 : 1/3 : 1/1 |
------------------
A questo punto riparto dal calcolo di X10 prendendo il rettangolo 2x3
con le ultime due colonne e riscrivo l'equazione corrispondente per poi
completare la tabella calcolando X00.
Massimo
Per esempio?
Bruno
Il problema iniziale era quello delle equazioni ridondanti che
impedivano l'applicazione di Cramer od altro per la soluzione.
A questo mi sto riferendo.
Se tale problema è stato risolto, o ha mutato aspetto, non ho più nulla
da dire.
Bruno
Semplicemente che puoi avere delle righe che, per arrotondamento e
basta,
non sono linearmente dipendenti.
Vuoi dire che sarebbero linearmente dipendenti se Excel fosse in grado
di eseguire calcoli simbolici, ma siccome Excel può eseguire solo
calcoli con numeri reali, alla fine - per via degli arrotondamenti - si
sarebbe tratti in inganno?
Volevi dir questo o che altro?
In ogni caso sapresti fare esempi o sono solo opinioni?
Bruno
> >> Per esempio?
>
> > Semplicemente che puoi avere delle righe che, per arrotondamento e
> > basta,
> > non sono linearmente dipendenti.
>
> Vuoi dire che sarebbero linearmente dipendenti se Excel fosse in grado
> di eseguire calcoli simbolici, ma siccome Excel può eseguire solo
> calcoli con numeri reali, alla fine - per via degli arrotondamenti - si
> sarebbe tratti in inganno?
No, intendo che i valori in input potrebbero essere tali che nessuno,
nemmeno matlab, ti dira' che delle righe linearmente dipendenti lo
sono,
in quanto i numeri reali ecc. ecc.
> Volevi dir questo o che altro?
Vedo sopra.
> In ogni caso sapresti fare esempi o sono solo opinioni?
Non vedo la difficolta'. Ma ecco un esempio:
2 2 3
2 2 3.000000000000001
ma nascosto meglio in un caso vero.
Se cerchi di fare Gram-Schmidt con dei dati veri con centinaia di
dimensioni,
possono benissimo capitare cose cosi', in cui "in realta'" hai delle
righe linearmente dipendenti
ma a causa di arrotondamenti nella rappresentazione dei numeri reali,
non sembrano tali.
E non e' colpa di Excel particolarmente. Fare test di uguaglianza fra
i numeri reali nei programmi e'
solitamente da evitare.
> No, intendo che i valori in input potrebbero essere tali che nessuno,
> nemmeno matlab, ti dira' che delle righe linearmente dipendenti lo
> sono,
> in quanto i numeri reali ecc. ecc.
Non ti capisco.
Io sostengo essere in grado con Excel di individuare equazioni con
coefficienti linearmente dipendenti da altri, anche se espressi nel
formato da te esemplificato 2 2 3
2 2 3.000000000000001
Tu mi dici che quel 3.0000000000001 potrebbe essere un 3 al quale non
perfetti arrotondamenti hanno aggiunto quella fila di cifre decimali.
Allora apri un altro thread ché l'oggetto è attinente ma completamente
diverso.
Bruno
Non ho detto niente di particolarmente profondo. Anzi e' cosi' banale
e' ovvio che se ti va di dire "questo e' banale e ovvio" sono
d'accordo con te.
Non vedo cosa c'e' da non capire.
> Io sostengo essere in grado con Excel di individuare equazioni con
> coefficienti linearmente dipendenti da altri, anche se espressi nel
> formato da te esemplificato 2 2 3
> 2 2 3.000000000000001
>
> Tu mi dici che quel 3.0000000000001 potrebbe essere un 3 al quale non
> perfetti arrotondamenti hanno aggiunto quella fila di cifre decimali.
Si'.
> Allora apri un altro thread ché l'oggetto è attinente ma completamente
> diverso.
Non mi pare che ci sia altro da dire. Se in un programma ti metti
a dire "se x == 0 allora" dove x e' float o double o simile,
rischi di dire "non questo non e' 0" quando x e' 10^-20. Banale.
Ovvio.
Non molto sorprendente.
L'esempio classico e'
#!/usr/bin/perl
for (1..10) {
$x+=0.1;
}
if ($x==1) {
print "x e' 1\n";
} else {
print "x non e' 1\n";
}
eseguendolo:
adam@ubuntu:~$ ./float.p
x non e' 1
Aggiungiamo un pezzo in piu':
$diff=$x-1;
print "differenza: $diff\n"
e troviamo:
adam@ubuntu:~$ ./float.p
x non e' 1
differenza: -1.11022302462516e-16
Quindi secondo il mio programma 10 per 0.1 non e' 1.
Tu, immagino, non fai "se x == 0" ma fai "se abs(x) < qualcosa"