別の関数を引数として取る関数の定義やあ
別の関数の領域で線形性を仮定した場合の誤差を計算する関数を定義しようとしています。
私の関数は次のことを行う必要があります。
- 非線形関数 (できれば他の場所で定義された関数名 f(x))、領域の中心 (xi)、および調査対象の領域の半幅 (delta) の 3 つの入力を受け入れます。
- xi、Lin(x) の漸近線形関数の傾きと切片を生成します。
- 定義により、誤差関数 err(x) = Lin(x) - f(x)、err(xi) = 0 を生成します。
- err(x) を xi-delta から xi+delta まで積分し、2*delta で割って、領域内の平均誤差を求めます。
- 平均誤差を使用して、領域内の誤差の標準偏差を計算します (積分も必要になります)。
これを実行しようとすると、次の 3 つの問題に遭遇します。
- 別の関数を入力として受け入れるために、jsl の Function-function を取得するにはどうすればよいですか?
- Derivative(f(x),x) など、関数名で指定された関数の引数を区別するための Derivative 関数を取得するにはどうすればよいですか?
- 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: 別の関数を引数として取る関数の定義参考までにブロガーのメモ
JMP 14 には、便利なメッセージを備えたカスタム関数と呼ばれる新しいオブジェクトがあります。 機能拡張として 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 機能は私の問題の 1 つを解決しました。
たぶん私はあなたのコードのすべてを理解しているわけではありませんが、名前付き関数の派生を与える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 以降には、integrate() 関数とシンボリック Derivative() 関数の両方があります。
例を添付します。 単純な線形だけの漸近線形公式は作成されません。 ただし、このスクリプトの目的は構文をデモすることです。シンボリック式を参照するには、式である必要があります。スクリプト作成インデックスでは、以下を検索する必要があります。
- Substitute()、NameExpr、EvalInsert()、Parse()、Simplify() 、および
- もちろん、Integrate()、Derivative()。 積分関数では、無限を指定するには空 (ドット) を使用することに注意してください。
テスト ケースの結果はログ ウィンドウに書き込まれ、2 番目のコード ウィンドウに表示されます。
最終バージョンを投稿する必要があります。 素晴らしい機能のようです。
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));
--------------------------------------------------------------------------------