2011-01-11 64 views
8

這應該很簡單。我有一個功能f(x),我想要評估f'(x)在MATLAB中的給定x如何在matlab中評估函數的導數?

我所有的搜索都提出了符號數學,這不是我所需要的,我需要數值分化。

E.g.如果我定義:fx = inline('x.^2')

我想找個說f'(3),這將是6,我不想找到2x

回答

7

爲了得到一個數值差(對稱差),你算算(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,然後評估函數的導數,而不是函數值。

+0

+1爲一個整潔的答案:) – posdef 2011-01-11 14:43:41

+0

我是對的,我認爲我選擇dx越小,我的答案就越準確。如果是的話,是否有一個非常小的實數的MATLAB常量?類似於pi的3.14 ...或者我爲sqrt(-1)? – lms 2011-01-11 16:15:22

+2

@codenoob:`eps`給你一個很小的數字。但是,對於大多數實際用途而言,0.0001就足夠了。另外,如果你使用多項式並使用`polyder`,則不必擔心`dx`的大小。 – Jonas 2011-01-11 16:29:43

4

你嘗試diff(計算差異和近似衍生物),gradient,或polyder (計算多項式的導數)函數?

您可以在MATLAB控制檯上使用help <commandname>或使用幫助菜單中的功能瀏覽器閱讀關於這些功能的更多信息。

+0

+1爲更快一點:) – Jonas 2011-01-11 14:44:34

0

對於解析形式給定的功能,可以在用下面的代碼的期望點評估衍生物:

syms x 
df = diff(x^2); 
df3 = subs(df, 'x', 3); 
fprintf('f''(3)=%f\n', df3); 

對於純數值衍生物使用由納斯和posdef已經給出的解決方案。

6

缺少符號工具箱,沒有什麼能阻止您使用Derivest這一自動自適應數值微分工具。

derivest(@sin,pi) 
ans = 
      -1 

對於你的例子它很好。事實上,它甚至提供了對所得近似值誤差的估計。

fx = inline('x.^2'); 
[fp,errest] = derivest(fx,3) 

fp = 
      6 
errest = 
    3.6308e-14 
9

如果你的函數被稱爲是二次可微,使用

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幾次,如果函數複雜,這​​可能會或不會是你想要的。

如果您打算在不同的點使用數值導數很多次,那麼構造一個切比雪夫逼近就會變得很有趣。