다른 함수를 인수로 사용하는 함수 정의안녕
다른 함수의 영역에서 선형성을 가정하는 오류를 계산하는 함수를 정의하려고 합니다.
내 기능은 다음을 수행해야 합니다.
- 3개의 입력, 비선형 함수(가급적 다른 곳에 정의된 함수 이름, f(x)), 영역의 중심(xi) 및 조사 중인 영역의 반폭(델타)을 수락합니다.
- xi, Lin(x)에서 점근선 선형 함수의 기울기와 절편을 생성합니다.
- 정의에 따라 오류 함수 err(x) = Lin(x) - f(x), err(xi) = 0을 생성합니다.
- xi-delta에서 xi+delta까지 err(x)를 적분하고 2*delta로 나누어 영역의 평균 오차를 찾습니다.
- 평균 오차를 사용하여 영역 오차의 표준 편차를 계산합니다(통합도 포함됨).
이렇게 하려고 하면 세 가지 문제가 발생합니다.
- jsl의 Function-function이 다른 함수를 입력으로 받아들이도록 하려면 어떻게 해야 합니까?
- Derivative(f(x),x)와 같이 함수 이름으로 제공되는 함수 인수를 구별하기 위해 Derivative-function을 어떻게 얻습니까?
- jsl이 특정 지역에서 기능을 통합하도록 하려면 어떻게 해야 합니까? 이 작업을 수행하는 내장 함수를 찾을 수 없습니다.
도움이 되길 바랍니다.
Re: 다른 함수를 인자로 받는 함수 정의이 게시물을 팔로우하는 사람에게만 참고하십시오. JMP 지원에서는 이미 정의된 함수에서 식을 가져오는 대체 방법을 제공했습니다. Capture Log( Show(func) )의 대안입니다.
funcExpr = Parse( "Expr(" || Char( Name Expr( func ) ) || ")" );
innerf = Arg( Arg( funcExpr, 1 ), 2 );
Re: 다른 함수를 인자로 받는 함수 정의귀하의 제안이 저에게 도움이되었다고 생각합니다.
그러는 동안 나는 그 기능이 무엇을 하길 원하는지에 대해 생각을 바꿨다.
그러나 지금까지 내가 얻은 것은 다음과 같습니다.
expression = Expr( x ^ 2 );
LinearityError = Function( {expression, location, sigma, sigmaRange = 3},
locationY = Eval( Substitute( Name Expr( expression ), Expr( x ), location ) );
SlopeFunc = Derivative( Name Expr( expression ), x );
Slope = Eval( Substitute( Name Expr( SlopeFunc ), Expr( x ), location ) );
Intercept = locationY - Slope * location;
LinExpr = Parse( Eval Insert( "^Slope^*x + ^Intercept^" ) );
errExpr = Substitute( Expr( (a) - (b) ), Expr( a ), Name Expr( LinExpr ), Expr( b ), Name Expr( expression ) );
errExpr = Simplify Expr( Name Expr( errExpr ) );
lowerLimit = location - sigma * sigmaRange;
upperLimit = location + sigma * sigmaRange;
errMean = Integrate( errExpr, x, lowerLimit, upperLimit ) / (2 * sigma * sigmaRange);
errErrSquaredExpr = Substitute( Expr( ((a) - (b))^2 ), Expr( a ), Name Expr( errExpr ), Expr( b ), errMean );
errErrSquaredExpr = Simplify Expr( Name Expr( errErrSquaredExpr ) );
errStdDev = Sqrt(Integrate( errErrSquaredExpr, x, lowerLimit, upperLimit ) / (2 * sigma * sigmaRange));
Return(errStdDev);
);함수가 아닌 인수로 식을 사용하지만 이에 대한 솔루션을 제공했습니다. 아직 구현되지 않았습니다.
탱크를!
Re: 다른 함수를 인자로 받는 함수 정의FYI 블로거의 메모
JMP 14에는 유용한 메시지가 포함된 Custom Function이라는 새 개체가 있습니다. 개선 사항으로 Get Expr 메시지를 요청했습니다. 귀하의 요청에 적용되지 않는다고 생각하지만 LogCapture(show(func)) 등의 2 단계 대신 func << Get Function 기능을 얻는 것이 더 쉬울 것입니다.
Re: 다른 함수를 인자로 받는 함수 정의제스퍼,
Derivative(f(x), x)를 찾으려는 것을 알고 있지만 JMP 기호 Derivative 함수는 첫 번째 인수가 표현식이어야 합니다.이 작업을 원하는 방식을 설명하면 도움이 더 쉬울 수 있습니다. 3개의 인수가 있고 f(x)를 언급한 자신만의 함수나 응용 프로그램을 만들고 싶겠지만 f(x)는 어디서 어떻게 읽거나 정의됩니까?
JMP 표현식 및 함수는 즉시 평가를 시도합니다.이 다음 코드 블록을 스크립트 창에 복사하고 포함된 로그를 표시하려면 마우스 오른쪽 버튼을 클릭한 다음 코드 세그먼트를 강조 표시하고 실행하고 로그에서 결과를 확인합니다. 이것이 JMP 함수와 표현식이 작동하는 방식입니다.
Names Default to Here(1);
func = Function({x}, x^2);
xp = Expr(x^2);
show(func, func(x)); //will get an error func(x/*###*/) since there is no such symbol, x
//----run to here---
show(xp); // xp=x^2 JMP does not evaluate an expression within when it is a Show() function argument
//----run to here---
x= Empty();
show(func, func(x), xp, Eval(xp) ); //func(x) = .; since x is empty, then any calculation involving x is empty
//----run to here---
x=2;
show(func, func(x), xp, Eval(xp)); //func(x) = 4; since x = 2.
//----run to here---
Show(Derivative(xp,x), Derivative(NameExpr(xp),x) )
//----run to here---
//: JMP tries to evaluate func(x), and Derivative(xp,x) evaluates xp unless you specify NameExpr(xp)
따라서 내장 Derivative() 함수를 사용하는 유일한 방법은 첫 번째 인수를 표현식으로 만드는 것입니다.
당신의 질문은 흥미로운 질문을 불러일으켰습니다. JSL이 식 인수를 추출하는 방법 이미 정의된 사용자 함수의 (마지막 인수).아마도 다른 전문 블로거가 더 나은 솔루션을 가지고 있을 것입니다. 또는 이것은 JMP의 향후 버전이 사용자 정의 함수에서 표현식을 추출하는 함수 또는 메시지를 제공하는 위시리스트 항목일 수도 있습니다.
다음 코드 블록은 사용자 정의 함수에서 표현식을 추출하는 방법을 보여줍니다.
따라서 블로그에 기능이 어떻게 읽혀지는지(작성) 알려주면 더 만족스러운 솔루션을 얻을 수 있습니다. 예를 들어 응용 프로그램이 사용자에게 텍스트 상자의 기능을 요청하는 경우 텍스트 작업이 더 간단할 수 있습니다.
func = Function({x},x^2);<BR />
//assumes a function has been defined
tfxp=Parse(Word( 2, Trim(LogCapture(show(func))), "=") );<BR />//show(func) writes the function definition to the Log<BR />//Log Capture() captures that as a string<BR />//the Word() function above gets the right hand side of the equal sign<BR />//Parse turns it into an expression<BR />
fxp = argExpr(tfxp, nargExpr(tfxp) );
//this extracts the last argument of Function()<BR />
show(Derivative(nameExpr(fxp),x));
//______________________________________________________________
//instead of creating a function and doing all the steps to extract the expression
//create the function from an expression
//---create expression
myxp = Expr(3*x^3 -17*x + 12 );
//---this is a template, an expression that will assign func to the expression
myfunc = Expr(func= Function({x}, _xp));
//---create the function
//this substitutes the expression and evaluates
//once it is run, func=Function({x}, 3*x^3 -17*x +12 ) has been defined
Eval(Substitute(NameExpr(myfunc), Expr(_xp), NameExpr(myxp)) );
//this verifies
show(func, myxp, func(2), Derivative(NameExpr(myxp), x));
Re: 다른 함수를 인자로 받는 함수 정의아, 그리고 저는 JMP 14를 사용합니다.
Re: 다른 함수를 인자로 받는 함수 정의당신의 답변에 감사드립니다.
Integrate 기능은 내 문제 중 하나를 해결했습니다.
코드의 모든 내용을 이해하지 못할 수도 있지만 여전히 jsl이 명명된 함수의 파생물을 제공하도록 할 수 없습니다. 즉, 코드에서 der1=der2를 원합니다.
func = Function({x},x^2);
der1 = Derivative(x^2,x);
der2 = Derivative(func(x),x);이를 달성할 수 있는 방법이 있어야 합니다.
또한 귀하의 코드는 Jesper 기능에 표현 , 기능이 아닌 이름 Jesper 기능에. 어떻게 해야 하나요? 이상적으로 Jesper 함수는 둘 다 받아들여야 합니다. 즉, Jesper(x^2) = Jesper(func(x))
Re: 다른 함수를 인자로 받는 함수 정의제스퍼,
사용 중인 JMP 버전을 언급하지 않았습니다. JMP 12 이상에는 통합() 및 기호 파생 함수()가 모두 있습니다.
첨부된 예입니다. 점근적 선형 공식을 단순한 선형으로 생성하지 않습니다. 그러나이 스크립트의 목표는 구문을 데모하는 것입니다.기호 수식을 참조하려면 식이어야 합니다.tehscripting Index에서 다음을 조회해야 합니다.
- Substitute(), NameExpr, EvalInsert(), Parse(), Simplify() 및
- 물론 Integrate(), Derivative(). 적분 함수에 대한 참고 사항은 무한대를 지정하기 위해 빈(점)을 사용하는 것입니다.
테스트 사례의 결과는 로그 창에 기록되고 두 번째 코드 창에 표시됩니다.
최종 버전을 게시해야 합니다. 멋진 기능인 것 같습니다.
Names Default to Here(1);
//I think you meant you wanted a formula.
//The Jesper Function just finds the linear function, not the asymptotic linear function ... this code is a syntax example.
funList = {2*x+3, 2^x + 3, 2*sqrt(x)+1.2}; //test case for 3 formulas for x1=1 and x2=2, i.e. cntr=1.5, delta=0.5
Jesper = Function({form_xp, cntr, delta}, {x1, x2, y1, y2, m, b, err_xp, err, deriv },
x1 = cntr - delta;
x2 = cntr + delta;
y1 = Eval( Substitute(NameExpr(form_xp), Expr(x), x1 ));
y2 = Eval( Substitute(NameExpr(form_xp), Expr(x), x2 ));
m = (y2-y1)/(x2-x1) ;
b = y2 - m*x2;
lin_xp = Parse( EvalInsert( "^m^*x + ^b^"));
err_xp = Substitute(Expr((a)-(b)), Expr(a), NameExpr(form_xp), Expr(b), NameExpr(lin_xp) );
err_xp = SimplifyExpr(NameExpr(err_xp));
err = 1/(2*delta) * Eval ( Substitute( NameExpr(Integrate(_xp, x, _lo, _hi)), Expr(_xp), NameExpr(err_xp), Expr(_lo), x1, Expr(_hi), x2) );
deriv = Derivative(NameExpr(form_xp), x);
Eval List({err, NameExpr(form_xp), NameExpr(lin_xp), NameExpr(err_xp), NameExpr(deriv)});
);
for(i=1 ,i<=nitems(funlist), i++,
{err, func_xp, line_xp, err_xp, deriv_xp} =Jesper(funlist[i], 1.5, .5);
show(i, err, func_xp, line_xp, err_xp, deriv_xp);
write("\!N" ||Repeat("-", 80) );
);이 3가지 수식의 결과는 다음과 같습니다.
/*:
i = 1;
err = 0;
func_xp = 2 * x + 3;
line_xp = 2 * x + 3;
err_xp = 0;
deriv_xp = 2;
--------------------------------------------------------------------------------
i = 2;
err = -0.114609918222073;
func_xp = 2 ^ x + 3;
line_xp = 2 * x + 3;
err_xp = -2 * x + 2 ^ x;
deriv_xp = 2 ^ x * Log(2);
--------------------------------------------------------------------------------
i = 3;
err = 0.0236892706214399;
func_xp = 2 * Sqrt(x) + 1.2;
line_xp = 0.82842712474619 * x + 2.37157287525381;
err_xp = (-1.17157287525381) + -0.82842712474619 * x + 2 * Sqrt(x);
deriv_xp = 2 * (0.5 / Sqrt(x));
--------------------------------------------------------------------------------