八度 - 圆函数的渐变不能正确绘制

时间:2017-01-20 04:53:31

标签: octave

问题

尝试关注Gradients, Gradient Plots and Tangent Planes

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

请帮助理解错误。

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

预期

enter image description here

实际

enter image description here

2 个答案:

答案 0 :(得分:1)

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

df$t1perc <- ave(df$t1, df$day, df$hour, FUN = function(x) x/sum(x))
df$t2perc <- ave(df$t2, df$day, df$hour, FUN = function(x) x/sum(x))

然后给出(quiver(xx, yy, f1xfun(xx), f1yfun(yy), 0.5)

plot from GNU Octave

答案 1 :(得分:1)

执行时:

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

AS OPPOSED TO

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

这是你似乎认为正在发生的事情。 (即生成的函数实际上只接受 输入,而不是xy

因此,稍后当您使用两个输入调用f1yfun时,第二个输入(即y)只是 默默地丢弃 ,而您本质上是在两个轴上计算2*x,因此是对角箭头。

<小时/> tl; dr 您对箭袋的调用应为:

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