Minimización restringida de JSL - Ayuda de Solver fila por filaHola,
Mi objetivo es hacer que JSL repita los valores en dos columnas (x1, x2) que se usan en fórmulas de otras columnas hasta que cumpla con los criterios de [columna (y1) - columna (y2) = 0; columna (z1) - columna(z2)=0]. Tenga en cuenta que la ecuación que estoy tratando de resolver es una ecuación no lineal anidada donde
y1 = f1(x1, x2, x3, x4...)
y2 = f2(x1, x2, x3, x4...)
z1 = y1+y2
z2 = valor independiente
En Excel, era bastante sencillo dividir la ecuación en varias columnas para realizar un seguimiento más fácil si había algún error de cálculo en el medio. Luego, repita cada fila y realice un solucionador para iterar x1 y x2 hasta que se cumplan los criterios objetivos.
En JMP, tengo dificultades para utilizar la función Minimizar restringida para replicar esto. Cada vez que ejecuto el script, no parece convergente porque no se cumple el objetivo y los valores cambian constantemente. Además, solo puedo establecer 1 objetivo en lugar de 2. A continuación se muestra un ejemplo de mi código JSL. Tenga en cuenta que column_y1 y column_y2 son columnas de fórmula que tienen variables x1 y x2 en su interior.
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>¿Crees que necesito tener TODA la ecuación anidada en la expresión para que esto funcione? ¿O hay algo mal que estoy haciendo aquí?
Cualquier ayuda es muy apreciada. ¡Gracias!
Diseño de experimentosRe: Minimización restringida de JSL - Ayuda de Solver fila por filaDe nada. Me alegra que hayas encontrado la solución.Re: Minimización restringida de JSL - Ayuda de Solver fila por filaHola Peng Liu,
Muchas gracias por su persistencia en ayudarme a resolver este problema. Hice referencia a cómo lo convertiste en un problema equivalente sin restricciones y luego minimizaste la suma de errores cuadrados tanto de la ecuación objetivo como de la restricción. Si bien no necesité utilizar un término de penalización, la solución coincide más o menos con lo que veo en Excel.
Se necesitan entre 2 y 3 minutos para resolver 1100 filas de casos (lo cual creo que es absolutamente razonable dado lo complicadas que son mis ecuaciones), después de configurarlo de modo que el valor inicial comience a partir de los valores resueltos de la fila de datos anterior.
De nuevo, muchas gracias.
Re: Minimización restringida de JSL - Ayuda de Solver fila por filaEn este caso, no creo que resolver varias ecuaciones simultáneamente sea la dirección a seguir, porque cada fila de la tabla implica dos variables: parámetro1 y parámetro2. Y son variables diferentes de una fila a otra, aunque tienen el mismo nombre de una ecuación a otra y las colocas bajo la misma columna.
Para resolver simultáneamente múltiples ecuaciones usando las sugerencias que di, las ecuaciones usan el mismo conjunto de variables de una ecuación a otra. Cada variable debe tener un solo valor.
Lo que debe hacer es traducir lo que ha hecho en las macros de Excel a JSL; por ejemplo, debe escribir un bucle JSL más grande para recorrer cada fila de forma iterativa.
Para resolver una ecuación bajo una restricción no lineal, una de mis sugerencias fue convertir un problema restringido en un problema equivalente sin restricciones. Supongamos que su restricción es una igualdad, el siguiente ejemplo intenta encontrar la solución a y-exp(x)=0, bajo la restricción y==exp(-x). La solución es la intersección de las dos curvas, que está en (x,y)=(0,1). El objetivo minimizador es la suma de los errores al cuadrado de la ecuación objetivo y-exp(x) y la violación de la restricción y-exp(-x)=0. Observe que k es una penalización por la infracción y k es bastante grande.
Observe también que intencionalmente puse los valores iniciales lejos de la solución y aumento MaxIter, en caso de que no pueda identificar los valores iniciales que no están cerca de la solución.
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))
Es un enfoque factible si su objetivo real puede utilizarlo.
Re: Minimización restringida de JSL - Ayuda de Solver fila por filaHola Peng Liu,
No estoy seguro si esto ayuda porque tengo que anonimizar los datos, pero básicamente esto ha sido lo que estaba intentando replicar o mejorar desde Excel:
En este caso, estoy usando una macro + solucionador de Excel para iterar el parámetro 1 y el parámetro 2 para alcanzar el objetivo 1 y el objetivo 2.

Gracias
Re: Minimización restringida de JSL - Ayuda de Solver fila por fila¿Qué tal publicar el ejemplo de Excel que dijiste que es fácil de resolver y comenzamos desde allí? No necesariamente tiene el problema exacto en sus manos, pero algo se parece mucho a su objetivo. O simplemente el ejemplo de Excel que os enseñan a utilizar, y veremos si con JMP lo solucionamos.
Re: Minimización restringida de JSL - Ayuda de Solver fila por filaHola Peng Liu,
Gracias por compartir esas opciones, pero no está claro qué método podría usar si básicamente intento hacer lo mismo que antes, que es resolver x1 y x2 para cada fila de la tabla de datos, pero en este caso resolver dos ecuaciones. simultáneamente, con algunas restricciones no lineales.
¿Sabes si tenemos algún ejemplo hecho antes? Es difícil creer que sea tan difícil hacer esto frente a Excel.
Gracias
Re: Minimización restringida de JSL - Ayuda de Solver fila por filaSeguir dos funciones JSL puede ser relevante para su objetivo de "resolver ecuaciones". Son para ecuaciones lineales.


