2016-06-28 206 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支配的多项式。

但是,似乎更好的方法是使用导数定义或更稳健的数值方法,然后像其他人所建议的那样使用简单的差异。