尝试关注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
答案 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)
)
答案 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
这是你似乎认为正在发生的事情。 (即生成的函数实际上只接受 单 输入,而不是x
和y
。
因此,稍后当您使用两个输入调用f1yfun
时,第二个输入(即y
)只是 默默地丢弃 ,而您本质上是在两个轴上计算2*x
,因此是对角箭头。
<小时/> tl; dr 您对箭袋的调用应为:
quiver(xx, yy, f1xfun(xx), f1yfun(yy), 0.5);