在 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,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> 我得到之前提到的错误代码

也许我的算法有问题,如果你能突出显示我,我将不胜感激。

解决方法

integral 的第一个参数类型

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

错了。

std::cos takes its parameter by constant reference 的复杂形式。

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

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

这是因为 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>)>

,而不是追逐移动目标(确切的参数类型)