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
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
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.