在 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::cos
takes its parameter by constant reference.
的复数形式
将您的第一个参数更改为此,std::cos
将匹配。
complex<double> (*f)(complex<double> const & x)
// ^^^^^^^
#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::cos
takes its parameter by constant reference.
将您的第一个参数更改为此,std::cos
将匹配。
complex<double> (*f)(complex<double> const & x)
// ^^^^^^^