Pagina 1 di 1

Ricavare funzione partendo da matrice di risultati

Inviato: 12 giu 2007, 19:24
da CyCop
Ciao a tutti, sono nuovo del forum ;)
Scrivo perchè ho un problemino, nulla di vitale, ma sono alcuni mesi che ogni tanto ho a che fare con questa tabella di valori (vedi allegato) e vorrei sfruttarla un po' meglio...
Veloce spiegazione:
c'è una condizione principale
in base a quella condizione ci sono 9 serie di risultati, la formula per calcolarle dovrebbe essere la stessa, credo cambi solo una variabile
Il mio problema è che la condizione principale ha un'approssimazione di 5 unità ma in realtà mi servirebbe di 1 e, oltretutto, la tabella si ferma a 100 mentre a me servirebbe almeno fino a 500...
Ho fatto un tool excel che approssima i valori delle curve in modo da darmi i valori intermedi ma non è molto preciso come metodo, se serve magari ve lo posto...
So che ricavare una formula dal grafico o dai risultati non è così semplice ma confido nel vostro aiuto...
A occhio e croce sembrerebbe una mezza curva di gauss ma non riesco a replicare la forumula giusta :roll:
Purtroppo l'università passata da parecchio e senza allenamento mi sono parecchio arrugginito :oops:

Inviato: 12 giu 2007, 19:51
da teppic
Curiosità: viene da qualche gioco di ruolo?

Inviato: 12 giu 2007, 20:34
da CyCop
Ciao Teppic :)
Sì, è parte di un gdr :wink:

Inviato: 14 giu 2007, 16:10
da Marco
Boh, io ho provato a metterla in pancia ad una routine di ottimizzazione.

Le forme funzionali che vanno meglio sono la funzione d'errore
$ $\matcal N(x) = \frac{1}{\sqrt2 \pi} \int_{-\infty}^x \exp \left( \frac{t^2}{2} \right) \ dt $

e la funzione logistica:
$ $\frac{1}{1+\exp(-x)} $

Chiamo $ f(x) $ una delle due funzioni sopra, $ F(x) = 100[1-f(x)] $ è la riscalatura che decresce da 100 a 0.

Intruduco due parametri $ \mu $ e $ \sigma $, che mi danno il centro e la pendenza (per la funzione d'errore, sono le classiche media e deviazione stadard).

Allora, mi piacerebbe rappresentare le colonne della tua tabella come
$ $ F \left( \frac{ x - \mu }{\sigma} \right) $, dove $ x $ è la colonna di input (quella che va da 5 a 100).

I parameteri $ \mu $ e $ \sigma $ dipendono dalla colonna $ c=0, \dots, 8 $, e sono bene approssimati da una legge di potenza
$ \mu(c) = k \alpha^c $ e idem per $ \sigma $.

L'ottimizzatore mi trova (approssimando con due decimali), per la funzione d'errore,

$ \mu(c) = 37.26 \cdot 1.10^c $; $ \sigma(c) = 13.70 \cdot 1.11^c $.

Invece per la logistica:

$ \mu(c) = 37.18 \cdot 1.10^c $; $ \sigma(c) = 8.08 \cdot 1.11^c $.

Con entrambe, le tabelle risultanti si discostano dalla tabella voluta al massimo di 5.

Inviato: 16 giu 2007, 08:11
da CyCop
Ciao Marco, anzitutto grazie della risposta e dello sbattimento però non mi è chiara la formula finale...

usando la funzione logica (per comodità di inserimento in excel) la formula finale verrebbe:

=100*(1-(1/(1+EXP(-f(x)))))

dove f(x) = ((x-(37.18*1,1^c))/(8,08*1,11^c))

ovviamente x = condizione primaria da 5 a 100
e
c = colonna della tabella dei risultati da 0 a 8

è corretta così o mi son perso qualche giro?

Grazie ancora :)

Inviato: 18 giu 2007, 08:43
da Marco
No, direi che torna.

Si chiama funzione "logistica" e non "logica". Inoltre, se vuoi, per la funzione d'errore (funzione cumulativa della distribuzione normale standard), esiste già built-in in excel: NORMSDIST nella versione inglese (c'è anche in quella italiana, ma non saprei la traduzione del suo nome).

