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 约束最小化 - 逐行求解器帮助不客气。 很高兴您找到了解决方案。回复:JSL 约束最小化 - 逐行求解器帮助嗨刘鹏,
非常感谢您坚持不懈地帮助我解决这个问题。 我参考了如何将其转换为等效的无约束问题,然后最小化目标方程和约束的平方误差之和。 虽然我不需要使用惩罚项,但解决方案或多或少与我在 Excel 中看到的相符。
在我将其设置为起始值从前一行数据求解的值开始之后,大约需要 2-3 分钟才能求解 1100 行情况(考虑到我的方程有多么复杂,我认为这是绝对合理的)。
再次非常感谢。
回复:JSL 约束最小化 - 逐行求解器帮助在这种情况下,我认为同时求解多个方程不是正确的方向,因为表中的每一行都涉及两个变量:parameter1 和parameter2。 尽管它们在各个方程中具有相同的名称,并且您将它们放在同一列下,但它们在行与行之间都是不同的变量。
为了使用我给出的建议同时求解多个方程,方程在方程之间使用相同的变量集。 每个变量应该只有一个值。
您需要做的是将 Excel 宏中所做的操作转换为 JSL,例如,您需要编写一个更大的 JSL 循环来迭代地遍历每一行。
对于在非线性约束下求解方程,我的建议之一是将受约束问题转换为等效的无约束问题。 假设您的约束是等式,以下示例尝试在约束 y==exp(-x) 下找到 y-exp(x)=0 的解。 解是两条曲线的交点,即 (x,y)=(0,1)。 最小化目标是目标方程 y-exp(x) 的平方误差之和,并且违反约束 y-exp(-x)=0。 注意k是对违规行为的惩罚,并且k相当大。
另请注意,我故意将初始值放在远离解的位置,并增加 MaxIter,以防万一您无法识别不接近解的初始值。
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))
如果你的实际目标可以使用,这是一个可行的方法。
回复:JSL 约束最小化 - 逐行求解器帮助嗨刘鹏,
我不确定这是否有帮助,因为我必须对数据进行匿名化,但基本上这就是我试图从 Excel 复制或改进的内容:
在本例中,我使用宏 + Excel 的求解器来迭代参数 1 和参数 2 以达到目标 1 和目标 2

谢谢
回复:JSL 约束最小化 - 逐行求解器帮助把你说的很容易解决的 Excel 例子贴出来怎么样,我们就从那里开始吧? 不一定是您手中的确切问题,但与您的目标非常相似。 或者只是他们向您展示如何使用的 Excel 示例,我们将看看是否可以使用 JMP 来解决它。
回复:JSL 约束最小化 - 逐行求解器帮助嗨刘鹏,
感谢分享这些选项,但如果我基本上尝试做与以前相同的事情,则不清楚我可以使用哪种方法,即求解数据表中每一行的 x1 和 x2,但在本例中求解两个方程同时,具有一些非线性约束。
你知道我们之前有没有做过例子吗? 很难相信与 Excel 相比,做到这一点是如此困难
谢谢
回复:JSL 约束最小化 - 逐行求解器帮助以下两个 JSL 函数可能与您的“求解方程”目标相关。 它们用于线性方程。


为了求解非线性方程,您可能需要将目标转换为等效的优化问题。 然后使用JSL函数Maximize或非线性平台来求解。
对于具有非线性约束的优化,可以构造一个等效的无约束优化目标,因此可以使用一些 JMP 工具,例如 JSL 函数 Maximize、非线性平台或 Profiler 中的意愿函数。 其他 JMP 工具可能有助于“搜索”最优值,例如 JMP 中的 DOE 平台。
方法的选择取决于实际目标和限制。
回复:JSL 约束最小化 - 逐行求解器帮助嗨刘鹏,
谢谢您,我尝试按照您设置 min-constrained 的方式进行操作,它现在似乎对我有用。 我基本上需要在 JSL 中执行所有计算,而不是将其放在公式列中。
问题 - 是否可以同时求解两个方程? 是否可以有非线性约束?
回复: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 约束最小化 - 逐行求解器帮助嗨刘鹏,
感谢您的回复。 我想我理解这里的问题:
对于我有的场景:
- 100行数据表
- Z 列 = Y1 列 - Y2 列
- Y1 列 = 公式(X1、X2、X3 ..)
- Y2 列 = 公式(X1、X2、X3 ..)
目标是通过在列 X1 和 X2 中为每行设置一个值来使列 Z = 0。
使用 Constrained Minimize 通过迭代某些 JSL 变量 x1 和 x2 中的值来使列 Z = 0 中的表达式不起作用,因为列 Y1 和 Y2 是根据列 X1 和 X2 中的值进行计算的公式列,并且在全部分配给 JSL 变量 x1 和 x2。
看看您如何设置脚本,我认为我可以尝试使其适合我的情况的方法是在 JSL 中完成所有嵌套计算,而不是在数据表中的公式列中完成。 运行约束 Min 函数,然后将结果保存在数据表列中。
你怎么认为 ?
回复: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);
我想您需要的是一个表达式列,如下例所示。
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 只能从表达式列中提取值。 除表达式操作之外的任何其他操作都将触发求值。 例如,以下内容将无法按预期工作。
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 约束最小化 - 逐行求解器帮助嗨刘鹏,
是的,代码本身无法工作,因为它需要我的数据表,其中包含不幸的是我无法共享的专有数据。
就 expr1 不包含要优化的术语而言,我想我遇到的问题是,如果 expr1 中使用的术语是包含优化变量的 FORMULA 列,则约束最小化仍然有效还是我需要扩展expr1 中的整个方程(而不是嵌套)。 请注意,我没有选择这样做,因为方程很长。
如果您需要更多说明,请告诉我。
谢谢。
回复:JSL 约束最小化 - 逐行求解器帮助代码不运行。 请您详细说明一下好吗? 此外,Constrained Minimize 需要一个表达式,但 expr1 似乎是一个保存值的变量,因此没有什么可以优化的。