¿Cómo resolver iterativamente dos variables (P y T) (código SAS a JSL)?Buen día.
Soy nuevo en el JMP y JSL. He usado SAS y estoy tratando de consolidar parte del trabajo que hice en SAS en JMP.
En este caso, tengo un código SAS (incluido a continuación) que resuelve dos variables, P (presión) y T (temperatura), utilizando iterativamente las siguientes ecuaciones.
¿Cuál es la forma más fácil de hacer este JMP (y JSL)?
Muchas gracias de antemano.
Rob Preston (agradecido usuario novato de JMP)
################################################## ################################################## ########
** código de SAS (v9.1)
* resuelva P, T iterativamente, tenga en cuenta que LOG es LN (excl K);
P_est = 0.0;
TK = 0.0;
T = 400;
T_est = T + 273;
TDIFF = 10.0;
IT = 0;
HACER HASTA (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);
* para asegurar la convergencia (establecido dentro de 3C);
TDIFF = ABS (TK-T_EST);
si TDIFF> 0 entonces T_est = TK + 1;
otra cosa si TDIFF <0 entonces T_est = TK-1;
else T_est = TK;
FIN;
################################################## ################################################## ########
Re: ¿Cómo resolver iterativamente dos variables (P y T) (código SAS a JSL)?Muchas gracias Mark.
Voy a probar ambos métodos. ¡Este es un gran ejercicio de aprendizaje para mí!
Re: ¿Cómo resolver iterativamente dos variables (P y T) (código SAS a JSL)?Tuve una opinión diferente sobre tu problema que Jim. No me di cuenta de que las variables independientes estaban en la misma fila y usted quiere determinar P y T para cada fila. Si es así, entonces su solución (traducción de su código SAS) debería ser útil.
Mi opinión fue que las variables independientes (por ejemplo, aCrCaTs) se determinaron en el código antes de la determinación de P y T. No tengo esos valores, por lo que no puedo probarlos, pero mi opinión fue probar Minimizar () Función que mencioné anteriormente. (En realidad, si funciona para cualquier conjunto de variables, también podría aplicarse en filas a través de la función For Each Row ()). Aquí está mi solución (especulativa) para encontrar P y 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 )
);
El primer argumento es la expresión a minimizar. En este caso, el operador de pegamento devolverá la diferencia absoluta, que es la cantidad que desea minimizar. El segundo argumento es una lista de los parámetros a determinar. Los mensajes opcionales se pueden utilizar para ejercer un mayor control en la búsqueda numérica.
Así que ahora tiene al menos dos formas de realizar su tarea en JMP.
Re: ¿Cómo resolver iterativamente dos variables (P y T) (código SAS a JSL)?Hola Jim.
Sí, tus suposiciones son correctas. He programado todos los cálculos para las variables a las que se hace referencia en las ecuaciones. Así que eso es todo resuelto.
Muchas gracias por su asistencia. ¡Apreciado enormemente!Re: ¿Cómo resolver iterativamente dos variables (P y T) (código SAS a JSL)?Aquí está su código SAS convertido a JMP. Lo que asumo es que lo que proporcionó es un paso de datos que tiene una tabla de datos detrás y que el código que proporcionó se procesa para cada fila en la tabla de datos. También, que los cariables mencionados, aCrCaTs, Crno, Fe etc. son columnas en la tabla de datos
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
);
);
);
Re: ¿Cómo resolver iterativamente dos variables (P y T) (código SAS a JSL)?Gracias Mark.
Voy a darle una oportunidad.
Re: ¿Cómo resolver iterativamente dos variables (P y T) (código SAS a JSL)?Probablemente puedas usar el Maximizar() o Minimizar() funciones Ver Ayuda > Índice de Scripting > Funciones tanto como Ayuda > Libro > Guia de Scripting Para información sobre estas dos funciones.
Sin embargo, no estoy seguro de que necesites una solución de código. En su lugar, considere usar el No lineal plataforma. En general, lo percibimos como una forma de ajustar modelos no lineales, pero en realidad también es una solución de maximización general. Ver Ayuda > Libros > Modelización Predictiva y Especializada. , Capítulo 13, "Regresión no lineal", para obtener más información.
Por supuesto, también puede crear un script de esta plataforma, si es necesario, pero es un excelente solucionador.