Ciao a tutti,
Sto cercando di utilizzare la funzione di minimizzazione in JSL per ottenere i valori di due (o più) variabili che riducono al minimo il quadrato medio dell'errore di un modello di grandi dimensioni. Non riesco a farlo convergere anche se so a quale valore dovrebbe convergere (per tentativi ed errori).
La sintassi di base che ho usato è:
minfun = Minimize( min_test, {kD( 0.4, 0.8 ), wshc( 0.1, 1.5 )}, <<DETAILS></DETAILS>Ho provato diversi messaggi ma non cambiano nulla.
L'obiettivo qui è trovare i valori di kD e wshc minimizzando l'espressione min_test che è essa stessa una sequenza di espressioni valutate come in
min_test = Expr(
Eval( light );
Eval( parafile );
Eval( runprg );
Eval( reshandling2 );
Eval( SSE2 );
);
I valori kD e wshc alterati modificano le espressioni "light" e "parafile" che quindi eseguono un programma eseguibile (nell'espressione runprg) i cui risultati vengono manipolati e da cui l'errore quadratico medio (MSE) è l'ultima cosa che viene valutato nell'espressione SSE2. Per contesto, l'espressione "runprg" invia più file creati a un eseguibile autonomo che simula l'evoluzione termica dei laghi. Ogni passaggio nell'espressione "runprg" richiede circa 10-20 secondi di calcolo, i cui risultati vengono reintegrati in JSL per calcolare MSE.
Il processo stesso sembra funzionare correttamente in quanto legge correttamente il valore della funzione obiettivo in ogni passaggio e sembra passare correttamente i valori dei parametri all'espressione. Il problema è che l'algoritmo "sposta" i parametri kD e wshc così leggermente (solo nella 5a cifra decimale) rispetto ai valori iniziali che ho dato loro che non riesce a convergere. Ad esempio, se inizio con valori iniziali rispettivamente di 0,8 e 0,5, in genere otterrò qualcosa come
0,8
0,49999945654133
alla successiva iterazione e pertanto non influisce in modo significativo sul MSE risultante. Con i limiti dei parametri che ho fornito nella funzione di minimizzazione, c'è molto spazio per lo spostamento dei parametri. Capisco che il mio caso è piuttosto lontano dalla tipica funzione differenziabile semplice. Tuttavia, eseguendo "manualmente" il programma con valori di parametri diversi, so che la funzione obiettivo è piuttosto convessa rispetto ai parametri e quindi ho pensato che la funzione di minimizzazione avrebbe funzionato bene, soprattutto utilizzando il messaggio <
Qualche suggerimento su una soluzione alternativa che potrebbe aiutare in questa situazione?
Molte grazie in anticipo, Yves