C++ 中的泰勒展开式:函数工厂?

Taylor expansion in C++: function factory?

在某些应用程序中,我需要访问某些多项式展开的元素(例如 x^i 对应 i = 0,1,...)。我的想法是创建一个像

这样的“功能工厂”
#include <functional>
#include <iostream>

std::function<double(double)> Taylor(unsigned int i)
{
    return [i](double y) {return std::pow(y, i);};
}

int main()
{   
    unsigned int n = 3; // the wanted degree in your polynomial basis
    auto f = Taylor(n);
    double a = f(3);
    std::cout << "a = " << a << std::endl;
    return 0;
}

在上面的示例中,我们将得到输出 a = 27

这在函数估计的上下文中很有用(即,粗略地找到给定数据的一些多项式展开的系数)。

有没有更好的方法来做到这一点?此外,如果多项式基础不仅仅是 x^i,而是更复杂的东西,则使用 lambda 函数可能是不合适的...

C++,早在 lambdas 被添加到它之前,就一直有一个解决方案: 只需使用 operator() 实现 class,以便实例成为可调用对象,即用作函数。我们称这样的对象为仿函数.

#include <iostream>
#include <memory>
#include <vector>
// Just an interface base class – not strictly necessary
class realmap {
public:
  virtual double operator()(double parameter) = 0;
  virtual ~operator();
};

class identity : public realmap {
  double operator()(double parameter) override { return parameter; }
};
class twice : public realmap {
  double operator()(double parameter) override { return 2 * parameter; }
};

class monomial : public realmap {
private:
  const unsigned int exponent;

public:
  monomial(unsigned int exponent) : exponent(exponent) {}
  double operator()(double parameter) override {
    double result = 1;
    for (unsigned int pot = 0; pot < exponent; ++pot) {
      result *= parameter;
    }
    return result;
  }
};

int main() {
  auto cube = monomial(3);
  std::cout << cube(1.3) << std::endl;
  std::vector<std::unique_ptr<realmap>> operations;
  operations.emplace_back(new twice());
  operations.emplace_back(new monomial(2));
  operations.emplace_back(new twice());
  operations.emplace_back(new monomial(3));
  double value = 3.141;
  for (auto &operation : operations) {
    value = (*operation)(value);
  }
  // now is [(3.141 * 2)²·2]³
  std::cout << value << std::endl;
}