JSL 제한 최소화 - 행별 해결사 도움말안녕하세요,
내 목표는 JSL이 [column(y1)-column(y2) = 0 ;column(z1)-의 기준을 충족할 때까지 다른 열의 수식에 사용되는 두 열(x1, x2)의 값을 반복하도록 하는 것입니다. 열(z2)=0]. 제가 풀려고 하는 방정식은 중첩된 비선형 방정식입니다.
y1 = f1(x1, x2, x3, x4...)
y2 = f2(x1, x2, x3, x4...)
z1 = y1+y2
z2 = 독립값
Excel에서는 방정식을 여러 열로 나누면 그 사이에 계산 오류가 있는지 더 쉽게 추적할 수 있을 정도로 간단했습니다. 그런 다음 각 행을 반복하고 솔버를 실행하여 목표 기준이 충족될 때까지 x1 및 x2를 반복합니다.
JMP에서는 Constrained Minimize 기능을 사용하여 이를 복제하는 데 어려움을 겪고 있습니다. 스크립트를 실행할 때마다 목표 목표가 충족되지 않고 값이 지속적으로 변경되기 때문에 수렴되는 것처럼 보이지 않습니다. 또한 2개가 아닌 1개의 목표 목표만 설정할 수 있습니다. 다음은 내 JSL 코드의 예입니다. 컬럼_y1과 컬럼_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>이것이 작동하려면 표현식에 전체 중첩 방정식이 있어야 한다고 생각하시나요? 아니면 내가 여기서 뭘 잘못하고 있는 걸까요?
어떤 도움이라도 대단히 감사하겠습니다. 감사해요!
실험 설계Re: JSL 제한된 최소화 - 행별 해결사 도움말물론이죠. 해결책을 찾으셨다니 다행입니다.Re: JSL 제한된 최소화 - 행별 해결사 도움말안녕하세요 Peng Liu님,
이 문제를 해결하는 데 도움을 주셔서 대단히 감사합니다. 이를 제약 없는 등가 문제로 변환한 다음 대상 방정식과 제약 조건 모두의 제곱 오류 합계를 최소화하는 방법을 참조했습니다. 페널티 용어를 사용할 필요는 없었지만 솔루션은 Excel에서 본 것과 거의 일치합니다.
시작 값이 이전 데이터 행에서 풀린 값에서 시작하도록 설정한 후 1,100개 행의 사례를 해결하는 데 약 2-3분이 걸립니다(내 방정식이 얼마나 복잡한지를 고려하면 절대적으로 합리적이라고 생각합니다).
다시 한번 감사드립니다.
Re: JSL 제한된 최소화 - 행별 해결사 도움말이 경우 테이블의 모든 행에는 매개변수 1과 매개변수 2라는 두 개의 변수가 포함되어 있기 때문에 여러 방정식을 동시에 푸는 것이 방향이 아니라고 생각합니다. 그리고 방정식마다 이름이 동일하고 동일한 열 아래에 배치하더라도 행마다 다른 변수입니다.
내가 제시한 제안을 사용하여 여러 방정식을 동시에 풀기 위해 방정식은 방정식마다 동일한 변수 세트를 사용합니다. 모든 변수에는 하나의 값만 있어야 합니다.
당신이 해야 할 일은 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))
실제 목표를 사용할 수 있다면 실현 가능한 접근 방식입니다.
Re: JSL 제한된 최소화 - 행별 해결사 도움말안녕하세요 Peng Liu님,
데이터를 익명화해야 하기 때문에 이것이 도움이 되는지 잘 모르겠지만 기본적으로 이것이 Excel에서 복제하거나 개선하려고 했던 것입니다.
이 경우에는 매크로 + Excel의 솔버를 사용하여 매개변수 1과 매개변수 2를 반복하여 목표 1과 목표 2에 도달합니다.

