使用C程序是否可以找到函数的导数? 我正在使用Matlab,它有一个内置函数diff(),可用于查找函数的导数。
f(x)=x^2
有没有可能使用 c 找到上述函数的导数。算法是什么?
使用C程序是否可以找到函数的导数? 我正在使用Matlab,它有一个内置函数diff(),可用于查找函数的导数。
f(x)=x^2
有没有可能使用 c 找到上述函数的导数。算法是什么?
是的,这是完全有可能的。但是,解决方案取决于您的需求。如果您需要一个简单的数值解决方案,以下方法就可以(在一定程度上,带有某些限制-天真的实现):
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的源代码 - 尽管它是用Java编写的,但对于任何流利掌握类似C语言的人来说,它都很容易阅读。如果不是,请继续自己实现该算法 :)
对于简单的函数,以下数值微分方法效果相当好:
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.);
在C语言中没有内置的功能可以实现这一点。但是,如果您在网上搜索,可能会找到一些数值库来完成此任务,尽管我怀疑是否有任何可用的库可以提供符号导数。您可以考虑使用正向、反向和/或中央差分编写近似数值导数。
对于那些想要了解 f'(x) 数学原理的好奇心强的人,我们使用从极限中获得的导数标准定义,请参见:求导公式。
这里,h->0(h 趋近于 0)意味着 h 是一个非常小的数字。你可以将这个数字取为 10^-5 用于大多数计算。虽然两个方程都能完美地工作,但在实践中,第二个方程给出更好的值。然而,也应该注意到这些计算非常昂贵,当实际函数可以手动推导时应该避免使用。