Come risolvere due variabili (P e T) in modo iterativo (codice SAS in JSL)?Buona giornata.
Sono nuovo di JMP e JSL. Ho usato SAS e sto cercando di consolidare parte del lavoro che ho fatto in SAS in JMP.
In questo caso, ho un codice SAS (incluso sotto) che risolve due variabili, P (pressione) e T (temperatura), usando iterativamente le equazioni di seguito.
Qual è il modo più semplice per fare questo JMP (e JSL).
Molte grazie in anticipo.
Rob Preston (utente JMP grato di gratitudine)
################################################## ################################################## ########
** codice da SAS (v9.1)
* risolvere P, T iterativamente, nota LOG è LN (escl K);
P_est = 0,0;
TK = 0,0;
T = 400;
T_est = T + 273;
TDIFF = 10,0;
IT = 0;
DO UNTIL (TDIFF
.0);
IT = IT + 1;
P_est = ((- T_est / 126,9) * log (aCrCaTs)) + (15,483 * (log (Crno / T_est))) + (T_est / 71.38) 107,8;
TK = (23166 + 39,28 * P_est) / (13,25 + 15,35 * Ti + 4,5 * Fe-1,55 * (Al + Cr-Na) + (LOG (AEN)) ** 2);
* assicurare la convergenza (impostata entro 3C);
TDIFF = ABS (TK-T_EST);
se TDIFF> 0 allora T_est = TK + 1;
altrimenti se TDIFF <0 allora T_est = TK-1;
else T_est = TK;
FINE;
################################################## ################################################## ########
Ri: Come risolvere due variabili (P e T) in modo iterativo (codice SAS in JSL)?Grazie mille Marco.
Ho intenzione di provare entrambi i metodi. Questo è un grande esercizio di apprendimento per me!
Ri: Come risolvere due variabili (P e T) in modo iterativo (codice SAS in JSL)?Ho avuto una visione diversa del tuo problema rispetto a Jim. Non mi rendevo conto che le variabili indipendenti erano nella stessa riga e vuoi determinare P e T per ogni riga. Se è così, allora la sua soluzione (traduzione del tuo codice SAS) dovrebbe essere utile.
La mia opinione è che le variabili indipendenti (ad esempio, aCrCaTs) sono state determinate nel codice prima della determinazione di P e T. Non ho questi valori quindi non posso testarlo, ma il mio obiettivo era provare Minimize () funzione che ho menzionato prima. (In realtà, se funziona per qualsiasi insieme di variabili, potrebbe essere applicato anche in termini di righe attraverso la funzione For Each Row ().) Ecco la mia soluzione (speculativa) per trovare P e T:
// initialize variables
T = 400;
T_est = T + 273;
aCrCaTs = ?;
Cmo = ?;
Ti = ?;
Fe = ?;
Al = ?;
Cr = ?;
Na = ?;
aEn = ?;
// estimate P and T
Minimize(
P_est = ((-T_est/1269)*Log(aCrCaTs)) + (15.483*(Log(Cmo/T_est))) + (T_est/71.38)+107.8;
TK = (23166+39.28*P_est) / (13.25+15.35*Ti+4.5*Fe-1.55*(Al+Cr+Na)+Log(aEn)^2);
Abs( TK - T_est),
{ P_est, TK },
<< Max Iter( 100 ),
<< Tolerance( 3.0 )
);
Il primo argomento è l'espressione da minimizzare. In questo caso, l'operatore della colla restituirà la differenza assoluta, ovvero la quantità che si desidera ridurre. Il secondo argomento è un elenco dei parametri da determinare. I messaggi opzionali possono essere utilizzati per esercitare un ulteriore controllo sulla ricerca numerica.
Quindi ora hai almeno due modi per portare a termine il tuo compito in JMP.
Ri: Come risolvere due variabili (P e T) in modo iterativo (codice SAS in JSL)?Ciao Jim.
Sì, le ipotesi sono corrette. Ho scriptato tutti i calcoli per le variabili a cui si fa riferimento nelle equazioni. Quindi è tutto risolto.
Grazie mille per l'assistenza. Molto apprezzato!Ri: Come risolvere due variabili (P e T) in modo iterativo (codice SAS in JSL)?Ecco il tuo codice SAS convertito in JMP. Quello che sto assumendo è che ciò che hai fornito è un passo di dati che ha una tabella di dati dietro e che il codice che hai fornito viene elaborato per ogni riga nella tabella di dati. Inoltre, che i carébles citati, aCrCaTs, Crno, Fe ecc. sono le colonne nella tabella dei dati
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
P_est = 0.0;
TK = 0.0;
T = 400;
T_est = T + 273;
TDIFF = 10.0;
IT = 0;
While( TDIFF >= 3.0,
IT = IT + 1;
P_est = ((-T_est / 126.9) * Log( :aCrCaTs )) + (15.483 * (Log( :Crno / T_est ))) + (T_est / 71.38) + 107.8;
TK = (23166 + 39.28 * P_est) / (13.25 + 15.35 * Ti + 4.5 * :Fe - 1.55 * (:Al + :Cr - :Na) + (Log( :aEn )) ^ 2);
//to ensure convergence (set at within 3C);
TDIFF = Abs( TK - T_EST );
If(
TDIFF > 0, T_est = TK + 1,
TDIFF < 0, T_est = TK - 1,
T_est = TK
);
);
);
Ri: Come risolvere due variabili (P e T) in modo iterativo (codice SAS in JSL)?Grazie Marco.
Farò un tentativo.
Ri: Come risolvere due variabili (P e T) in modo iterativo (codice SAS in JSL)?Probabilmente puoi usare il Massimizzare () o Minimizzare() funzioni. Vedere Aiuto > Indice di scripting > funzioni così come Aiuto > Libro > Guida per lo scripting per informazioni su queste due funzioni.
Non sono sicuro che tu abbia bisogno di una soluzione di codice, però. Invece, considerare l'utilizzo del Nonlinear piattaforma. Generalmente lo percepiamo come un modo per adattarsi ai modelli non lineari, ma in realtà è anche una soluzione di massimizzazione generale. Vedere Aiuto > Libri > Modellazione predittiva e specializzata , Capitolo 13, "Regressione non lineare", per ulteriori informazioni.
Naturalmente, puoi anche scrivere questa piattaforma, se necessario, ma è un grande risolutore.