|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
[algoritmo] calcolare minimo di una funzione da Rn a R con un computer
sia dato il vettore x e il vettore x trasposto xt contenente n incognite x1,x2,...,xn
sia definita la matrice Y di grandezza n*n (di cui conosciamo tutti i valori) sia e un vettore che ha tutti gli elementi di valore 1. quale puo essere un algoritmo efficiente per il seguente problema?? min xt*Y*x sub x*e = 1 anzi... ancor meglio mi piacerebbe sapere come risolvereste con il computer semplicemente questo problema: min xt*Y*x al vincolo poi ci penso io!! grazie ps: mi piacerebbe un modo piu sofisticato della forza bruta... io stavo pensando magari di utilizzare i differenziali, posizionarmi in un punto e scorrere "giu per le conche" (
__________________
http://mamo139.altervista.org Ultima modifica di mamo139 : 01-04-2009 alle 16:58. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
up...
ho gia predisposto il codice per moltiplicare le matrici! Codice:
#include <stdio.h>
#include <stdlib.h>
struct matrice {
int r;
int c;
long ** m;
};
struct matrice crea_matrice(int r, int c); // r = righe, c = colonne
bool moltiplica_matrici(struct matrice * c, struct matrice a, struct matrice b);
int main (){
struct matrice x,y,z;
x = crea_matrice(2,3);
y = crea_matrice(3,2);
z = crea_matrice(x.r,y.c);
if(!moltiplica_matrici(&z,x,y))
printf("errore...");
getchar();
return 1;
}
struct matrice crea_matrice(int r, int c){ // r = righe, c = colonne
int x,y;
struct matrice matrice;
matrice.r = r;
matrice.c = c;
matrice.m = (long **) malloc(r * sizeof(long *));
for(x=0;x<r;x++)
matrice.m[x] = (long *) malloc(c * sizeof(long));
for(x=0;x<r;x++)
for(y=0;y<c;y++)
matrice.m[x][y] = 0;
return matrice;
}
bool moltiplica_matrici(struct matrice * c, struct matrice a, struct matrice b){
int x,y,i;
if(a.c != b.r)
return 0;
if(c->r != a.r || c->c != b.c)
return 0;
for(x=0;x<c->r;x++)
for(y=0;y<c->c;y++)
for(i=0;i<a.c;i++)
c->m[x][y] = c->m[x][y] + a.m[x][i]*b.m[i][y];
return 1;
}
__________________
http://mamo139.altervista.org |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
simplesso?
comunque si risolve esattamente come si risolve a mano, devi solo procedere a piccoli passi trasformando i procedimenti "manuali" in funzioni che lavorano sulla struttura e si passano informazioni. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
il simplesso funziona solo con problemi lineari... quindi temo non vada bene!
__________________
http://mamo139.altervista.org |
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Nov 2008
Messaggi: 135
|
Quote:
i problemi non-convessi, a parte poche eccezzioni, non sono risolvibili efficacemente. comunque ottimizzazzione é un'argomento piuttosto complesso, non posso certo tenerti una lezione via forum se ti interessa questo libro é ottimo. [edit] fatto due calcoli, se Y é semidefinita positiva il minimo dovrebbe essere x_min = (invY*e) / ( et * invY * e) dove invY é l'inversa di Y se esiste o la pseudo inversa altrimenti. Ultima modifica di krogy80 : 03-04-2009 alle 14:06. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
alla fine il metodo piu rapido e quello di calcolare il gradiente della lagrangiana del caso generico, risolverlo e poi utilizzare la soluzione nel programma io volevo fargli fare i calcoli, però è meno efficiente!!! cmq il tuo risultato è giustissimo, anche a me con il metodo che ho detto viene: xt = et*invY / (et*invY*e)
__________________
http://mamo139.altervista.org |
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Nov 2008
Messaggi: 135
|
Quote:
[edit] tra l'altro la formula sopra é valida solo se Y é anche simmetrica. altrimenti basta usare al posto di invY l'inversa di Y+Yt. Ultima modifica di krogy80 : 03-04-2009 alle 16:59. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
ok, ora vorrei utilizzare un metodo iterativo per trovare i punti stazionari (quindi non solo quelli di massimo o di minimo) di una funzione da Rn a R...
che metodi ci sono?
__________________
http://mamo139.altervista.org |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:48.




















