作为模块的参数

时间:2013-01-16 15:21:51

标签: 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];

1 个答案:

答案 0 :(得分:4)

你是对的,那个陈述是不正确的。 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]这样的调用会产生一个空图,因为传入的函数中的变量与第二个参数不是同一个变量。请继续阅读。

如果你想定义一个以函数作为参数的模块,那么这是一种方法:

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本地Module,以避免与任何名为x的工作空间变量发生冲突。这避免了因为函数的参数使用不同的名称而导致的错误(纯函数没有参数名称)和PersonalPlot的第二个参数;现在已被删除。

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

修改

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

fun1 = Function[x,x^2]

你可以像这样传递

PersonalPlot[fun1,0.0,4.0]

通过使用这种方法,您可以通过要求传入正确的类型来使您的函数更容易出错,例如

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

但这完全取决于你。

我不知道Plot是怎么做到的,我不得不查看文档。