2

モジュールパラメータとして数学関数を使用するにはどうすればよいですか

そのような:

PersonalPlot[fun0_, var0_, min0_, max0_] :=
 Module[{fun = fun0, var = var0 , min = min0, max = max0},

   (*this is incorrect*)
   fun = fun[var_];

   Plot[fun, {var, min, max}]
 ]

PersonalPlot[x^2,x,0,3];
4

1 に答える 1

5

そうです、その発言は正しくありません。Mathematica はそれを次のように評価します

x^2[x]

あなたが電話をかけPersonalPlotて、それが評価されたとき、まあ、あまりx to the power of 2 of x意味をなさない言葉で。問題を回避する方法はいくつかあります。最も簡単なのは、モジュールを完全に省いて次のように定義することです。

PersonalPlot1[fun0_, var0_, min0_, max0_] := Plot[fun0, {var0, min0, max0}]

次のように呼び出します。

PersonalPlot1[x^2, x, 0, 3]

このような呼び出しはPersonalPlot1[x^2, y, 0, 3]、渡された関数の変数が 2 番目の引数と同じ変数ではないため、空のプロットを生成することに注意してください。読む。

関数を引数として取るモジュールを定義したい場合、これはそれを行う1つの方法です:

PersonalPlot2[fun0_, var0_, min0_, max0_] := 
 Module[{fun = fun0, var = var0, min = min0, max = max0},
  Plot[fun[var], {var, min, max}]]

あなたはこのように呼ぶでしょう

PersonalPlot2[#^2 &, x, 0, 3]

ノート:

  • 関数に渡された関数は純粋な関数です。Mathematica の純関数にまだ慣れていない場合は、この時点でドキュメントの関連部分を参照してください。
  • Plotこれにより、指定した範囲で評価するようにコマンドに明示的に指示されfun[var]ます。
  • 関数は副作用によって機能し、渡された引数を操作 (コピー) するのではなくプロットを生成するため、ローカル変数は厳密には必要ありません。これを次のように簡単に書き換えることができます。

    PersonalPlot2b[fun0_, var0_, min0_, max0_] := Module[{},
      Plot[fun0[var0], {var0, min0, max0}]]
    

PersonalPlot別の可能性は、次のように、 に渡される関数への変数入力を表す引数を削除することです。

PersonalPlot3[fun0_, min0_, max0_] := Module[{x},
  Plot[fun0[x], {x, min0, max0}]]

あなたはこのように呼ぶでしょう

PersonalPlot3[#^2 &, 0, 3]

このバージョンでは、と呼ばれるワークスペース変数との衝突を避けるためxに、 に対してローカルにしました。これにより、関数の引数 (純粋な関数には引数名がありません) と の 2 番目の引数に異なる名前を使用することによるエラーが回避されます。それは今落とされました。ModulexPersonalPlot

それらの関数がモジュールを使用するかどうかにかかわらず、関数に引数を渡す便利な方法がおそらく他にもいくつかあります。

編集

#^2&しばらく Mathematica を使ってきた私たちのほとんどは,Mathematicaを避けるべきものとは考えていないと思います.気に入らない場合は、次のようなより明示的な構文を使用できます。

fun1 = Function[x,x^2]

その後、このように渡すことができます

PersonalPlot[fun1,0.0,4.0]

このアプローチを使用すると、次のように正しい型を渡す必要があるため、関数のエラーが発生しにくくなります。

PersonalPlot[fun_Function, min_Real, max_Real] := ...

しかし、それは本当にあなた次第です。

頭のてっぺんから、それがどのようにPlot機能するのかわかりません。ドキュメントを調べる必要があります。

于 2013-01-16T15:56:27.597 に答える