2014-03-04 43 views
0

我有以下匿名函數:衍生匿名函數的

f = @(x)x^2+2*x+1 

我使用這個,讓我用它的方式如下:

f(0) = 1 

但是如果我想找到這種功能的衍生物,同時仍然保持匿名功能?我試着做以下,但它不工作:

f1 = @(x)diff(f(x)) 

但這只是返回

[] 

如何做到這一點有什麼想法?

當然,我可以手動執行此操作在3秒內,但是這不是問題的關鍵...

+0

可能重複http://stackoverflow.com/questions/20613859/calculate一個矢量的衍生物) – horchler

+0

@horchler它是相似的,但我沒有看到任何像加斯頓的答案,所以我會爭辯說支持它。 – codedude

+2

不,我的答案中討論複雜步派生的部分是相同的。這和我在那裏提供的代碼更加靈活(矢量化並允許你傳入一個函數),複數階導數優於基本有限差分。 – horchler

回答

3

當你這樣做的diff n個元素的載體,它只是輸出與連續的差異n-1個元素的另一個向量..所以當你把1個元素的矢量,你會得到一個空的。

很長的路要走。將決定一個epsilon,並使用牛頓差商:

epsilon = 1e-10; 
f = @(x) x^2+2*x+1; 
f1 = @(x) (f(x+epsilon) - f(x))/epsilon; 

或只是做數學題,寫下公式:

f1 = @(x) 2*x+2; 

http://en.wikipedia.org/wiki/Numerical_differentiation

+0

有趣。我喜歡這個。謝謝你的時間! – codedude

+1

按照[@horchler](http://stackoverflow.com/users/2278029/horchler)在這個[重複問題]中的答案(http://stackoverflow.com/questions/20613859/calculate-the-derivative-of -a矢量) - 複合步長方法比牛頓差商有效幾個數量級。與[Cleve]相比(http://blogs.mathworks.com/cleve/2013/10/14/complex-step-differentiation/#487a1d22-7fe2-446e-a2a3-69ec283c2d97)。只需將該答案中的f1行更改爲:f1 = @(x)imag(f(x(:)+ 1i * espilon))/ epsilon; –

3

如果你有象徵性的數學工具箱,你可以使用符號函數來實現所需要的如下:

syms x 
myFun=x^2+2*x+1; 
f=symfun(myFun,x); 
f1=symfun(diff(f),x); 

%Check the values 
f(2) 
f1(2) 

你應該得到9和6作爲答案。

1

@jollypianoman這對我有用。其實你需要說的是,symfun必須使用eval命令進行評估,然後才能獲得匿名函數的所有功能。最好是閱讀下面的例子...

clear 
N0=1;N1=5; 
[email protected](t) N0+N1*sin(t); 
syms t 
Ndot=symfun(diff(N(t)),t); 
[email protected](t) eval(Ndot); 
Ndot_t(0) 

ans = 5 

Ndot_t(1) 

ans = 2.7015 

[tstop] = fsolve(Ndot_t,pi/3) 
tstop = 

    1.5708 

歡呼聲, AP

的[計算一個矢量的導數(