JSL受约束的最小化-按行求解器帮助嗨,您好,
我的目标是让JSL遍历两列(x1,x2)中的值,这些值用于其他列的公式中,直到满足[column(y1)-column(y2)= 0; column(z1)-列(z2)= 0]。 请注意,我要求解的方程是一个嵌套的非线性方程,其中
y1 = f1(x1,x2,x3,x4 ...)
y2 = f2(x1,x2,x3,x4 ...)
z1 = y1 + y2
z2 =独立值
在Excel中,将方程式分解为多列非常简单,以便更轻松地跟踪之间是否存在任何计算错误。 然后遍历每一行并执行求解器以遍历x1和x2直到满足客观标准。
在JMP中,使用“约束最小化”功能来复制它很难。 每次我运行脚本时,它看起来都不像在收敛,因为未达到目标目标并且值不断变化。 另外,我只能设定1个目标,而不能设定2个。 下面是我的JSL代码的示例。 请注意,column_y1和column_y2是其中包含x1和x2变量的公式列。
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>您是否认为我需要在表达式中包含整个嵌套方程式才能起作用? 还是我在这里做错了什么。
任何帮助是极大的赞赏。 谢谢!
脚本编写回复:JSL约束最小化-行逐行求解器帮助该代码无法运行。 您能详细说明一下吗? Constrained Minimize也需要表达式,但是expr1似乎是一个保存值的变量,因此没有什么要优化的。回复:JSL约束最小化-行逐行求解器帮助刘鹏你好
是的,代码本身无法运行,因为它需要我的数据表,其中包含我无法共享的专有数据。
关于expr1不包含要优化的术语,我想我要问的问题是,如果expr1中使用的术语是其中包含优化变量的FORMULA列,则约束最小化是否仍然有效,还是我需要扩展expr1中的整个方程(而不是嵌套)。 请注意,我没有选择这样做,因为方程很长。
如果需要更多说明,请告诉我。
谢谢。
回复:JSL约束最小化-行逐行求解器帮助下面的示例是一个基于您对问题的描述的假设情况。
fcol列是其他两个列x1和x2的公式。
fcol的求值取决于x1和x2两列,并且不受外部JSL变量(如脚本中的变量)的影响。
最后,该示例显示expr1是一个值,而不是一个表达式。
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);
我猜您需要的是一个Expression列,如以下示例所示。
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>
而且expr1只能从Expression列中提取值。 除表达式操作外的任何其他操作都将触发求值。 例如,以下操作无法按预期进行。
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.回复:JSL约束最小化-行逐行求解器帮助刘鹏你好
感谢您的回复。 我想我明白这里的问题:
对于我有的情况:
- 100行数据表
- Z列= Y1列-Y2列
- Y1列=公式(X1,X2,X3 ..)
- Y2列=公式(X1,X2,X3 ..)
目的是通过在每一行的X1和X2列中设置一个值来使Z = 0列。
通过约束某些JSL变量x1和x2的值,使用Constrained Minimize使Z = 0列中的表达式不起作用,因为Y1和Y2列是基于X1和X2列中的值进行计算的公式列,并且未在全部交给JSL变量x1和x2。
看一下如何设置脚本,我想我可以尝试使其适合我的情况的方法是在JSL内而不是在数据表的公式列中完成所有嵌套的计算。 运行约束的Min函数,然后将结果保存在数据表列中。
你怎么看 ?
回复:JSL约束最小化-行逐行求解器帮助感觉像一个工作方法。 因此,只有一个表达式,因为要设置公式列,所以所有行的表达式必须相同。 您仅需要表,因为您需要逐行获取x3,x4等的值。 我不确定在这里约束优化和z = 0的目标目标之间的关系如何,但是以下脚本显示了流程的概况。 相应地替换设置和优化。
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>回复:JSL约束最小化-行逐行求解器帮助刘鹏你好
谢谢,我尝试遵循您如何设置min-constrained,它现在似乎确实对我有用。 我基本上需要在JSL中执行所有计算,而不是在公式列中进行计算。
问题-是否可以同时求解两个方程? 是否可能具有非线性约束?
回复:JSL约束最小化-行逐行求解器帮助遵循以下两个JSL函数可能与您的“求解方程”目标有关。 它们用于线性方程。


为了求解非线性方程,您可能需要将目标转换为等效的优化问题。 然后使用JSL函数Maximize或Nonlinear平台来解决它。
对于具有非线性约束的优化,可以构建无约束的等效优化目标,因此可以使用某些JMP工具,例如JSL函数最大化,非线性平台或Profiler中的Desirability函数。 其他JMP工具可能对“搜索”最优方法很有用,例如JMP中的DOE平台。
方法的选择取决于实际目标和约束条件。
回复:JSL约束最小化-行逐行求解器帮助刘鹏你好
感谢您共享这些选项,但是如果我基本上想做与以前相同的事情,则不清楚我可以使用哪种方法,即为数据表中的每一行求解x1和x2,但是在这种情况下,解决了两个方程式同时,具有一些非线性约束。
您知道我们之前是否做过任何示例吗? 很难相信对Excel很难做到这一点
谢谢
回复:JSL约束最小化-行逐行求解器帮助我们从那里开始如何发布您认为容易解决的Excel示例呢? 问题不一定完全掌握在您手中,而是与您的目标非常相似。 或者只是他们向您展示如何使用的Excel示例,我们将看看是否可以使用JMP解决它。