matlab中的一阶导数

时间:2016-06-28 13:48:26

标签: matlab diff derivative

我想用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 个答案:

答案 0 :(得分:3)

假设您可以轻松评估该功能,这是一种估算衍生物的简单方法。 (假设函数表现良好)

x = 1:5
h = 0.0001;

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

请注意,这与派生词的定义非常相似。

答案 1 :(得分: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支配的多项式。

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