Minimizzazione vincolata JSL - Guida del risolutore riga per rigaCiao,
Il mio obiettivo è fare in modo che JSL esegua l'iterazione dei valori in due colonne (x1, x2) che vengono utilizzate nelle formule di altre colonne finché non soddisfa i criteri di [column(y1)- column(y2) = 0 ;column(z1)- colonna(z2)=0]. Nota che l'equazione che sto cercando di risolvere è un'equazione non lineare annidata dove
y1 = f1(x1, x2, x3, x4...)
y2 = f2(x1, x2, x3, x4...)
z1 = y1+y2
z2 = valore indipendente
In Excel, era abbastanza semplice suddividere l'equazione in più colonne per monitorare più facilmente eventuali errori di calcolo nel mezzo. Quindi scorrere ciascuna riga ed eseguire un risolutore per ripetere x1 e x2 finché non vengono soddisfatti i criteri oggettivi.
In JMP, ho difficoltà a utilizzare la funzione di minimizzazione vincolata per replicarlo. Ogni volta che eseguo lo script, non sembra che converga perché l'obiettivo target non viene raggiunto e i valori cambiano costantemente. Inoltre posso impostare solo 1 obiettivo target anziché 2. Di seguito è riportato un esempio del mio codice JSL. Tieni presente che colonna_y1 e colonna_y2 sono colonne formula che contengono variabili x1 e x2.
dt = Current Datatable();
expr1 = abs(:column_y1[i] - :column_y2[i]);
x1 = 0.5;
x2 = 0.2;
For Each Row(
i=Row();
minfun = Constrained Minimize (expr1, {x1(0.1,0.8), x2(0.01,0.5)},
<<MAXITER></MAXITER>Pensi che sia necessario avere l'INTERA equazione nidificata nell'espressione affinché funzioni? Oppure c'è qualcosa di sbagliato che sto facendo qui.
Qualsiasi aiuto è molto apprezzato. Grazie!
Progettazione di esperimentiRi: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaPrego. Sono contento che tu abbia trovato la soluzione.Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaCiao Peng Liu,
Grazie mille per la tua tenacia nell'aiutarmi a risolvere questo problema. Ho fatto riferimento al modo in cui lo hai convertito in un problema non vincolato equivalente, riducendo quindi al minimo la somma degli errori quadrati sia dell'equazione target che del vincolo. Sebbene non sia stato necessario utilizzare un termine di penalità, la soluzione corrisponde più o meno a ciò che vedo in Excel.
Ci vogliono circa 2-3 minuti per risolvere 1100 righe di casi (cosa che ritengo assolutamente ragionevole considerando quanto sono contorte le mie equazioni), dopo averlo impostato in modo tale che il valore iniziale inizi dai valori risolti dalla riga di dati precedente.
Ancora una volta, molte grazie.
Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaIn questo caso, non penso che risolvere più equazioni contemporaneamente sia la direzione da seguire, perché ogni riga della tabella coinvolge due variabili: parametro1 e parametro2. E sono variabili diverse da riga a riga, anche se hanno lo stesso nome da equazione a equazione e le metti sotto la stessa colonna.
Per risolvere simultaneamente più equazioni utilizzando i suggerimenti che ho fornito, le equazioni utilizzano lo stesso insieme di variabili da equazione a equazione. Ogni variabile dovrebbe avere un solo valore.
Ciò che devi fare è tradurre ciò che hai fatto nelle macro di Excel in JSL, ad esempio devi scrivere un ciclo JSL più grande per scorrere ogni riga in modo iterativo.
Per risolvere un'equazione sotto un vincolo non lineare, uno dei miei suggerimenti è stato quello di convertire un problema vincolato in un problema non vincolato equivalente. Supponendo che il vincolo sia un'uguaglianza, l'esempio seguente tenta di trovare la soluzione per y-exp(x)=0, sotto il vincolo y==exp(-x). La soluzione è l'intersezione delle due curve, che è in (x,y)=(0,1). L'obiettivo di minimizzazione è la somma degli errori quadratici dell'equazione target y-exp(x) e la violazione del vincolo y-exp(-x)=0. Notare che k è una penalità per la violazione e k è piuttosto grande.
Nota inoltre che ho intenzionalmente messo i valori iniziali lontano dalla soluzione e aumentato MaxIter, nel caso in cui non sia possibile identificare valori iniziali che non sono vicini alla soluzione.
x = 100;
y = 100;
k = 10000;
minFun = Minimize( (y - exp(x))^2 + k*(y - exp(-x))^2, {x, y} , MaxIter(1000));
Eval List( {x, y, minFun} );
show(x, y, y-exp(x),y - exp(-x))
È un approccio fattibile se il tuo obiettivo reale può essere utilizzato.
Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaCiao Peng Liu,
Non sono sicuro che questo sia d'aiuto perché devo rendere anonimi i dati, ma fondamentalmente questo è stato ciò che stavo cercando di replicare o migliorare da Excel:
In questo caso, sto utilizzando una macro + un risolutore di Excel per ripetere il parametro 1 e il parametro 2 per raggiungere l'obiettivo 1 e l'obiettivo 2

Grazie
Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaChe ne dici di pubblicare l'esempio di Excel che hai detto facile da risolvere e partiamo da lì? Non necessariamente è proprio il problema che hai tra le mani, ma qualcosa somiglia molto al tuo obiettivo. Oppure solo l'esempio di Excel che ti mostrano come utilizzare e vedremo se possiamo risolverlo utilizzando JMP.
Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaCiao Peng Liu,
Grazie per aver condiviso queste opzioni, ma non è chiaro quale metodo potrei usare se fondamentalmente sto provando a fare la stessa cosa di prima, ovvero risolvere x1 e x2 per ogni riga nella tabella dati ma in questo caso risolvere due equazioni contemporaneamente, con alcuni vincoli non lineari.
Sai se abbiamo già fatto degli esempi? È difficile credere che sia così difficile farlo rispetto a Excel
Grazie
Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaSeguire due funzioni JSL potrebbe essere rilevante per il tuo obiettivo di "risolvere equazioni". Sono per equazioni lineari.


Per risolvere equazioni non lineari, potresti voler convertire l'obiettivo in un problema di ottimizzazione equivalente. Quindi utilizzare la funzione JSL Maximize o la piattaforma non lineare per risolverlo.
Per l'ottimizzazione con vincoli non lineari, è possibile costruire un obiettivo di ottimizzazione equivalente senza vincoli, quindi è possibile utilizzare alcuni strumenti JMP, ad esempio la funzione JSL Maximize, la piattaforma non lineare o la funzione Desirability in Profiler. Altri strumenti JMP potrebbero essere utili per "cercare" le piattaforme ottimali, ad esempio DOE, in JMP.
La scelta dell’approccio dipende dall’obiettivo e dai vincoli effettivi.
Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaCiao Peng Liu,
Grazie, ho provato a seguire il modo in cui hai impostato il limite minimo e sembra che funzioni per me ora. Fondamentalmente avevo bisogno di eseguire tutti i calcoli in JSL anziché averli nelle colonne delle formule.
Domanda: è possibile risolvere due equazioni contemporaneamente? È possibile avere vincoli non lineari?
Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaSenti come un approccio lavorativo. Quindi hai solo una singola espressione, poiché stavi impostando le colonne formula, le espressioni devono essere le stesse per tutte le righe. Hai bisogno della tabella, solo perché hai bisogno di valori per x3, x4, ecc., riga per riga. Non sono sicuro di quanto siano rilevanti l'ottimizzazione vincolata e l'obiettivo target di z=0, ma lo script seguente mostra il quadro generale del flusso. Sostituisci la configurazione e l'ottimizzazione di conseguenza.
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "x1",
Set Values( [.,.,.] )
),
New Column( "x2",
Set Values( [.,.,.] )
),
New Column( "x3",
Set Values( [2,2,2] )
),
);
expr0 = expr( (x3 * x1 ^ 2 + 2 * x2 ^ 2) - 2 * x1 * x2 - 4 * x1 - 6 * x2 );
for (irow = 1, irow<=nrow(dt), irow++,
expr1 = substitute(name expr(expr0), expr(x3), dt:x3[irow]);
//show(name expr(expr1));
A = [1 1, 1 5];
b = [2, 5];
minFun = Constrained Minimize(
expr1,
{x1( 0, 5 ), x2( 0, 5 )},
<<LESSTHANEQ></LESSTHANEQ>Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaCiao Peng Liu,
Grazie per la risposta. Penso di aver capito il problema qui:
Per lo scenario in cui ho:
- Tabella dati con 100 righe
- Colonna Z = Colonna Y1 - Colonna Y2
- Colonna Y1 = formula(Colonna X1, X2, X3..)
- Colonna Y2 = formula(Colonna X1, X2, X3..)
Dove l'obiettivo è rendere la colonna Z = 0 impostando un valore nella colonna X1 e X2 per ogni riga.
L'utilizzo della riduzione al minimo vincolata per rendere l'espressione nella colonna Z = 0 iterando i valori in alcune variabili JSL x1 e x2 non funzionerebbe perché le colonne Y1 e Y2 sono colonne formula valutate in base ai valori nelle colonne X1 e X2 e non sono connesse a tutto nella variabile JSL x1 e x2.
Osservando come hai impostato il tuo script, penso che il modo in cui posso provare a farlo funzionare per il mio caso è fare in modo che tutti i calcoli nidificati vengano eseguiti all'interno di JSL anziché nelle colonne formula nel datatable. Eseguire la funzione Min vincolata e quindi salvare i risultati nelle colonne della tabella dati.
Cosa ne pensi ?
Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaL'esempio seguente è una situazione ipotetica basata sulla descrizione del problema.
La colonna fcol è una formula di altre due colonne x1 e x2.
La valutazione di fcol dipende da due colonne x1 e x2 e non sarà influenzata da variabili JSL esterne, come quelle nel tuo script.
Infine, l'esempio mostra che expr1 è un valore, non un'espressione.
dt = New Table( "Untitled",
Add Rows( 1 ),
New Column( "fcol",
Numeric,
"Continuous",
Format( "Best", 12 )
),
New Column( "x1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values({.5})
),
New Column( "x2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values({.5})
),
);
dt:fcol << set formula(
(2 * x1 ^ 2 + 2 * x2 ^ 2) - 2 * x1 * x2 - 4 * x1 - 6 * x2
);
dt:fcol << eval formula;
i=1;
expr1 = abs(dt:fcol[i]);
show(expr1);
Immagino che ciò di cui hai bisogno sia una colonna Expression, come nell'esempio seguente.
dt = New Table( "Untitled",
Add Rows( 1 ),
New Column( "exprcol",
Expression,
"None",
Set Selected,
Set Values( {(2 * x1 ^ 2 + 2 * x2 ^ 2) - 2 * x1 * x2 - 4 * x1 - 6 * x2} )
)
);
i=1;
expr1 = dt:exprcol[i];
A = [1 1, 1 5];
b = [2, 5];
minFun = Constrained Minimize(
expr1,
{x1( 0, 5 ), x2( 0, 5 )},
<<LESSTHANEQ></LESSTHANEQ>
Ed expr1 può solo estrarre valore da una colonna Expression. Eventuali ulteriori operazioni diverse dalle operazioni di espressione attiveranno la valutazione. Ad esempio, quanto segue non funzionerà come previsto.
dt = New Table( "Untitled",
Add Rows( 1 ),
New Column( "exprcol",
Expression,
"None",
Set Selected,
Set Values( {(2 * x1 ^ 2 + 2 * x2 ^ 2) - 2 * x1 * x2 - 4 * x1 - 6 * x2} )
)
);
i=1;
x1 = .5;<BR />x2 = .5;<BR />expr1 = dt:exprcol[i]+2*dt:exprcol[i];//trigger evaluation and fail.Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaCiao Peng Liu,
Sì, il codice non funzionerebbe da solo perché richiede il mio datatable che contiene dati proprietari che purtroppo non posso condividere.
In termini di expr1 che non contiene il termine da ottimizzare, immagino che la domanda che avevo fosse che se i termini utilizzati in expr1 sono colonne FORMULA in cui è contenuta la variabile di ottimizzazione, la minimizzazione vincolata funzionerebbe comunque o devo espandere il l'intera equazione in expr1 (invece di averla annidata). Nota: non ho scelto di farlo perché l'equazione è molto lunga.
Per favore fatemi sapere se avete bisogno di ulteriori chiarimenti.
Grazie.
Ri: Minimizzazione vincolata JSL - Guida del risolutore riga per rigaIl codice non viene eseguito. Potresti per favore approfondire? Anche la riduzione al minimo vincolata prevede un'espressione, ma expr1 sembra essere una variabile che contiene un valore, quindi non c'è nulla da ottimizzare.