감사해요
Re: JSL 제한된 최소화 - 행별 해결사 도움말해결하기 쉽다고 말씀하신 Excel 예제를 게시하고 거기서부터 시작해 보는 것은 어떨까요? 반드시 정확한 문제는 아니지만 목표와 매우 유사한 것이 있습니다. 아니면 사용법을 보여주는 Excel 예제를 살펴보고 JMP를 사용하여 문제를 해결할 수 있는지 알아보겠습니다.
Re: JSL 제한된 최소화 - 행별 해결사 도움말안녕하세요 Peng Liu님,
해당 옵션을 공유해 주셔서 감사합니다. 하지만 기본적으로 이전과 동일한 작업을 수행하려는 경우 어떤 방법을 사용할 수 있는지 명확하지 않습니다. 이는 데이터 테이블의 각 행에 대해 x1과 x2를 해결하는 것이지만 이 경우에는 두 방정식을 해결합니다. 동시에 일부 비선형 제약 조건이 적용됩니다.
이전에 수행한 예가 있는지 아시나요? 엑셀과 비교해서 이렇게 어렵다는게 믿기지 않네요
감사해요
Re: JSL 제한된 최소화 - 행별 해결사 도움말다음 두 가지 JSL 함수는 "방정식 풀기" 목표와 관련이 있을 수 있습니다. 선형 방정식에 대한 것입니다.


비선형 방정식을 풀기 위해 목표를 등가 최적화 문제로 변환할 수 있습니다. 그런 다음 JSL 기능 Maximize 또는 Nonlinear 플랫폼을 사용하여 문제를 해결하세요.
비선형 제약 조건이 있는 최적화의 경우 제약 조건 없이 동등한 최적화 목표를 구성할 수 있으므로 일부 JMP 도구(예: JSL 함수 Maximize, 비선형 플랫폼 또는 Profiler의 Desirability Function)를 사용할 수 있습니다. 다른 JMP 도구(예: JMP의 DOE 플랫폼)는 최적을 "검색"하는 데 유용할 수 있습니다.
접근 방식의 선택은 실제 목표와 제약 사항에 따라 달라집니다.
Re: JSL 제한된 최소화 - 행별 해결사 도움말안녕하세요 Peng Liu님,
감사합니다. 최소 제한을 설정한 방법을 따라해 보았는데 지금은 효과가 있는 것 같습니다. 기본적으로 모든 계산을 수식 열에 두는 대신 JSL에서 실행해야 했습니다.
질문 – 두 개의 방정식을 동시에 푸는 것이 가능합니까? 비선형 제약 조건을 갖는 것이 가능합니까?
Re: 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>Re: JSL 제한된 최소화 - 행별 해결사 도움말안녕하세요 Peng Liu님,
응답해 주셔서 감사합니다. 나는 여기서 문제를 이해한다고 생각합니다.
내가 가진 시나리오의 경우 :
- 100개의 행이 있는 데이터 테이블
- Z 열 = Y1 열 - Y2 열
- Y1 열 = 수식(X1, X2, X3 열..)
- Y2열 = 수식(X1, X2, X3열..)
여기서 목표는 각 행에 대해 열 X1 및 X2에 값을 설정하여 열 Z = 0을 만드는 것입니다.
제한된 최소화를 사용하여 일부 JSL 변수 x1 및 x2의 값을 반복하여 열 Z = 0의 표현식을 만드는 것은 작동하지 않습니다. 왜냐하면 열 Y1 및 Y2는 열 X1 및 X2의 값을 기반으로 평가되고 연결되지 않은 수식 열이기 때문입니다. 모두 JSL 변수 x1 및 x2에 적용됩니다.
스크립트 설정 방법을 살펴보면 제 경우에 맞게 작동하도록 할 수 있는 방법은 데이터 테이블의 수식 열이 아닌 JSL 내에서 모든 중첩 계산을 수행하는 것입니다. 제한된 Min 함수를 실행한 다음 결과를 데이터 테이블 열에 저장합니다.
어떻게 생각하나요 ?
Re: 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.Re: JSL 제한된 최소화 - 행별 해결사 도움말안녕하세요 Peng Liu님,
예, 불행히도 공유할 수 없는 독점 데이터가 포함된 데이터 테이블이 필요하기 때문에 코드가 자체적으로 작동하지 않습니다.
expr1에 최적화할 용어가 포함되어 있지 않다는 점에서 제가 가졌던 질문은 expr1에 사용된 용어가 최적화 변수가 포함된 FORMULA 열인 경우 제한된 최소화가 여전히 작동하는지 아니면 확장해야 한다는 것이었습니다. expr1의 전체 방정식(중첩하는 대신) 참고 방정식이 매우 길기 때문에 그렇게 하기로 선택하지 않았습니다.
더 자세한 설명이 필요하면 알려주시기 바랍니다.
감사해요.
Re: JSL 제한된 최소화 - 행별 해결사 도움말코드가 실행되지 않습니다. 자세히 설명해 주시겠습니까? 또한 Constrained Minimize는 표현식을 기대하지만 expr1은 값을 보유하는 변수인 것 같아서 최적화할 것이 없습니다.