八度 - 圆函数的梯度绘制不正确
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
这就是您认为正在发生的事情。 (即结果函数实际上只需要一个 单个 输入,而不是 x
和 y
)。
因此,稍后当您使用两个输入调用 f1yfun
时,第二个输入(即 y
)将被简单地 静默丢弃 ,你实际上是在两个轴上计算 2*x
,因此是对角线箭头。
tl;dr 你对 quiver 的调用应该是:
quiver(xx, yy, f1xfun(xx), f1yfun(yy), 0.5);
问题
正在尝试关注 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
这就是您认为正在发生的事情。 (即结果函数实际上只需要一个 单个 输入,而不是 x
和 y
)。
因此,稍后当您使用两个输入调用 f1yfun
时,第二个输入(即 y
)将被简单地 静默丢弃 ,你实际上是在两个轴上计算 2*x
,因此是对角线箭头。
tl;dr 你对 quiver 的调用应该是:
quiver(xx, yy, f1xfun(xx), f1yfun(yy), 0.5);