16

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

f(x)=x^2

是否可以使用 c 找到上述函数的导数。算法是什么?

4

5 回答 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 语言的人来说,它都相当容易阅读。如果没有,请继续自己实现该算法:)

于 2012-10-16T13:11:44.783 回答
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.);
于 2012-10-16T13:14:26.270 回答
2

C 语言中没有内置任何东西来实现这一点。如果您在线搜索,您也许可以找到一个数字库来执行此操作,尽管我怀疑是否有任何可用的东西可以提供符号导数。您可以考虑使用前向、后向和/或中心差异自己编码近似数值导数。

于 2012-10-16T13:02:40.280 回答
0

在 C 中,您可以相对容易地进行粗略的数值微分,但任何类型的符号微分都需要第三方框架或滚动您自己的框架。

C 是一种通用的低级编程语言,与 Matlab 不同,后者专门用于数学计算并具有用于符号计算的高级工具。

于 2012-10-16T13:12:21.813 回答
0

对于想要 f'(x) 背后数学的好奇窥视者,我们使用从极限获得的导数的标准定义,请参阅:导数公式。

这里,h->0(h趋于0)意味着h是一个非常小的数。对于大多数计算,您可以将此数字设为 10^-5。尽管这两个方程都运行良好,但在实践中,第二个给出了更好的值。然而,人们也可能注意到这些计算非常昂贵,当实际函数可以手动导出时应该避免。

于 2019-12-01T17:42:50.613 回答