在 C++ 中使用梯形规则进行复杂函数集成

Complex function integration using trapezoidal rule in C++

#include <complex>  
complex<double> integral(complex<double> (*f)(complex<double> x), complex<double> l, complex<double> u, size_t n) {
   complex<double> step = (u - l) / (double)n;
   complex<double> area(0, 0);
   for (size_t i = 0; i < n; i++) {
      complex<double> inner = l + (i + 0.5) * step;
      area = area + f(inner) / inner * step;
   }
   return area;
}
int main() {
   cout << integral(cos, 0, 2, 100);
   return 0;
}

错误

main.cpp:35:13: error: no matching function for call to 'integral'
main.cpp:24:17: note: candidate function not viable: no overload of 'cos' matching 'complex<double> (*)(complex<double>)' for 1st argument

我想用梯形法积分复杂函数。

上下界也是复数。

如果我只使用 double(我将每个 complex<double> 替换为 double)它正在工作我得到了正确的解决方案,但是如果我使用 complex<double> 我获取前面提到的错误代码。

可能是我的算法有问题,请高手指点一下。

这是因为 std::cos 的复杂重载通过引用获取它们的参数。这使得它们与具有按值参数的函数指针类型不兼容。

template< class T >
complex<T> cos( const complex<T>& z );

https://en.cppreference.com/w/cpp/numeric/complex/cos

与其追逐一个移动的目标(确切的参数类型),我建议使用抽象,例如 std::function<complex<double> (complex<double>)>

integral的第一个参数类型

complex<double> (*f)(complex<double> x)

错了。

std::costakes its parameter by constant reference.

的复数形式

将您的第一个参数更改为此,std::cos 将匹配。

complex<double> (*f)(complex<double> const & x)
//                                   ^^^^^^^