八度 - 圆函数的梯度绘制不正确

Octave - gradients of a circle function do not plot correctly

问题

正在尝试关注 Gradients, Gradient Plots and Tangent Planes

(X^2 + Y^2) 的梯度向量在 Windows 上的 Octave 4.2.0 中没有正确显示。使用代码,预期圆的梯度从中心向外发散。然而实际是对角线的。

请协助了解问题所在。

syms x y
f1 = x^2 + y^2; 
gradf1 = jacobian(f1,[x,y]);

f1fun  = function_handle(f1);
f1xfun = function_handle(gradf1(1));
f1yfun = function_handle(gradf1(2));

[xx, yy] = meshgrid(-1:.1:1,-1:.1:1);

hold on

contour(xx, yy, f1fun(xx, yy), 10)
quiver(xx, yy, f1xfun(xx, yy), f1yfun(xx, yy), 0.5)
axis equal tight

hold off

预计

实际

我认为你的代码中有一个错误,对 quiver 的调用应该是

quiver(xx, yy, f1xfun(xx), f1yfun(yy), 0.5)

然后给出(colormap("jet")

当你执行:

f1xfun = function_handle(gradf1(1));
f1yfun = function_handle(gradf1(2));

输出为:

f1xfun = 
  @(x) 2 * x        % note: single-argument function
f1yfun =
  @(y) 2 * y        % note: single-argument function

反对

f1xfun = 
  @(x,y) 2 * x      % two-argument function
f1yfun = 
  @(x,y) 2 * y      % two-argument function

这就是您认为正在发生的事情。 (即结果函数实际上只需要一个 单个 输入,而不是 xy)。

因此,稍后当您使用两个输入调用 f1yfun 时,第二个输入(即 y)将被简单地 静默丢弃 ,你实际上是在两个轴上计算 2*x,因此是对角线箭头。


tl;dr 你对 quiver 的调用应该是:

quiver(xx, yy, f1xfun(xx), f1yfun(yy), 0.5);