【发布时间】:2011-04-29 21:36:51
【问题描述】:
我有以下代码(抱歉冗长):
double primeValue( const func1D &func,
const double lowerBound, const double upperBound,
const double pole )
{
// check bounds
if( lowerBound >= upperBound )
throw runtime_error( "lowerBound must be smaller than upperBound!" );
// C++0x way of writing: fullFunc(x) = func(x)/(x-a)
func1D fullFunc =
bind( divides<double>(), // division of
bind(func, _1), // f(x), with _1 = x
bind(minus<double>(), _1, pole) ); // by x-a, with _1 = x
// pole not in domain
if( pole<lowerBound || pole>upperBound)
{
cout << "Case 1" << endl;
return integrateSimpson( fullFunc, 1000, lowerBound, upperBound );
}
// pole closer to upper bound
else if( upperBound-pole < pole-lowerBound )
{
cout << "Case 2" << endl;
// C++0x way of writing g(x) := [f(x)-f(2a-x)]/(x-a)
func1D specialFirstFunc =
bind( std::divides<double>(), // division of
bind(minus<double>(), // numerator:
bind(func, _1), // f(x) minus
bind(func, bind(minus<double>(), 2.*pole, _1))), //f(2a-x)
bind(minus<double>(), _1, pole) ); // denominator: x-a
const double trickyPart = integrateSimpson( specialFirstFunc, 1000, pole+.000001, upperBound );
const double normalPart = integrateSimpson( fullFunc, 1000, lowerBound, 2.*pole-upperBound );
cout << "Tricky part: " << trickyPart << endl;
cout << "Normal part: " << normalPart << endl;
return trickyPart + normalPart;
}
else // pole closer to lower bound
{
cout << "Case 3" << endl;
// C++0x way of writing g(x) := [f(x)-f(2a-x)]/(x-a)
func1D specialFirstFunc =
bind( std::divides<double>(), // division of
bind(minus<double>(), // numerator:
bind(func, _1), // f(x) minus
bind(func, bind(minus<double>(), 2.*pole, _1))), //f(2a-x)
bind(minus<double>(), _1, pole) ); // denominator: x-a
const double trickyPart = integrateSimpson( specialFirstFunc, 1000, lowerBound, pole-.00001 );
const double normalPart = integrateSimpson( fullFunc, 1000, 2.*pole-lowerBound, upperBound );
cout << "Tricky part: " << trickyPart << endl;
cout << "Normal part: " << normalPart << endl;
return trickyPart + normalPart;
}
}
它使用复杂分析数学域中的主值概念对包含奇点(极点)的实轴上的函数进行积分。 bind 和 function 部分将原函数 f(x) 修改为
(f(x)-f(2*pole-x))/(x-a)
它甚至为我的简单测试用例功能提供了正确的结果。如果需要,我可以提供其他详细信息:
typedef std::function<double (double)> func1D;
double integrateSimpson( func1D, const size_t nSteps, const double lowerBound, const double upperBound);
后者使用简单的 Simpson 积分规则进行积分。可以提供代码,但与手头的问题不太相关。
这可以在 GCC 4.4+ 上正常编译(使用 4.4.5 和 4.5.2 预发行版进行测试,CFLAGS="-O2 -std=c++0x -pedantic -Wall -Wextra"),但会产生内部标头错误 (C2664 ) 在 MSVC 2010 上。(如果需要,我可以提供错误输出,我的代码完全没有引用(!))。
我在 MSVC 中发现错误了吗?
谢谢!
【问题讨论】:
-
"我在 MSVC 中发现错误了吗?" - 如果你这样做了,我不会感到惊讶。 :)
-
这可能是相关的:stackoverflow.com/questions/2425277/… 但我不明白接受的答案建议做什么......
标签: c++ visual-studio-2010 gcc c++11 functional-programming