mathematica 与梯度矢量图

当用 mathematica 作梯度矢量图时发生了这样的事情.

看到有人出现了奇怪的情况, 然后我十分好奇, 情况大概是这样. 首先假设一函数为 , 在 mathematica 中使用如下代码

1
VectorPlot[Grad[x^2 + y^2, {x, y}], {x, -3, 3}, {y, -3, 3}]

运行结果中将无任何图像, 如图所示

运行结果

为找到问题所在, 先将梯度计算出再画图进行尝试

尝试结果

由此可见 VectorPlot 并无异常, 可能是 Grad 得到的结果不是我们期待的 .

对第一个代码进行追踪

追踪结果

可见其结果并不是我们所期待的那样. 为解决此问题对 Grad 使用 Evaluate

1
VectorPlot[Evaluate@Grad[x^2 + y^2, {x, y}], {x, -3, 3}, {y, -3, 3}]

这样一来就得到了所期待的结果 (如下图).

运行结果

mathematica 中对 Evaluate 的介绍

Evaluate[expr] causes expr to be evaluated even if it appears as the argument of a function whose attributes specify that it should be held unevaluated.

Details

You can use Evaluate to override HoldFirst etc. attributes of built-in functions.

Evaluate only overrides HoldFirst etc. attributes when it appears directly as the head of the function argument that would otherwise be held.

其实还是没有理解为什么 Grad 需要 Evaluate 对其进行计算, 为什么 Grad 在 Vector 内就没有计算到 , 不过查了一下Grad 的属性

Grad 属性

留个坑, 以后再说… ╥﹏╥


更新

经过他人指点, 这是由于它先计算了函数的值, 从而对一个常数函数微分, 所以只有 这一个值.

如此计算的原因是, Plot 系列函数的 HoldAll 属性控制了在最后一步才代入计算. 因而需要用 Evaluate 来控制计算顺序.