使用C语言中的极限定义计算导数

使用C语言中的极限定义计算导数,c,derivative,C,Derivative,我应该编写一个函数,使用公式(f(x+h)-f(x))/h来计算sin^2(x)/x+3的导数 我在网上读过很多例子,但都很复杂。我不太懂编码,我应该只通过做一个函数来计算这个导数。 例如 float deriv(float x,float h) 我们如何编写这个函数呢?我认为一个很好的方法是使用一个基于该定义计算导数的函数,以及一个实现该特定公式的函数 float deriv (float x, float h) { float dydx = (function(x+h) - f

我应该编写一个函数,使用公式
(f(x+h)-f(x))/h来计算sin^2(x)/x+3的导数

我在网上读过很多例子,但都很复杂。我不太懂编码,我应该只通过做一个函数来计算这个导数。

例如

float deriv(float x,float h)

我们如何编写这个函数呢?

我认为一个很好的方法是使用一个基于该定义计算导数的函数,以及一个实现该特定公式的函数

float deriv (float x, float h) {

     float dydx = (function(x+h) - function(x))/h;
     return dydx;
}

float function(float x) {
    // Implement your sin function here evaluated for the argument
}

请记住,导数的定义适用于as h->0,而要获得f'(x)则需要取消。我们这里有一个数值估计,这是一个美化的梯度方程。祝你好运

再加上@mcfisty,您可以让导数函数获取指向将要操作的函数的指针,从而使导数函数更加通用

double deriv(double x, double (*func)(double))
{
    const double h = 0.0001;
    return (func(x+h) - func(x)) / h;
}

注意,这是一个近似值。理想情况下,当h接近0时,我们会找到极限,但如果不知道
func
的定义,就不可能通过编程实现,我们希望尽可能保持导数的定义一般。

浮点数学的值是对数分布的
x+h
对于
x
的大值和小值来说都是毫无意义的-这并不是朝着“尽可能使导数的定义保持通用”迈出的好一步<代码>常数双h=x*0.0001更有意义,但边缘情况需要考虑。@chux如果我将其更改为0.001会怎么样?最好是0.001或0.01,考虑<代码> double f(double x){返回x;} < /Cord>然后<代码> DEVIVE(1E+,20,F)不正确地返回0而不是1。好的
h
取决于
x
。请参阅此处跳过了一个好的
h
的选择-它不是那么简单。因此,在一般情况下,这个问题仍然没有答案——但这似乎满足了OP的基本需求。