C++ 数学函数的二进制搜索
我有一个递增的数学函数,例如C++ 数学函数的二进制搜索,c++,stl,binary-search,numerical-methods,C++,Stl,Binary Search,Numerical Methods,我有一个递增的数学函数,例如y=x+5*x^3+x^7+11*lnx,我想先找到(正)x,这样y(x)>=1478。 我可以使用stl中的二进制搜索算法来解决这个问题吗?问题是,stl算法(std::lower_bound可能是您选择的候选算法)可以处理集合。或者更具体地说:在集合的迭代器上。 解决问题的一种方法是使用适配器:编写一个“迭代器”,它只在解引用时返回函数值 这方面的代码可能相当大,因为您需要满足应用程序的所有需求。但是,您可以在函数上对其进行模板化。例如: template<
y=x+5*x^3+x^7+11*lnx
,我想先找到(正)x
,这样y(x)>=1478
。
我可以使用stl中的二进制搜索算法来解决这个问题吗?问题是,stl算法(
std::lower_bound
可能是您选择的候选算法)可以处理集合。或者更具体地说:在集合的迭代器上。
解决问题的一种方法是使用适配器:编写一个“迭代器”,它只在解引用时返回函数值
这方面的代码可能相当大,因为您需要满足应用程序的所有需求。但是,您可以在函数上对其进行模板化。例如:
template<class F>
FuncIterator{
typedef int ParamType;
typedef float ResultType; // Or better: result_of F
ParamType param_;
FuncIterator(ParamType param): param_(param){}
ResultType operator*(){ return F(param_); }
FuncIterator& operator+=(int diff){ param_ += diff; return *this; }
//... Other functions required for RandomAccessIterator
}
auto result = std::lower_bound(FuncIterator<MyFunc>(0), FuncIterator<MyFunc>(1000));
std::cout << "First x value is:" result.param_ << std::endl;
模板
函数迭代器{
typedef int参数类型;
typedef float ResultType;//或更好:F的结果
参数类型参数;
函数迭代器(ParamType param):param(param){}
ResultType运算符*(){return F(param)}
函数迭代器和运算符+=(int diff){param_+=diff;返回*this;}
//…RandomAccessIterator所需的其他函数
}
auto result=std::下限(FuncIterator(0),FuncIterator(1000));
是的,你可以。试一试。为什么不为
循环使用?@dasblinkenlight,我如何使用它?我可以自己写,但问题是关于stl的algorithms@Boiethios,是的,我可以使用for循环,但在stl库中它存在二进制搜索函数,我可以使用它吗?制作一个常量随机访问迭代器,假装在解引用时给您一个序列元素。迭代器的位置会给你答案。谢谢你的详细答案。所以从stI使用二进制搜索并不是一种简单的方法,手动编写二进制搜索将比制作适配器更容易,对吗?是的。二进制搜索指的是有序容器。为什么要这样做很可能更适合牛顿算法或类似算法:寻找函数的根。在您的例子中:y'(x)=y(x)-1478
,现在为y'(x)=0查找x