Inviato: 18 giu 2007, 14:35
da teppic
Marco ha scritto:NORMSDIST nella versione inglese (c'è anche in quella italiana, ma non saprei la traduzione del suo nome).
DISTRIB.NORM.ST :?

Sto da giorni provando a trovare un'interpolazione più accurata. Forse tra un po' arrivo a qualcosa.

Inviato: 18 giu 2007, 15:23
da FeddyStra
Mi sono limitato a inserire i dati della prima colonna $ v_0 $, ma se serve posso fare anche le altre.
Se ho capito bene il problema, questi valori si riescono ad approssimare abbastanza bene con la formula
$ \displaystyle Round \left ( \frac a {1+b x^5} \right) $ con $ a=98.55099101976144... $ e $ b=1.4163436899165551...\cdot 10^{-8} $.
In questo modo ho ottenuto una tabella $ \lbrace99, 98, 98, 94, 87, 73, 57, 40, 27, 18, 12, 8, 6, 4, 3, 2, 2, 1, 1, 1\rbrace $ che si discosta di al massimo $ 1 $ da quella data.

Aggiunta successiva

Colonna $ v_1 $.
Formula di approssimazione:
$ \displaystyle Round \left ( \frac a {1+b x^5} \right) $
con $ a=98.00327186316913... $
e $ b=9.39148326192361...\cdot 10^{-9} $.
Tabella generata: $ \lbrace98, 98, 97, 95, 90, 80, 66, 50, 36, 25, 17, 12, 8, 6, 4, 3, 2, 2, 1, 1\rbrace $; con un errore massimo di 2.

Inviato: 18 giu 2007, 21:47
da CyCop
Si chiama funzione "logistica" e non "logica"
:oops:

per la distribuzione normale ho trovato il comando anche in openoffice
DISTRIB.NORM(Probabilità; Media; Deviazione standard; Cumulativo)

FeddyStra, effettivamente la tua formula è quella che si avvicina di più anche se non ho ben capito come ci sei arrivato... :?

Sto provando parecchi algoritmi che + o - si adattano al tipo di curva ma non ne vengo a capo...
Ho provato anche il sofisticatissimo metodo della "botta di fortuna" cercando grafici simili su google per trovare delle formule che potesse andare bene ma nulla :(

Vedo se posso dare qualche indizio, elenco di seguito altre formule del programma così magari da dare qualche spunto...

Xn=X1*N^2

Yn=(K*N^2)/z

X=k*(1+(sqrt(L1)/10))*(1+(sqrt(L2)/10))*(1+(sqrt(L3)/10))*etc...

le tre formule non hanno legami tra loro, le ho solo postate per mostrare il "modus operandi" del programmatore...
Queste erano semplici, infatti sono state trovate quasi subito, ma quella inerente la tabella suddetta ormai sono quasi 2 anni che in molti provano a trovarla senza successo...

EDIT: secondo voi il MatLab potrebbe essermi utile?

Inviato: 20 giu 2007, 15:27
da FeddyStra
CyCop ha scritto:FeddyStra, effettivamente la tua formula è quella che si avvicina di più anche se non ho ben capito come ci sei arrivato... :?
Ho ipotizzato che la formula per ogni colonna $ v_i $ fosse del tipo $ \displaystyle f(x)=\frac a {1+b x^5} $. A questo punto calcolo $ r(x)=(f(x)-t(x))^2 $, dove $ t(x) $ è il valore nella tabella corrispondente alla condizione principale $ x $. Ovviamente posso calcolare $ r(x) $ solo per i valori di $ t(x) $ che conosco, ovvero per $ $x=5, 10, 15, ..., 100$ $. $ r(x) $ è quindi lo scarto quadratico della funzione $ f(x) $ rispetto ai dati della tabella $ t(x) $. Se ora sommo i valori di $ r(x) $ ottengo una misura di errore $ E=r(5)+r(10)+r(15)+...+r(100) $ che è una funzione di $ a $ e di $ b $. Sorge allora il problema di minimizzare $ E $. Uguagliando a zero le derivate parziali di $ E $ rispetto ad $ a $ e $ b $ e risolvendo (con approssimazione), ottengo i due risultati che ti ho fornito. Ovviamente devo controllare che le derivate parziali seconde in quei punti siano positive per essere sicuro di aver trovato dei minimi e non dei massimi. Poi, dal momento che i valori della tabella sono interi, ho aggiunto un $ Round $ davanti...
CyCop ha scritto:secondo voi il MatLab potrebbe essermi utile?
Io personalmente preferisco Derive e Mathematica.