【问题标题】:How to find derivative of a function using c如何使用c求函数的导数
【发布时间】:2012-10-16 13:01:28
【问题描述】:

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

f(x)=x^2

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

【问题讨论】:

  • 如果你想要一个语言环境衍生品,你可以使用限制,并得到一个很好的近似值。
  • 事实上的标准参考:nr.com
  • 您想要符号解还是解析解? @H2CO3 的解决方案将提供解析解决方案(即:离散微分)。如果您想要一个符号答案(即:f'(x)=2x),那么您需要编写一个更复杂的解析器。

标签: c derivative


【解决方案1】:

是的,很有可能。但是,解决方案取决于您的需求。如果您需要一个简单的数值解决方案,则可以使用以下方法(在一定程度上,有一些限制 - 幼稚的实现):

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's source code - 尽管它是用 Java 编写的,但对于任何足够流利的类 C 语言的人来说,它都很容易阅读。如果没有,请继续自己实现该算法:)

【讨论】:

  • “我找不到”——嗯,有 Matlab (stackoverflow.com/questions/1513583/…) ;-)
  • @SteveJessop 是为了检查它如何完成分析推导而开源的吗?
  • (@SteveJessop 我希望你没有认真相信我不知道 MatLab 的存在。)
  • 我只是想强调 Matlab 可以(通过一些努力)代替您正在寻找但没有找到的 C 库。从某种意义上说,任何带有 C 绑定的东西都是 C 库。 ;-) 只是因为 Matlab 是提问者的起点,也可能是他的终点。 Matlab 不是开源的,但搜索“matlab Alternative”提供了一些候选者。
【解决方案2】:

对于简单的函数,以下数值微分效果很好:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

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