是否可以使用c程序找到函数的导数。我正在使用matlab,它有一个内置函数diff(),可用于查找函数的派生。
f(x)=x^2
是否可以使用c找到上述函数的导数。算法是什么?
答案 0 :(得分:17)
是的,很有可能。但是,解决方案取决于您的需求。如果你需要一个简单的数值解决方案,下面将会做(在某种程度上,有一些约束 - 天真的实现):
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.
但是,如果您需要在分析中找到给定函数派生的公式,那么您必须:
但是,你不需要做所有这些;有很棒的C数学库可以提供这样的功能。
编辑:经过一些谷歌搜索,我找不到一个。我能想到的最接近的解决方案是查看GeoGebra's source code - 虽然它是用Java编写的,但对于任何一个C语言流畅的人来说,它都相当容易阅读。如果没有,请继续自己实施该算法:)
答案 1 :(得分: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.);
答案 2 :(得分:2)
C语言中没有任何内置功能可以启用此功能。如果你在网上搜索,你或许可以找到一个数值库,虽然我怀疑有什么可以提供符号衍生物。您可以考虑使用前向,后向和/或中心差异自己编码近似数值导数。
答案 3 :(得分:0)
在C语言中,你可以比较容易地进行粗略的数值微分,但任何一种象征性的区分都需要第三方框架或自己动手。
C是一种通用和低级编程语言,与Matlab不同,后者专门用于数学计算,并具有用于符号计算的高级工具。
答案 4 :(得分:0)
我知道我已经迟到了,但我已经写了一个完全符合这一要求的图书馆。
它允许解析函数,生成函数树。 然后你甚至可以解决它或衍生它。
答案 5 :(得分:0)
对于想要在f'(x)之后进行数学运算的好奇的窥视者,我们使用从限制中获得的导数的标准定义,请参见:Formula for derivative.
在这里,h-> 0(h趋于0)表示h是一个非常小的数字。对于大多数计算,您可以将此数字设为10 ^ -5。尽管两个方程均能很好地工作,但实际上,第二个方程给出了更好的值。但是,可能还会注意到,这些计算非常昂贵,并且当可以手动得出实际函数时应避免使用。