PDA

View Full Version : [C] Aiutino su formula matematica


salvodel
27-11-2007, 17:33
Salve a tutti, dovrei scrivere la seguente formula in una funzione scritta in C:

http://img527.imageshack.us/img527/5999/formulagt6.gif (http://img527.imageshack.us/my.php?image=formulagt6.gif)


[img=http://img258.imageshack.us/img258/6412/formulatg2.th.gif] (http://img258.imageshack.us/my.php?image=formulatg2.gif)


Io ho buttato giu alcune righe di codice ma non mi convincono del tutto...qualcuno potrebbe dirmi se c'è corrispondenza tra la formula e quello che ho scritto io sotto?
Grazie

for(l=0;l<cost;l++)
for(r=0;r<cost;r++)
for(i=0;i<M;i++)
for(k=0;k<S;k++)
sommatoria[l][r][i]+=x[i][k]*z[k]* ((k=l)?1:0)*u[r];


for(l=0;l<cost;l++)
for(r=0;r<cost;r++)
for(i=0;i<M;i++)
for(k=0;k<S;k++)
derF[l][r]+=y[i]*sommatoria[l][r][i];

:help:

mad_hhatter
28-11-2007, 12:24
usando la distributività, y[i]*sommatoria_j(alfa[j])=sommatoria_j(alfa[j]*y[i]).

consegue che basta:


for(l=0;l<cost;l++)
for(r=0;r<cost;r++)
for(i=0;i<M;i++)
for(k=0;k<S;k++)
derF[l][r] += y[i]*x[i][k]*z[k]* ((k=l)?1:0)*u[r];

salvodel
28-11-2007, 13:20
usando la distributività, y[i]*sommatoria_j(alfa[j])=sommatoria_j(alfa[j]*y[i]).

consegue che basta:


for(l=0;l<cost;l++)
for(r=0;r<cost;r++)
for(i=0;i<M;i++)
for(k=0;k<S;k++)
derF[l][r] += y[i]*x[i][k]*z[k]* ((k=l)?1:0)*u[r];


Grazie mille. Il problema è che avevo molti dubbi su come si comportasse il C. Grazie mille di nuovo.
Ciao

mad_hhatter
28-11-2007, 14:40
Grazie mille. Il problema è che avevo molti dubbi su come si comportasse il C. Grazie mille di nuovo.
Ciao

comportamento in che senso? riguardo ai loop o alla precisione numerica?

salvodel
28-11-2007, 16:15
comportamento in che senso? riguardo ai loop o alla precisione numerica?

Avevo dei dubbi sui cicli for, non vorrei che facessero dei prodotti in piu. Appena finisco di scriverlo ti faccio sapere se va.
Ciao

salvodel
28-11-2007, 19:53
http://img236.imageshack.us/img236/5152/formulaly2.png (http://imageshack.us)

Se la formula è invece cosi come mi conviene riscriverla? In un'altra formula simile ho utilizzato le seguenti righe per calcolare i gli ultimi termini tra parentesi:

for(int i=0;i<s; i++)
for(int k=0;k<N; k++)
som[i]+=x[i][k]*z[k];
for(int i=0;i<s; i++)
som[i]+=w[i][10];

In questo caso mi da un po fastidio il termine da sommare x[i][S]. Come posso scriverlo in modo sintetico?Ha senso quanto segue, cioè utilizzare le stesse righe di prima per crearmi un nuovo oggetto SOMMA[i]:

for(int i=0;i<s; i++)
for(int k=0;k<N; k++)
som[i]+=x[i][k]*z[k];
for(int i=0;i<s; i++)
som[i]+=w[i][10];

//A questo punto inserisco le stesse righe di prima ma moltiplicate per SOMMMA[i]
for(l=0;l<cost;l++)
for(r=0;r<cost;r++)
for(i=0;i<M;i++)
for(k=0;k<S;k++)
derF[l][r] += y[i]*x[i][k]*z[k]* ((k=l)?1:0)*u[r]*SOMMA[i];

Credo che sia sbagliata visto che ho un ciclo for con indice k mentre SOMMA si è gia fatto il suo ciclo.
Grazie

mad_hhatter
29-11-2007, 11:30
http://img236.imageshack.us/img236/5152/formulaly2.png (http://imageshack.us)

Se la formula è invece cosi come mi conviene riscriverla? In un'altra formula simile ho utilizzato le seguenti righe per calcolare i gli ultimi termini tra parentesi:

for(int i=0;i<s; i++)
for(int k=0;k<N; k++)
som[i]+=x[i][k]*z[k];
for(int i=0;i<s; i++)
x[i]+=w[i][10];

In questo caso mi da un po fastidio il termine da sommare x[i][S]. Come posso scriverlo in modo sintetico?Ha senso quanto segue, cioè utilizzare le stesse righe di prima per crearmi un nuovo oggetto SOMMA[i]:

for(int i=0;i<s; i++)
for(int k=0;k<N; k++)
som[i]+=x[i][k]*z[k];
for(int i=0;i<s; i++)
x[i]+=w[i][10];

//A questo punto inserisco le stesse righe di prima ma moltiplicate per SOMMMA[i]
for(l=0;l<cost;l++)
for(r=0;r<cost;r++)
for(i=0;i<M;i++)
for(k=0;k<S;k++)
derF[l][r] += y[i]*x[i][k]*z[k]* ((k=l)?1:0)*u[r]*SOMMA[i];

Credo che sia sbagliata visto che ho un ciclo for con indice k mentre SOMMA si è gia fatto il suo ciclo.
Grazie

le parentesi nella formula sono un po' ambigue, puoi specificare meglio i termini?

salvodel
29-11-2007, 12:06
le parentesi nella formula sono un po' ambigue, puoi specificare meglio i termini?

Dalla domanda posso dirti che hai capito qual'è il mio problema visto che anche a me crea un di ambiguità. Cmq ora cerco di spiegarmi meglio.


http://img530.imageshack.us/img530/2964/formula1rr4bn5.jpg (http://imageshack.us)
Come ti dicevo prima in un’altra parte del programma mi creavo prima la variabile SOMMA dipendente solo da k e poi la mettevo nella formula che però era leggermente diversa. In questo caso essendo la sua derivata ho il prodotto della derivata della funzione per la derivata del suo argomento…ma questo non penso che ti interessa visto che oltretutto alla formula ho tolto un po di fronzoli per renderla piu snella. Comunque dicevo, non mi conviene anche in questo caso crearmi la variabile SOMMA in questo modo:

for(int i=0;i<s; i++)
for(int k=0;k<N; k++)
SOMMA[i]+=x[i][k]*z[k];
for(int i=0;i<s; i++)
SOMMA[i]+=x[i][10];

È questa la parentesi che ti creava ambiguità, quella del prodotto tra x[i][k] e z[k]? Penso che sia ridondante. Il senso è di fare tutti i prodotti ed infine aggiungere ad ogni somma un elemento w[i][10].
Se mi trovassi con la seguente formula:


http://img406.imageshack.us/img406/8720/formula2hq5.png (http://imageshack.us)

Non farei cosi?

/*Creo prima la variabile SOMMA[i]*/
for(i=0;i<M;i++)
for(k=0;k<N;k++)
SOMMA[i]+=x[i][k]z[k];
/*A questo punto faccio il prodotto tra i termini x[i][k], z[k] e SOMMA[1]*/
for(i=0;i<M;i++)
for(k=0;k<N;k++)
d+=x[i][k]*z[k]SOMMA[i]


Aspetto un tuo consiglio...sperando di non aver detto un sacco di cavolate.:D

mad_hhatter
29-11-2007, 16:20
[edit]

mad_hhatter
29-11-2007, 16:22
http://img236.imageshack.us/img236/5152/formulaly2.png (http://imageshack.us)

Se la formula è invece cosi come mi conviene riscriverla? In un'altra formula simile ho utilizzato le seguenti righe per calcolare i gli ultimi termini tra parentesi:

for(int i=0;i<s; i++)
for(int k=0;k<N; k++)
som[i]+=x[i][k]*z[k];
for(int i=0;i<s; i++)
x[i]+=w[i][10];

In questo caso mi da un po fastidio il termine da sommare x[i][S]. Come posso scriverlo in modo sintetico?Ha senso quanto segue, cioè utilizzare le stesse righe di prima per crearmi un nuovo oggetto SOMMA[i]:

for(int i=0;i<s; i++)
for(int k=0;k<N; k++)
som[i]+=x[i][k]*z[k];
for(int i=0;i<s; i++)
x[i]+=w[i][10];

//A questo punto inserisco le stesse righe di prima ma moltiplicate per SOMMMA[i]
for(l=0;l<cost;l++)
for(r=0;r<cost;r++)
for(i=0;i<M;i++)
for(k=0;k<S;k++)
derF[l][r] += y[i]*x[i][k]*z[k]* ((k=l)?1:0)*u[r]*SOMMA[i];

Credo che sia sbagliata visto che ho un ciclo for con indice k mentre SOMMA si è gia fatto il suo ciclo.
Grazie

scusami, avevo guardato solo le parentesi ma non gli indici... quindi la formula non è ambigua.

io farei:

cella[l,r] = 0;
loop(i) {
somma_1 <- prima sommatoria in k (calcolata con un loop)
somma_2 <- seconda sommatoria in k (calcolata con un ulteriore loop indipendente da quello di somma_1)
cella[l,r+] += y[i]*somma_1*somma_2
}

PS: per rendere più leggibile la formula io sposterei la prima parentesi subito prima della corrispondente sommatoria

salvodel
29-11-2007, 18:18
scusami, avevo guardato solo le parentesi ma non gli indici... quindi la formula non è ambigua.

io farei:

cella[l,r] = 0;
loop(i) {
somma_1 <- prima sommatoria in k (calcolata con un loop)
somma_2 <- seconda sommatoria in k (calcolata con un ulteriore loop indipendente da quello di somma_1)
cella[l,r+] += y[i]*somma_1*somma_2
}

PS: per rendere più leggibile la formula io sposterei la prima parentesi subito prima della corrispondente sommatoria


Quindi provo a scriverlo come l'ho "fra"inteso

for(l=0;l<cost;l++)
for(r=0;r<cost;r++)
for(i=0;i<M;i++)
for(k=0;k<S;k++)
SOMMA1[l][r][i]+=x[i][k]*z[k]* ((k=l)?1:0)*u[r];

for(int i=0;i<s; i++)
for(int k=0;k<N; k++)
SOMMA2[i]+=x[i][k]*z[k];
for(int i=0;i<s; i++)
SOMMA2[i]+=w[i][10];

for(l=0;l<cost;l++)
for(r=0;r<cost;r++)
for(i=0;i<M;i++)
for(k=0;k<S;k++)
derF[l][r]+=y[i]*SOMMA1[l][r][i]*SOMMA2[i];

Ti volevo chiedere due cose:
1- che cosa fa loop e perché hai fatto tutto insieme?
2- la prima sommatoria non dovrebbe mantenere espliciti gli indici l ed r ?

mad_hhatter
30-11-2007, 10:12
Ti volevo chiedere due cose:
1- che cosa fa loop e perché hai fatto tutto insieme?
2- la prima sommatoria non dovrebbe mantenere espliciti gli indici l ed r ?

1. loop fa la sommatoria in i, ho fatto tutto insieme perché non vale la pena spezzare se puoi fare tutto in una volta (secondo me)

2. la prima sommatoria (loop(i)) è fatta assumendo fissati l,r... in pratica loop(i) va annidato rispetto al loop in l e a quello in r

salvodel
30-11-2007, 12:47
1. loop fa la sommatoria in i, ho fatto tutto insieme perché non vale la pena spezzare se puoi fare tutto in una volta (secondo me)

2. la prima sommatoria (loop(i)) è fatta assumendo fissati l,r... in pratica loop(i) va annidato rispetto al loop in l e a quello in r

Forse ora ho capito. Invece di fare dei cicli for con il loop hai sistemato tutto.
Il tuo è sicuramente piu elegante ma date le mie scarse conoscenze di C credi che quello che abbia scritto io sia corretto oppure è puro vaneggiamento?
Grazie

mad_hhatter
30-11-2007, 13:10
Forse ora ho capito. Invece di fare dei cicli for con il loop hai sistemato tutto.
Il tuo è sicuramente piu elegante ma date le mie scarse conoscenze di C credi che quello che abbia scritto io sia corretto oppure è puro vaneggiamento?
Grazie

il mio loop E' un for :)

non so se è più elegante, è solo più compatto rispetto a vari loop indipendenti.

il tuo non è puro vaneggiamento: non ho controllato i dettagli, ma mi pare che facessi più o meno le stesse cose, solo con loop indipendenti.

salvodel
30-11-2007, 15:47
il mio loop E' un for :)

non so se è più elegante, è solo più compatto rispetto a vari loop indipendenti.

il tuo non è puro vaneggiamento: non ho controllato i dettagli, ma mi pare che facessi più o meno le stesse cose, solo con loop indipendenti.

Perfetto, grazie mille(non ti nascondo che per un po ho cercato se esistesse qualche ciclo iterativo di nome loop).
Se hai due minuti giusto per dargli un occhiata per verificare che il tutto sia corretto(intendo la corrispondenza tra la formula e i cicli for) sarebbe perfetto poiché ancora non ho avuto modo di farlo girare per errori vari tra cui questo che non ho ancora capito che vuol dire:

edit
Capito.
Ora l'ho fatto girare ma il sistema si blocca:cry: . Ed ora:confused: :mc: ?

mad_hhatter
30-11-2007, 16:56
Perfetto, grazie mille(non ti nascondo che per un po ho cercato se esistesse qualche ciclo iterativo di nome loop).
Se hai due minuti giusto per dargli un occhiata per verificare che il tutto sia corretto(intendo la corrispondenza tra la formula e i cicli for) sarebbe perfetto poiché ancora non ho avuto modo di farlo girare per errori vari tra cui questo che non ho ancora capito che vuol dire:

edit
Capito.
Ora l'ho fatto girare ma il sistema si blocca:cry: . Ed ora:confused: :mc: ?

posta il codice completo e magari mette delle istruzioni di stampa (tipo "print sono arrivato qui") per cercare di capire in quale loop si pianta

salvodel
02-12-2007, 21:36
posta il codice completo e magari mette delle istruzioni di stampa (tipo "print sono arrivato qui") per cercare di capire in quale loop si pianta

Ciao ti posso contattare in privato?
Grazie

gepeppe
02-12-2007, 23:29
se lo posti qui ti possiamo dare tutti una mano...compilandolo anche noi magari...

salvodel
03-12-2007, 17:00
se lo posti qui ti possiamo dare tutti una mano...compilandolo anche noi magari...

A dire il vero mi piacerebbe poter contattare di persona qualche informatico vicino milano per un aiutino.
Se c'è qualcuno che ha voglia di perdere $tempo$.
gepeppe tu sei di napoli? Troppo lontano:(
Se non trovo nessuno e non ci riesco provo a postarlo qui.
Grazie