【发布时间】: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
我应该编写一个函数,使用公式(f(x+h)-f(x))/h 计算sin^2(x)/x+3 的导数。
我在 Internet 上阅读了很多示例,但它们都很复杂。我对编码不太了解,我应该只通过制作一个函数来计算这个导数。
例如。
float deriv(float x,float h)
这个函数怎么写?
【问题讨论】:
标签: c derivative
我认为一个很好的方法是使用一个根据该定义计算导数的函数,以及一个实现该特定公式的函数。
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 的基本需求。
添加到@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; 更有意义,但需要考虑边缘情况。
double f(double x) { return x; } 然后 deriv(1e+20, f) 错误地返回 0.0 而不是 1.0。一个好的h 取决于x。见Implementing the derivative in C