C - 如何编写一个函数,返回真实有价值函数的导数,而不是导数的值
C++ -- How write a function, that return the derivative of a real valued function, not the value of the derivative
此函数计算x
处函数foo的派生值double Deriv( double(* Foo)(double x), double X )
{
const double mtDx = 1.0e-6;
double x1 = Foo(X+mtDx);
double x0 = Foo(X);
return ( x1 - x0 ) / mtDx;
}
我想编写一个funktion,它不是返回x处的派生值,而是一个新函数,这是函数foo的推导。
xxxx Deriv( double(* Foo)(double x) )
{
return Derivation of Foo;
}
那么可以写secondderiv = deriv(deriv(foo((
根据新标准在C 中可以编写这样的功能吗?我认为,使用旧标准是不可能的。
一旦您可以在某个点计算函数的值,就可以使用它来实现一般函数。lambda表达式允许您轻松地生成这些派生功能:
auto MakeDerivative(double (&f)(double)) {
return [=](double x) { return Deriv(f, x); };
}
如果您想能够使用状态功能,则可能需要更新您的Deriv
作为一个功能模板,其第一个参数类型是模板参数。如果您想重复应用MakeDerivative
(由于其返回类型是状态关闭(,这是正确的:
template <typename F>
double Deriv(F f, double x) {
// your code here
}
template <typename F>
auto MakeDerivative(F f) {
return [=](double x) { return Deriv(f, x); };
}
但是,您可能对"自动分化"之类的技术感兴趣,这些技术使您可以直接根据原始功能的定义来表达衍生物,这是以在扩大域(本质上是无限的邻里(工作为代价的。。
这是一种方法。
#include <iostream>
#include <functional>
std::function<double(double)> Deriv( double(*Foo)(double x) )
{
auto f = [Foo](double x) -> double
{
const double mtDx = 1.0e-6;
double x1 = Foo(x+mtDx);
double x0 = Foo(x);
return ( x1 - x0 ) / mtDx;
};
return f;
}
double Foo(double x)
{
return x*x;
}
double Bar(double x)
{
return x*x*x;
}
int main()
{
std::cout << Deriv(Foo)(10) << std::endl;
std::cout << Deriv(Bar)(10) << std::endl;
}
输出:
20
300
使用通用lambda,实现玩具derivative
很简单。在以下代码中,derivative
是数学意义上的导数操作员。它接受函数double -> double
,产生其衍生 double -> double
。
#include <iostream>
double delta = 0.001;
auto derivative = [] ( auto foo ) {
return [foo] (double x) {
// the simplest formula for numeric derivative
return (foo(x + delta) - foo(x)) / delta;
};
};
// test
int main() {
auto quar = [] ( double x ) { return x * x; };
auto dev_quar = derivative(quar);
auto dev_dev_quar = derivative(dev_quar);
for ( double s = 0.0; s < 10.0; ++s ) {
std::cout << "(" << quar(s) << "," << dev_quar(s) << "," << dev_dev_quar(s) << ")n";
}
}
相关文章:
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 正在为Xtensa simcall函数编写回调函数
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 如何用C++编写BFS函数
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何编写带有异常的构造函数
- 如何编写一个完美的缩写函数模板?
- 如何编写已继承的大纲构造函数?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 如何在大函数中编写多线程函数?
- 如何使用模板函数参数编写包装函数,该功能可以采用超载的成员函数
- c++类成员函数:如何编写这些函数
- 如何在我的 babysort 函数中编写最终的内部循环
- Javascript生成器函数——用C++编写
- 在函数外部编写代码
- 如何仅为函数指针编写正确的构造函数
- 何时应在非成员函数之前编写关键字 'static'?