Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数学函数的二进制搜索_C++_Stl_Binary Search_Numerical Methods - Fatal编程技术网

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