MATLAB函数返回梯度

问题描述:

我试图创建一个函数,它有两个输出参数: 1.计算F(X)值 2.梯度MATLAB函数返回梯度

但它递归调用本身所有的时间。 我在做什么错?

function [y, gra] = f1(x) 
y = x^2 
syms z 
gra = gradient(f1(z)) 

谢谢。

编辑: 现在我有这样的:

function [y, gra] = f1(x) 
y = x^2 
if nargout == 2 
    syms x 
    gra = gradient(f1(x)) 
end 

编辑2:

我想使用的功能如下所示:

[y, grad] = f1(5); 
y_derived = grad(10); 
+0

你是如何使用这个功能?你能向我们展示一个如何运行它的例子吗? – David 2014-11-23 21:32:40

+0

是的,看编辑2 – vardump 2014-11-23 21:41:53

我想这是你想要做什么:

function [y, gra] = f1(x) 
[email protected](x) x^2; 

y=f(x); %// calculate y 

syms z %// initialise symbolic variable 
gra=gradient(f(z),z); %// symbolic differentiation 

这将返回g作为一个象征性的功能。要计算一个值,您可以使用subs(gra,z,123),或者,如果要多次评估它,请执行gradFunc=matlabFunction(gra),然后gradFunc(v),其中v是要评估的点的向量或矩阵。

+0

是的。这是有道理的。这是另一个经典案例,提供答案的人比OP更熟悉OP的要求和想要的内容。 – rayryeng 2014-11-23 23:10:52

这是因为争论进入gradient是你的函数名称f1(z)。因此,当您的原始函数也被称为f1时,它会一直呼叫f1,所以函数会一直调用自己,直到达到递归限制。

我想你的意思是把gradient(y)代替。尝试更换您的通话gradient使得它这样做的:

gra = gradient(y); 
+0

感谢您的快速回复!但我的问题是,我可以创建一个函数,该函数返回的梯度也作为一个函数,并且尚未评估? – vardump 2014-11-23 20:26:40

+0

@vardump - 在我这样做之前,我需要更多关于'f1'如何工作的细节。 “x”究竟是什么?我没有看到任何功能评估。你也应该提供'f'吗? – rayryeng 2014-11-23 20:28:28

+0

对于'f1',我有两个用例:1.调用'y = f1(5)'2.调用'[grad,grad] = y(0)',以获得梯度函数。后来我想打电话给'grad(123)'。查看编辑 – vardump 2014-11-23 20:36:14