這應該很簡單。我有一個功能f(x)
,我想要評估f'(x)
在MATLAB中的給定x
。如何在matlab中評估函數的導數?
我所有的搜索都提出了符號數學,這不是我所需要的,我需要數值分化。
E.g.如果我定義:fx = inline('x.^2')
我想找個說f'(3)
,這將是6
,我不想找到2x
這應該很簡單。我有一個功能f(x)
,我想要評估f'(x)
在MATLAB中的給定x
。如何在matlab中評估函數的導數?
我所有的搜索都提出了符號數學,這不是我所需要的,我需要數值分化。
E.g.如果我定義:fx = inline('x.^2')
我想找個說f'(3)
,這將是6
,我不想找到2x
爲了得到一個數值差(對稱差),你算算(f(x+dx)-f(x-dx))/(2*dx)
fx = @(x)x.^2;
fPrimeAt3 = (fx(3.1)-fx(2.9))/0.2;
或者,您可以創建函數值的矢量和應用DIFF,即
xValues = 2:0.1:4;
fValues = fx(xValues);
df = diff(fValues)./0.1;
注意diff
需要前向差異,並假設dx等於1.
但是,在你的情況下,您最好將fx
定義爲polynomial,然後評估函數的導數,而不是函數值。
你嘗試diff
(計算差異和近似衍生物),gradient
,或polyder
(計算多項式的導數)函數?
您可以在MATLAB控制檯上使用help <commandname>
或使用幫助菜單中的功能瀏覽器閱讀關於這些功能的更多信息。
+1爲更快一點:) – Jonas 2011-01-11 14:44:34
對於解析形式給定的功能,可以在用下面的代碼的期望點評估衍生物:
syms x
df = diff(x^2);
df3 = subs(df, 'x', 3);
fprintf('f''(3)=%f\n', df3);
對於純數值衍生物使用由納斯和posdef已經給出的解決方案。
缺少符號工具箱,沒有什麼能阻止您使用Derivest這一自動自適應數值微分工具。
derivest(@sin,pi)
ans =
-1
對於你的例子它很好。事實上,它甚至提供了對所得近似值誤差的估計。
fx = inline('x.^2');
[fp,errest] = derivest(fx,3)
fp =
6
errest =
3.6308e-14
如果你的函數被稱爲是二次可微,使用
f'(x) = (f(x + h) - f(x - h))/2h
這是二階h中準確。如果它只有一次可微分,請使用
f'(x) = (f(x + h) - f(x))/h (*)
這是h中的第一順序。
這是理論。實際上,事情非常棘手。由於分析比較簡單,我將採用第二個公式(一階)。做第二個練習。
第一個觀察結果是,你必須確保(x + h) - x = h,否則你會得到巨大的錯誤。事實上,f(x + h)和f(x)彼此接近(比如2.0456和2.0467),當你減去它們時,你會失去很多有意義的數字(這裏是0.0011,比x)。因此,h上的任何錯誤都可能對結果產生巨大影響。因此,第一步,修復一個候選人h(我會在一分鐘內告訴你如何選擇它),並將h'作爲你的計算量h'=(x + h)-x。如果您使用的是像C這樣的語言,則必須注意將h或x定義爲揮發性,以便不會優化該計算。
接下來,選擇h。 (*)中的錯誤包含兩部分:截斷錯誤和舍入錯誤。截斷誤差是因爲公式並不確切:
(f(x + h) - f(x))/h = f'(x) + e1(h)
e1(h) = h/2 * sup_{x in [0,h]} |f''(x)|
哪裏。
舍入誤差來自f(x + h)和f(x)彼此接近的事實。它可以大致被估計爲
e2(h) ~ epsilon_f |f(x)/h|
其中epsilon_f
是在F(X)(或F(X + h)時,其是接近)的計算的相對精度。這必須從您的問題進行評估。對於簡單的功能,epsilon_f
可以作爲機器epsilon。對於更復雜的,它可能比數量級更差。
所以你想要h
它最小化e1(h) + e2(h)
。一同插入一切,在h
優化產生
h ~ sqrt(2 * epsilon_f * f/f'')
這必須從你的函數進行估計。你可以做出粗略的估計。如有疑問,請參閱epsilon =機器精度的h〜sqrt(epsilon)。對於h的最優選擇,導數已知的相對準確度是sqrt(epsilon_f),即。一半有效數字是正確的。
總之:h =>舍入誤差太小,h =>截斷誤差太大。
對於第二階式中,相同的計算產量
h ~ (6 * epsilon_f/f''')^(1/3)
和(epsilon_f)^(2/3)爲衍生物的分數精度(其通常比第一個或兩個顯著附圖將更好地訂單公式,假設雙精度)。
如果這太不精確,隨意要求更多的方法,有很多技巧來獲得更好的準確性。理查森外推法對於平穩的功能來說是一個好的開始。但是這些方法通常計算f幾次,如果函數複雜,這可能會或不會是你想要的。
如果您打算在不同的點使用數值導數很多次,那麼構造一個切比雪夫逼近就會變得很有趣。
+1爲一個整潔的答案:) – posdef 2011-01-11 14:43:41
我是對的,我認爲我選擇dx越小,我的答案就越準確。如果是的話,是否有一個非常小的實數的MATLAB常量?類似於pi的3.14 ...或者我爲sqrt(-1)? – lms 2011-01-11 16:15:22
@codenoob:`eps`給你一個很小的數字。但是,對於大多數實際用途而言,0.0001就足夠了。另外,如果你使用多項式並使用`polyder`,則不必擔心`dx`的大小。 – Jonas 2011-01-11 16:29:43