如何使用c语言找到函数的导数

17

使用C程序是否可以找到函数的导数? 我正在使用Matlab,它有一个内置函数diff(),可用于查找函数的导数。

f(x)=x^2

有没有可能使用 c 找到上述函数的导数。算法是什么?


如果您需要一个本地派生版本,可以使用限制并获得良好的近似值。 - elyashiv
事实上的标准参考资料:http://www.nr.com/ - alk
你想要一个符号解还是分析解?@H2CO3的解决方案将提供一个分析解(即:离散微分)。如果你想要一个符号答案(即:f'(x)=2x),那么你需要编写一个解析器,这更加复杂。 - Cloud
对于那些想了解f'(x)数学原理的好奇者,我们使用从极限中获得的导数标准定义见:导数公式 这里,h->0 (h趋近于0)意味着h是一个非常小的数字。你可以将这个数字取为10^-5用于大多数计算。虽然两个方程都能完美地工作,但在实践中,第二个方程提供更好的值。然而,也可以注意到这些计算非常昂贵,应该在实际函数可以手动推导时避免。 - Farhan Hai Khan
5个回答

22

是的,这是完全有可能的。但是,解决方案取决于您的需求。如果您需要一个简单的数值解决方案,以下方法就可以(在一定程度上,带有某些限制-天真的实现):

double derive(double (*f)(double), double x0)
{
    const double delta = 1.0e-6; // or similar
    double x1 = x0 - delta;
    double x2 = x0 + delta;
    double y1 = f(x1);
    double y2 = f(x2);
    return (y2 - y1) / (x2 - x1);
}

// call it as follows:
#include <math.h>

double der = derive(sin, 0.0);
printf("%lf\n", der); // should be around 1.0

如果您需要进行更高级的数值计算,可以使用GNU Scientific Library

但是,如果您需要分析地找到给定函数的导数公式,则必须执行以下操作:

  1. 将输入公式解析为某种抽象数据类型,例如AST;
  2. 使用导数的恒等式和规则对其进行求导(只有几个,这部分应该是最容易的),
  3. 将作为导出过程结果的抽象数据类型序列化为字符串,并将其输出为结果。

但是,您不需要做所有这些事情;有很棒的C数学库提供此类功能。

编辑:经过一些谷歌搜索,我找不到一个。我能想到的最接近的解决方案是查看GeoGebra的源代码 - 尽管它是用Java编写的,但对于任何流利掌握类似C语言的人来说,它都很容易阅读。如果不是,请继续自己实现该算法 :)


我找不到一个 -- 嗯,有Matlab (https://dev59.com/RXI_5IYBdhLWcg3wJPZu) ;-) - Steve Jessop
@SteveJessop 它是开源的,以便检查它如何实现分析推导? - user529758
@SteveJessop,我希望你没有认真相信我不知道MatLab的存在。 - user529758
1
我只是想强调一下,Matlab可以(需要一些努力)代替你正在寻找但未找到的C库。从某种意义上说,任何具有C绑定的东西都是一个C库。 “;-)”只是因为提问者从Matlab开始,并且可能会以此结束。 Matlab不是开源的,但搜索“matlab替代品”可以提供一些候选项。 - Steve Jessop

3

对于简单的函数,以下数值微分方法效果相当好:

typedef double (*TFunc)(double);

// general approximation of derivative using central difference
double diff(TFunc f, double x, double dx=1e-10)
{
  double dy = f(x+dx)-f(x-dx);
  return dy/(2.*dx);
}

// more or less arbitrary function from double to double:
double f(double x)
{
   return x*x;
}

// and here is how you get the derivative of f at specified location
double fp = diff(f, 5.);

3

在C语言中没有内置的功能可以实现这一点。但是,如果您在网上搜索,可能会找到一些数值库来完成此任务,尽管我怀疑是否有任何可用的库可以提供符号导数。您可以考虑使用正向、反向和/或中央差分编写近似数值导数。


0

对于那些想要了解 f'(x) 数学原理的好奇心强的人,我们使用从极限中获得的导数标准定义,请参见:求导公式。

这里,h->0(h 趋近于 0)意味着 h 是一个非常小的数字。你可以将这个数字取为 10^-5 用于大多数计算。虽然两个方程都能完美地工作,但在实践中,第二个方程给出更好的值。然而,也应该注意到这些计算非常昂贵,当实际函数可以手动推导时应该避免使用。


0
在C语言中,相对容易进行粗略的数值微分,但任何形式的符号微分都需要第三方框架或自己编写代码实现。
C是一种通用且低级别的编程语言,不像Matlab那样专门用于数学计算,并具有符号计算的高级工具。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接