使用 ?NumericQ 改变运算次序
在使用 NIntegrate 或 NMaximize 等数值函数时,运算次序非常重要。以下面一个名为 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 语言编程帮助
- 高级安装支持