2016-06-28 205 views
0

我想用matlab計算函數的一階導數。但是,我不知道函數的公式,我只能訪問它的輸入和輸出。 例如:matlab中的一階導數

f([1 2 3 4 5]) = [1 4 9 16 25]; %Square function for the example 

我不滿意的輸出:

diff([1 2 3 4 5]) %Which is [3 5 7 9] 

我看到的這個論壇,我不是唯一一個嘗試計算函數的一階導數MATLAB。但是,既然我不知道我的函數的數學公式,我不能使用符號數學工具箱。

所以我的問題是:

  • 我怎麼能只知道它的投入和產出計算的MATLAB函數的導數?
  • 我可以找到一種方法來檢索我的函數的數學公式,以便我可以使用符號數學工具箱?

謝謝你的幫助。

+2

爲什麼你不滿意'diff'?它有什麼具體問題? –

+0

@Luis它並沒有給你'[2,4,6,8,10]',這是'x^2'的派生詞:P –

+1

@JaneDoe在一個嚴肅的說明中:有一個應用數學領域叫做「數值分化」。如果你不知道底層的功能,你必須近似。谷歌與此關鍵字,看看你找到。 –

回答

3

假設您可以輕鬆地評估函數,這裏有一個簡單的方法來估計導數。 (假設函數表現很好)

x = 1:5 
h = 0.0001; 

dir_est= (f(x)-f(x+h))/h 

請注意,這與導數的定義非常相似。

+0

你也可以選擇(f(x + H)-f(XH))/(2 * H) –

0

爲了解決您所描述的問題,我將使用polyfitpolyval的組合與蠻力方法。像這樣的東西。

in = [1 2 3 4 5]; 
out = fun(in); % in this case, simply y = x.^2 
epsilon = 0.000001; 
test = inf; 
best = 0; 
% some large term count 
test = inf; 
best = 0; 
for n = 0:7 
    p = polyfit(in, out, n); 
    val = sqrt(sumsqr(polyval(p, in) - out)); 
    if ((val < test) & (abs(val - test) > epsilon)) 
     best = n; 
     test = val; 
    end 
end 
p = polyfit(in, out, best); 
syms x, f; 
expo = best:-1:0; 
f = p * (x.^expo).'; 

然後,您可以對變量f使用符號數學。對於您提供的示例,返回由x^2支配的多項式。

但是,似乎更好的方法是使用導數定義或更穩健的數值方法,然後像其他人所建議的那樣使用簡單的差異。