将 2D 函数转换为 1D 函数



用于教育目的

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

//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)

我想将导数扩展到更高维度。拿一个加尔德。

// 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 值将 2D 函数变成 1D 函数。x 或 y 值固定在我们想要取梯度的点上。

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

PS-我知道使用图书馆会更容易,但我想自己学习这样做,因此具有教育意义。-谢谢

你应该使用 std::bind 来绑定固定参数。 这将生成一个部分应用的函数,您可以将剩余的参数传递到其中。

您的示例可能如下所示:

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

Lambda 来救援:

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

这将生成一个匿名可调用对象,该对象接受一个double并返回一个double。 (返回类型是从返回类型fn推导出来的)

lambda 的语法是[捕获列表](参数列表)可选->然后返回类型{代码}。 它创建一个不可命名类型的对象,当使用参数列表调用该对象时,该对象将运行代码并返回代码返回的任何内容。 它们非常有用。

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

因此,同一行上的后xVar因此与任何意义无关。 使用上面的lambda,我们将xVar绑定到函数对象的参数,然后将其转换为std::function<double(double)>

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

相关内容

  • 没有找到相关文章

最新更新