2014-11-23 75 views
1

我試圖創建一個函數,它有兩個輸出參數: 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

回答

1

我想這是你想要做什麼:

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

1

這是因爲爭論進入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