【问题标题】:Octave: Compute Gradient of a Multi-Dimensional Function at a particaular pointOctave:计算多维函数在特定点的梯度
【发布时间】:2012-10-30 10:25:01
【问题描述】:

我一直在尝试使用以下代码来查找函数在输入为向量且函数返回标量的特定点处的梯度。

以下是我尝试计算梯度的函数。

%fun.m    
function [result] = fun(x, y)
     result = x^2 + y^2;

这就是我所说的渐变。

f = @(x, y)fun(x, y);
grad = gradient(f, [1 2])

但我收到以下错误

octave:23> gradient(f, [1 2])
error: `y' undefined near line 22 column 22
error: evaluating argument list element number 2
error: called from:
error:    at line -1, column -1
error:   /usr/share/octave/3.6.2/m/general/gradient.m at line 213, column 11
error:   /usr/share/octave/3.6.2/m/general/gradient.m at line 77, column 38

我该如何解决这个错误?

【问题讨论】:

  • f = %(x, y)fun(x, y);% 应该是@,不是吗?
  • 是的,抱歉,应该是@。已进行编辑。
  • 你不行吗:f = @(x,y) [x^2 + y^2]; grad = gradient(f(1, 2))
  • @zeffii,我想这会给出0 向量(常数的导数)。

标签: gradient octave function-handle


【解决方案1】:

我的猜测是 gradient 不能在 2D 函数句柄上工作,因此我做了这个。考虑以下 lambda-flavoring 解决方案:

fz 成为你的某个函数的函数句柄

fz = @(x,y)foo(x,y);

然后考虑这段代码

%% definition part:
only_x = @(f,yv) @(x) f(x,yv);  %lambda-like stuff, 
only_y = @(f,xv) @(y) f(xv,y);  %only_x(f,yv) and only_y(f,xv) are
                                %themselves function handles

%Here you are:
gradient2 =@(f,x,y) [gradient(only_x(f,y),x),gradient(only_y(f,x),y)];  

你用作什么

gradient2(fz,x,y);   

最后做个小测试:

fz = @(x,y) x.^2+y.^2
gradient2(f,1,2);

结果

octave:17> gradient2(fz,1,2)
ans =

    2   4

【讨论】:

  • 信息丰富的答案,我才刚刚开始使用 Octave。喜欢所有这些矢量化的东西:)
  • @zeffii,确实这更像是 lambda(函数式编程)的东西。但是你也可以做很多矢量化;)。
  • 感谢您的回答。我知道我们可以编写一个单独的脚本来计算梯度。但考虑到 Octave 被认为是 MATLAB 的开源替代品这一事实,我希望应该有一种内置的方法来计算多维的 Gradient。
  • @Karthik; W:如果没有额外的工具箱(优化),你如何使用 matlab 实现这一点?
  • @Acorbe:我只是假设 MATLAB 内置了这个功能。如果没有,MATLAB 和 Octave 都需要认真考虑添加此功能。
猜你喜欢
  • 2021-11-30
  • 1970-01-01
  • 2018-05-16
  • 2016-07-01
  • 2021-02-22
  • 2012-07-18
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
相关资源
最近更新 更多