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;
}
在某些应用程序中,我需要访问某些多项式展开的元素(例如 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;
}