将二维函数转换为一维函数

Convert 2D function to 1D function

用于教育目的

我有一个函数,它取给定输入函数的导数。

//In analysis class 
double analysis::differentiateBest(std::function<double(double)> fn, double x)
{
    return derivative_1_Richardson_6O(fn,  x);
}

我调用此函数的方式是使用 lambda 代替 std::function

analysis al;
std::cout << al.differentiateBest([](double x) { return x*x*x*x*x*x; }, 2)

我想将导数扩展到更高的维度。 ie.Take 一个花园。

// matrix<T> my class for holding matrices , implemented as 1D std::vector
matrix<double> analysis::gradient_2D(std::function<double(double, double)> fn,double x, double y)
{
    matrix<double> R(2, 1);

//DOUBT
    std::function<double(double xVar)> fnX = fn( xVar, y); //ERROR
    // creates a new fn which holds y constant and allows x to vary  

    std::function<double(double yVar)> fnY = fn( x, yVar); //ERROR
    // creates a new fn which holds x constant and allows y to vary 

    R(1, 1) = differentiateBest(fnX,x); // Takes derivative in X direction , holding y constant 
    R(1, 2) = differentiateBest(fnY,y);  // Takes derivative in Y direction , holding x constant 

return R; 
}

所以我称渐变的方式是

analysis al; 
matrix<double> R = al.gradient_2D([](double x,double y) { return x*x*x*y + y; }, 2 ,3) ; 
// Takes the gradient of lambda function at the point  2 , 3 

这就是我想做的。但是我在 VS 中的这一行出错

    std::function<double(double xVar)> fnX = fn( xVar, y); 
    std::function<double(double yVar)> fnY = fn( x, yVar);

我想通过固定 x 或 y 值将二维函数变成一维函数。 x 或 y 值固定在我们要采用梯度的点。

所以我的问题是如何将带 2 个变量的 std::function 转换为带单个变量的函数。

PS- 我知道使用图书馆会更容易,但我想自己学习,因此教育最重要。 - 谢谢

Lambda 来拯救:

std::function<double(double)> fnX =
 [fn,y](double xVar){
   return fn( xVar, y);
 };

这会生成一个匿名可调用对象,它需要一个 double 和 return 一个 double。 (return类型是从fn的return类型推导出来的)

lambda 的语法是 [ 捕获列表 ]( 参数列表 ) 可选 -> 然后 return 输入 { 代码}。它创建一个不可命名类型的对象,当使用参数列表调用时,运行代码和 returns 无论代码 returned。它们非常有用。

概念上的问题是 xVar 没有 在该行命名任何内容。 std::function<double(double xVar)> 那里的 xVar 已被丢弃,并且 "mean" 除了文档之外没有任何其他内容。

所以同一行后面的xVar也就没有任何意义了。使用上面的 lambda,我们将 xVar 绑定到函数对象的参数,然后可以将其转换为 std::function<double(double)>.

yVar 案例我留给提问者作为练习。

您应该使用std::bind绑定固定参数。这将产生一个部分应用的函数,您可以将剩余的参数传递给它。

您的示例应该类似于:

std::function<double(double)> fnX = std::bind(fn, std::placeholders::_1, y);