Para resolver ecuaciones no lineales, es posible que desee convertir el objetivo en un problema de optimización equivalente. Luego use la función JSL Maximizar o la plataforma no lineal para resolverlo.
Para la optimización con restricciones no lineales, es posible construir un objetivo de optimización equivalente sin restricciones, por lo que se pueden utilizar algunas herramientas JMP, por ejemplo, la función JSL Maximizar, la plataforma no lineal o la función de deseabilidad en Profiler. Otras herramientas JMP podrían resultar útiles para "buscar" lo óptimo, por ejemplo, plataformas DOE en JMP.
La elección del enfoque depende del objetivo y las limitaciones reales.
Re: Minimización restringida de JSL - Ayuda de Solver fila por filaHola Peng Liu,
Gracias, intenté seguir cómo configuró la restricción mínima y parece estar funcionando para mí ahora. Básicamente necesitaba ejecutar todos los cálculos en JSL en lugar de tenerlos en columnas de fórmula.
Pregunta: ¿Es posible resolver dos ecuaciones simultáneamente? ¿Es posible tener restricciones no lineales?
Re: Minimización restringida de JSL - Ayuda de Solver fila por filaSiéntete como un enfoque de trabajo. Entonces tiene una sola expresión, debido a que estaba configurando columnas de fórmula, las expresiones deben ser las mismas para todas las filas. Necesita la tabla, sólo porque necesita valores para x3, x4, etc., fila por fila. No puedo estar seguro de qué tan relevantes son aquí la optimización restringida y el objetivo objetivo de z=0, pero el siguiente script muestra el panorama general del flujo. Reemplace la configuración y optimización en consecuencia.
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>Re: Minimización restringida de JSL - Ayuda de Solver fila por filaHola Peng Liu,
Gracias por la respuesta. Creo que entiendo el problema aquí:
Para el escenario donde tengo:
- Tabla de datos con 100 filas.
- Columna Z = Columna Y1 - Columna Y2
- Columna Y1 = fórmula (Columna X1, X2, X3...)
- Columna Y2 = fórmula (Columna X1, X2, X3...)
Donde el objetivo es hacer que la Columna Z = 0 estableciendo un valor en las Columnas X1 y X2 para cada fila.
Usar Minimización restringida para hacer que la expresión en la columna Z = 0 iterando valores en alguna variable JSL x1 y x2 no funcionaría porque las columnas Y1 e Y2 son columnas de fórmula que se evalúan en función de los valores de las columnas X1 y X2 y no están conectadas en todo a la variable JSL x1 y x2.
Al observar cómo configuró su secuencia de comandos, creo que la forma en que puedo intentar que funcione en mi caso es hacer todos los cálculos anidados dentro de JSL en lugar de en columnas de fórmula en la tabla de datos. Ejecute la función Min restringida y luego guarde los resultados en las columnas de la tabla de datos.
Qué opinas ?
Re: Minimización restringida de JSL - Ayuda de Solver fila por filaEl siguiente ejemplo es una situación hipotética basada en su descripción del problema.
La columna fcol es una fórmula de otras dos columnas x1 y x2.
La evaluación de fcol depende de dos columnas x1 y x2, y no se verá afectada por variables JSL externas, como las de su script.
Finalmente, el ejemplo muestra que expr1 es un valor, no una expresión.
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);
Supongo que lo que necesitas es una columna Expresión, como en el siguiente ejemplo.
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>
Y expr1 solo puede extraer valor de una columna de Expresión. Cualquier operación adicional que no sea la operación de expresión activará la evaluación. Por ejemplo, lo siguiente no funcionará como se esperaba.
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.Re: Minimización restringida de JSL - Ayuda de Solver fila por filaHola Peng Liu,
Sí, el código no funcionaría por sí solo porque requiere mi tabla de datos que contiene datos de propiedad que desafortunadamente no puedo compartir.
En términos de que expr1 no contiene el término a optimizar, supongo que la pregunta que tenía era que si los términos utilizados en expr1 son columnas de FÓRMULA donde está contenida la variable de optimización, ¿la minimización restringida seguiría funcionando o necesito expandir el término? ecuación completa en expr1 (en lugar de tenerla anidada). Tenga en cuenta que no elegí hacer eso porque la ecuación es muy larga.
Por favor, avíseme si necesita más aclaraciones.
Gracias.
Re: Minimización restringida de JSL - Ayuda de Solver fila por filaEl código no se ejecuta. ¿Podría por favor dar más detalles? Además, Restrained Minimize espera una expresión, pero expr1 parece ser una variable que contiene un valor, por lo que no hay nada que optimizar.