【问题标题】:First derivative in matlabmatlab中的一阶导数
【发布时间】:2016-10-30 21:21:23
【问题描述】:

我想用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 中计算函数的导数?
  • 我能否找到一种方法来检索我的函数的数学公式,以便我可以使用符号数学工具箱?

感谢您的帮助。

【问题讨论】:

  • 为什么对diff不满意?它有什么具体问题?
  • @Luis 它没有给你[2, 4, 6, 8, 10],它是x^2:P的派生词
  • @JaneDoe 严肃地说:有一个应用数学领域称为“数值微分”。如果您不知道基础功能,则必须进行近似。用这个关键字谷歌,看看你找到了什么。
  • 你可以做一个polyfit 然后区分它?
  • 您正在寻找有限差分近似:en.wikipedia.org/wiki/Finite_difference。还有一个巧妙的变体,它使用通常具有更高精度的复杂步长微分:blogs.mathworks.com/cleve/2013/10/14/…

标签: matlab diff derivative


【解决方案1】:

假设您可以轻松地评估函数,这里有一种不同的简单方法来估计导数。 (假设函数表现良好)

x = 1:5
h = 0.0001;

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

请注意,这与导数的定义非常相似。

【讨论】:

  • 你也可以选择(f(x+h)-f(x-h))/(2*h)
【解决方案2】:

为了解决您所描述的问题,我将结合使用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 为主的多项式。

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

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多