Riduzione a icona 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 fino a quando non soddisfa i criteri di [colonna (y1) - colonna (y2) = 0; colonna (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 tracciare più facilmente se ci fossero errori di calcolo nel mezzo. Quindi iterare su ogni riga ed eseguire un risolutore per iterare x1 e x2 fino a quando non vengono soddisfatti i criteri oggettivi.
In JMP, ho difficoltà a utilizzare la funzione di riduzione a icona vincolata per replicare questo. Ogni volta che eseguo lo script, non sembra convergere perché l'obiettivo target non è stato raggiunto ei valori cambiano costantemente. Inoltre posso impostare solo 1 obiettivo di destinazione anziché 2. Di seguito è riportato un esempio del mio codice JSL. Tieni presente che column_y1 e column_y2 sono colonne formula che contengono variabili x1 e x2 all'interno.
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 debba avere l'INTERA equazione annidata nell'espressione affinché funzioni? O c'è qualcosa di sbagliato che sto facendo qui.
Qualsiasi aiuto è molto apprezzato. Grazie!
ScriptingRi: Riduci a icona vincolata JSL - Aiuto risolutore riga per rigaIl codice non viene eseguito. Potresti approfondire per favore? Anche Constrained Minimize si aspetta un'espressione, ma expr1 sembra essere una variabile che contiene un valore, quindi non c'è nulla da ottimizzare.Ri: Riduci a icona vincolata JSL - Aiuto 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 era che se i termini usati in expr1 sono colonne FORMULA in cui è contenuta la variabile di ottimizzazione, la minimizzazione vincolata funzionerebbe ancora o devo espandere il l'intera equazione in expr1 (invece di averla annidata). Nota che non ho scelto di farlo perché l'equazione è molto lunga.
Per favore fatemi sapere se avete bisogno di ulteriori chiarimenti.
Grazie.
Ri: Riduci a icona vincolata JSL - Aiuto risolutore riga per rigaIl seguente esempio è 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 il seguente esempio.
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ò essere solo l'estrazione del valore da una colonna Expression. Qualsiasi altra operazione diversa dalle operazioni di espressione attiverà 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: Riduci a icona vincolata JSL - Aiuto 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'uso di Riduzione vincolata per rendere l'espressione nella colonna Z = 0 ripetendo i valori in alcune variabili JSL x1 e x2 non funzionerebbe perché le colonne Y1 e Y2 sono colonne formula che vengono valutate in base ai valori nelle colonne X1 e X2 e non sono collegate a tutto alla variabile JSL x1 e x2.
Guardando come hai impostato il tuo script, penso che il modo in cui posso provare a farlo funzionare per il mio caso è avere tutto il calcolo annidato fatto all'interno di JSL piuttosto che nelle colonne formula nel datatable. Eseguire la funzione Min vincolata e quindi salvare i risultati nelle colonne della tabella dei dati.
Cosa pensi ?
Ri: Riduci a icona vincolata JSL - Aiuto 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 posso essere sicuro di quanto l'ottimizzazione vincolata e l'obiettivo target di z = 0 siano rilevanti qui, 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: Riduci a icona vincolata JSL - Aiuto risolutore riga per rigaCiao Peng Liu,
Grazie, ho provato a seguire come hai impostato il limite minimo e ora sembra funzionare per me. Fondamentalmente avevo bisogno di eseguire tutti i calcoli in JSL piuttosto che averli nelle colonne formula.
Domanda: è possibile risolvere due equazioni contemporaneamente? È possibile avere vincoli non lineari?
Ri: Riduci a icona vincolata JSL - Aiuto risolutore riga per rigaLe seguenti due funzioni JSL potrebbero essere rilevanti per l'obiettivo di "risoluzione di 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 di desiderabilità 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: Riduci a icona vincolata JSL - Aiuto risolutore riga per rigaCiao Peng Liu,
Grazie per aver condiviso queste opzioni, ma non è chiaro quale metodo potrei usare se sto sostanzialmente cercando di fare la stessa cosa di prima, che sta risolvendo per x1 e x2 per ogni riga nella tabella dati ma in questo caso risolvendo due equazioni contemporaneamente, con alcuni vincoli non lineari.
Sai se abbiamo già fatto degli esempi? È difficile credere che sia così difficile farlo contro Excel
Grazie
Ri: Riduci a icona vincolata JSL - Aiuto risolutore riga per rigaChe ne dici di pubblicare l'esempio di Excel che hai detto facile da risolvere e partiamo da lì? Non necessariamente il problema esatto nelle tue mani, ma qualcosa ricorda da vicino il tuo obiettivo. O solo l'esempio di Excel che ti mostrano come usare, e vedremo se possiamo risolverlo usando JMP.