用作模块的参数

Fra*_*ner 2 wolfram-mathematica

如何使用数学函数作为模块参数

如:

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];
Run Code Online (Sandbox Code Playgroud)

Hig*_*ark 5

您是对的,该说法不正确。Mathematica将其评估为类似

x^2[x]
Run Code Online (Sandbox Code Playgroud)

当您拨打电话时PersonalPlot,用x to the power of 2 of x没有太多意义的词来评估。解决问题有多种方法。最简单的方法是完全放弃一个模块并定义:

PersonalPlot1[fun0_, var0_, min0_, max0_] := Plot[fun0, {var0, min0, max0}]
Run Code Online (Sandbox Code Playgroud)

您会这​​样称呼:

PersonalPlot1[x^2, x, 0, 3]
Run Code Online (Sandbox Code Playgroud)

请注意,这样的调用PersonalPlot1[x^2, y, 0, 3]会产生一个空图,因为传入的函数中的变量与第二个参数不同。继续阅读。

如果要定义一个以函数作为参数的模块,则这是一种实现方法:

PersonalPlot2[fun0_, var0_, min0_, max0_] := 
 Module[{fun = fun0, var = var0, min = min0, max = max0},
  Plot[fun[var], {var, min, max}]]
Run Code Online (Sandbox Code Playgroud)

你会这样称呼

PersonalPlot2[#^2 &, x, 0, 3]
Run Code Online (Sandbox Code Playgroud)

注意:

  • 传递给函数的函数是纯函数。如果您现在还不熟悉Mathematica的纯函数,那就是查阅文档相关部分的好时机。
  • 这明确告诉Plot命令在fun[var]指定范围内求值。
  • 局部变量不是严格必需的,因为函数是通过副作用起作用的,它会产生一个图,而不是操纵传递给它的参数(的副本)。您可以将其重写为:

    PersonalPlot2b[fun0_, var0_, min0_, max0_] := Module[{},
      Plot[fun0[var0], {var0, min0, max0}]]
    
    Run Code Online (Sandbox Code Playgroud)

另一种可能性是删除表示传递给函数的变量输入的参数PersonalPlot,如下所示:

PersonalPlot3[fun0_, min0_, max0_] := Module[{x},
  Plot[fun0[x], {x, min0, max0}]]
Run Code Online (Sandbox Code Playgroud)

你会这样称呼

PersonalPlot3[#^2 &, 0, 3]
Run Code Online (Sandbox Code Playgroud)

在此版本中,我对进行了x本地化,Module以避免与也称为的任何工作空间变量发生冲突x。这样可以避免由于对函数的参数使用不同的名称(纯函数没有参数名称)以及对PersonalPlot; 的第二个参数使用不同的名称而导致的错误。现在已被删除。

无论这些函数是否使用模块,可能还有其他几种有用的方式将参数传递给函数。

编辑

我认为,使用Mathematica一段时间的大多数人都不认为#^2&应该避免。如果您不喜欢它,则可以使用更明确的语法,如下所示:

fun1 = Function[x,x^2]
Run Code Online (Sandbox Code Playgroud)

然后您可以像这样通过

PersonalPlot[fun1,0.0,4.0]
Run Code Online (Sandbox Code Playgroud)

通过使用这种方法,您可以通过要求传入正确的类型来使函数的出错几率降低,就像这样

PersonalPlot[fun_Function, min_Real, max_Real] := ...
Run Code Online (Sandbox Code Playgroud)

但这完全取决于您。

我不知道怎么Plot做,我不得不去看文档。