Wolfram Computation Meets Knowledge

使用 ?NumericQ 改变运算次序

在使用 NIntegrateNMaximize 等数值函数时,运算次序非常重要。以下面一个名为 f 的函数为例:

f[a_] := NIntegrate[ (2 - a) Sin[a x], {x, 0, Pi}]

函数 f 看上去似乎是明确定义的,因为它能够运算数字值,如 f[0.5]。然而,如果给函数 f 提供的自变量是一个符号,而不是数值,则会出现问题:

f[a]
NIntegrate::inumr :  The integrand (2 - a) Sin[a x] has evaluated to non-numerical values for all sampling points in the region with boundaries {{0, Pi}}

由于 a 未定义,Wolfram 语言不能对表达式 (2 - a) Sin[a x] 进行关于 x 的数值式积分。对于任何函数 f[a],如果尚未对 a 进行赋值就运算此函数的话,都会出现该问题。例如,Wolfram 语言不能求函数 f 的数值式最大值,

NMaximize[f[a], a]
NIntegrate::inumr :  The integrand (2 - a) Sin[a x] has evaluated to non-numerical values for all sampling points in the region with boundaries {{0, Pi}}

运行该代码与单纯计算 f[a]所得到的错误信息相同。在这个例子中,f[a] 在完整的 NMaximize 语句之前被运算。

如要改变运算次序,可通过 NumericQ模式检验定义函数 f,使其只在得到数字数值时运算。将模式 ?NumericQ 追加到函数 f 的自变量之后:

Clear[f]
f[a_?NumericQ] := NIntegrate[ (2 - a) Sin[a x], {x, 0, Pi}]

现在,运算 f[a] 返回的是未运算的函数本身,而不是生成错误信息。Wolfram 语言可以得到新定义的 f 的数值最大值,因为模式 ?NumericQ 改变了运算次序:

NMaximize[f[a], a]
 {3.05716, {a -> 0.581569}}}

[English]

该文档是否有帮助?

任何建议?

非常感谢您的反馈!

提交

联系支持团队

从账单到产品激活,以及任何技术相关内容,无论您遇到任何问题,我们都在此为您提供帮助。

1-800-WOLFRAM (+1-217-398-0700 美国境外用户)

客服支持

周一至周五
8am–5pm 美国中部时区

  • 产品注册或激活
  • 预售信息和订单
  • 安装帮助和首次启动

高级技术支持 (面向特定用户)

周一至周四
8am–7pm 美国中部时区

周五
8:30–10am & 11am–5pm 美国中部时区

  • 优先技术支持
  • Wolfram 专家助理专员
  • Wolfram 语言编程帮助
  • 高级安装支持