Minimización restringida de JSL: ayuda del solucionador fila por filaHola,
Mi objetivo es que JSL repita los valores en dos columnas (x1, x2) que se utilizan 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, fue lo suficientemente simple como para dividir la ecuación en varias columnas para rastrear más fácilmente si había algún error de cálculo en el medio. Luego, itere a través de cada fila y haga un solucionador para iterar x1 y x2 hasta que se cumplan los criterios objetivos.
En JMP, tengo dificultades para usar la función Minimizar restringida para replicar esto. Cada vez que ejecuto el script, no parece que converja porque el objetivo de destino no se cumple 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!
ScriptingRe: JSL Constrained Minimize - Ayuda Row by Row SolverEl código no se ejecuta. ¿Podría explicarnos por favor? También Constrained Minimize espera una expresión, pero expr1 parece ser una variable que contiene un valor, por lo que no hay nada que optimizar.Re: JSL Constrained Minimize - Ayuda Row by Row SolverHola Peng Liu,
Sí, el código no funcionaría por sí mismo porque requiere mi tabla de datos que contiene datos de propiedad que, lamentablemente, no puedo compartir.
En términos de expr1 que no contiene el término para optimizar, supongo que la pregunta que tenía era que si los términos usados en expr1 son columnas de FÓRMULA donde está contenida la variable de optimización, ¿la minimización restringida aún funcionaría o necesito expandir la 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: JSL Constrained Minimize - Ayuda Row by Row SolverEl 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 necesita es una columna de expresión, como 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 Expresión. Cualquier otra operación distinta a las operaciones de expresión desencadenará 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: JSL Constrained Minimize - Ayuda Row by Row SolverHola 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 la Columna X1 y X2 para cada fila.
Usar Constrained Minimize para hacer 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.
Mirando cómo ha configurado su script, creo que la forma en que puedo intentar que funcione para mi caso es hacer que todos los cálculos anidados se realicen 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é piensas ?
Re: JSL Constrained Minimize - Ayuda Row by Row SolverSiente como un enfoque de trabajo. Entonces, tiene una sola expresión, ya que estaba configurando columnas de fórmula, las expresiones deben ser las mismas para todas las filas. Necesita la tabla, solo porque necesita valores para x3, x4, etc., fila por fila. No puedo estar seguro de cuán relevantes son la optimización restringida y el objetivo de z = 0 aquí, pero el siguiente script muestra el panorama general del flujo. Reemplace la configuración y la 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: JSL Constrained Minimize - Ayuda Row by Row SolverHola Peng Liu,
Gracias, intenté seguir cómo estableciste con restricciones mínimas y parece que me está funcionando ahora. Básicamente, necesitaba ejecutar todo el cálculo en JSL en lugar de tenerlo en columnas de fórmula.
Pregunta: ¿Es posible resolver dos ecuaciones simultáneamente? ¿Es posible tener restricciones no lineales?
Re: JSL Constrained Minimize - Ayuda Row by Row SolverSeguir 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 usar algunas herramientas JMP, por ejemplo, la función JSL Maximizar, la plataforma no lineal o la función de deseabilidad en Profiler. Otras herramientas de JMP pueden ser útiles para "buscar" lo óptimo, por ejemplo, plataformas DOE en JMP.
La elección del enfoque depende del objetivo y las limitaciones reales.
Re: JSL Constrained Minimize - Ayuda Row by Row SolverHola Peng Liu,
Gracias por compartir esas opciones, pero no está claro qué método podría usar si básicamente estoy tratando de hacer lo mismo que antes, que es resolver x1 y x2 para cada fila en la tabla de datos, pero en este caso resolviendo dos ecuaciones simultáneamente, con algunas restricciones no lineales.
¿Sabes si hemos hecho algunos ejemplos antes? Es difícil creer que sea tan difícil hacer esto frente a Excel
Gracias
Re: JSL Constrained Minimize - Ayuda Row by Row Solver¿Qué tal publicar el ejemplo de Excel que dijo que era fácil de resolver y comenzamos desde allí? No es necesariamente el problema exacto en sus manos, pero algo se parece mucho a su objetivo. O simplemente el ejemplo de Excel que te muestran cómo usar, y veremos si podemos resolverlo usando JMP.