【问题标题】:Calculate derivative using limit definition in C使用 C 中的极限定义计算导数
【发布时间】:2018-12-03 22:29:05
【问题描述】:

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

我在 Internet 上阅读了很多示例,但它们都很复杂。我对编码不太了解,我应该只通过制作一个函数来计算这个导数。

例如。

float deriv(float x,float h)

这个函数怎么写?

【问题讨论】:

    标签: c derivative


    【解决方案1】:

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

    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
    }
    

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

    【讨论】:

    • 这里跳过了选择一个好的h - 这不是那么简单。因此,在一般情况下,这个问题仍然没有得到解决——但这似乎满足了 OP 的基本需求。
    【解决方案2】:

    添加到@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 的大小值毫无意义——这不是朝着“尽可能保持导数的定义通用”迈出的良好一步。 const double h = x*0.0001; 更有意义,但需要考虑边缘情况。
    • @chux 如果我将其更改为 0.001 会怎样?是不是更好
    • 作为 0.001 或 0.01,考虑 double f(double x) { return x; } 然后 deriv(1e+20, f) 错误地返回 0.0 而不是 1.0。一个好的h 取决于x。见Implementing the derivative in C
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多