我有以下匿名函數:衍生匿名函數的
f = @(x)x^2+2*x+1
我使用這個,讓我用它的方式如下:
f(0) = 1
但是如果我想找到這種功能的衍生物,同時仍然保持匿名功能?我試着做以下,但它不工作:
f1 = @(x)diff(f(x))
但這只是返回
[]
如何做到這一點有什麼想法?
當然,我可以手動執行此操作在3秒內,但是這不是問題的關鍵...
我有以下匿名函數:衍生匿名函數的
f = @(x)x^2+2*x+1
我使用這個,讓我用它的方式如下:
f(0) = 1
但是如果我想找到這種功能的衍生物,同時仍然保持匿名功能?我試着做以下,但它不工作:
f1 = @(x)diff(f(x))
但這只是返回
[]
如何做到這一點有什麼想法?
當然,我可以手動執行此操作在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;
有趣。我喜歡這個。謝謝你的時間! – codedude
按照[@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; –
如果你有象徵性的數學工具箱,你可以使用符號函數來實現所需要的如下:
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作爲答案。
@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
的[計算一個矢量的導數(
可能重複http://stackoverflow.com/questions/20613859/calculate一個矢量的衍生物) – horchler
@horchler它是相似的,但我沒有看到任何像加斯頓的答案,所以我會爭辯說支持它。 – codedude
不,我的答案中討論複雜步派生的部分是相同的。這和我在那裏提供的代碼更加靈活(矢量化並允許你傳入一個函數),複數階導數優於基本有限差分。 – horchler