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 似乎是一個保存值的變量,因此沒有什麼可以優化的。