C++ 根查找时的括号算法。“中的单根”;二次;功能

C++ 根查找时的括号算法。“中的单根”;二次;功能,c++,algorithm,math,C++,Algorithm,Math,我正在尝试实现一个根查找算法。我正在使用混合牛顿-拉斐逊算法,该算法在数值公式中找到,效果非常好。但是我在括号里有个问题 在实现寻根算法时,我意识到在一些情况下,我的函数有一个实根和所有其他虚根(其中一些,通常是6或9)。我感兴趣的唯一根源是真实的,所以问题不在那里。问题是,这个函数像一个三次函数一样接近根,与y=0轴的点接触 Newton-Rapson方法需要一些不同符号的括号,而我发现的所有括号方法都不适用于这种特殊情况 我能做什么?在我的程序中找到根是非常重要的 编辑:更多问题:有时由于实

我正在尝试实现一个根查找算法。我正在使用混合牛顿-拉斐逊算法,该算法在数值公式中找到,效果非常好。但是我在括号里有个问题

在实现寻根算法时,我意识到在一些情况下,我的函数有一个实根和所有其他虚根(其中一些,通常是6或9)。我感兴趣的唯一根源是真实的,所以问题不在那里。问题是,这个函数像一个三次函数一样接近根,与y=0轴的点接触

Newton-Rapson方法需要一些不同符号的括号,而我发现的所有括号方法都不适用于这种特殊情况

我能做什么?在我的程序中找到根是非常重要的

编辑:更多问题:有时由于实际的小数值误差,比如说在某些值中的变化
1e-6
“立方”函数没有实数根,它只是虚的,有一个可忽略的虚部。。。(使用matlab进行检查)

编辑2:有关该问题的更多信息

好的,我需要根查找算法

我拥有的信息:

  • 我需要找到的根在[0-1]之间,如果该部分之外有更多根,我对它们不感兴趣
  • 根是真实的,可能有假想的根,但我不想要它们
  • 可能所有其余的根都是虚构的
  • 在这一点上,根可能是双倍的,但我认为这在数值分析问题中实际上并不重要
  • 在整个计算过程中,我需要多次使用寻根算法,但函数始终是多项式
  • 在寻根的一种特殊情况下,我的多项式将类似于一个二次函数,它用点接触Y=0。真实案例示例:
  • 该系数可能不是100%精确的,而真正轻微的不精确可能会使函数不接触Y=0轴
  • 我不能解决这个特殊的情况,因为在其他情况下,多项式可能是非常正常的,不会产生任何“奇怪”的东西
  • 我实际使用的方法是Newton-Raphson混合法,如果导数真的很小,它会进行二等分而不是NewRaph(在数值公式中找到)
Matlab对图像上函数的回答: 根:

该函数是我准备的一个真实示例,我知道我想要的答案是
0.5

注:
我还没有完全检查你们给我的一些答案(谢谢!),我只是想给所有我已经完成这个问题的信息。

假设你有一个一维多项式问题(我从假想解中假设),你可以使用Sturm序列来括括所有实根。参见。

使用牛顿·拉弗森是一种绝望行为。找到表示函数的连分数并进行计算会更好。CF将更快地收敛并生成真正的根。此外,由于CF生成两个整数的比率,您可以严格控制数值精度,不必担心舍入误差的累积和其他类似的拔毛问题

要找到任何多项式函数的实根,请参考David Rosen(1978)的“逼近所有实多项式根的连分式算法”

------------增编1-10月11日-----------------

好吧,你正在解决一个性别问题。你有几个选择。最简单的方法是结合使用泰勒近似(比如第三次)和哈雷方法。这比牛顿好得多,因为它具有三次收敛性,并且可以检测到假想解。缺点是您会遇到舍入问题,这可能会导致错误的答案

理想的选择是找到表示一元根的连分数,因为此CF可作为任何所需精度的整数比率进行计算,从而消除舍入问题

计算该CF的一种方法是通过Jacobi-Perron算法。见报纸亨迪和牛仔裤:。本文给出了通过CF近似计算三次和四次根的精确算法

请注意,如果六进制是可约的,那么它可以转换为四次和二次:。然后用Hendy论文中的算法求解四次方程


可以通过Rogers Ramunajan CF为sextic生成CF的一般解决方案。有关方法,请参阅以下文章:。这将为任何性别产生CF。

欢迎来到数值方法的奇妙世界。注意你的发际线;当你沮丧地拔出头发时,头发可能会开始退去

首先,使用数字根查找,如果你不能将问题括起来,你就完蛋了。牛顿·拉斐逊(Newton Raphson)很适合在你接近某个解时磨光它,而且它只在靠近根的导数远离零的情况下才起作用。你总是需要一些较慢的技术作为后援,因为牛顿·拉弗森可以把你送到“永不着陆”(也就是说,在括号外的某个地方)。如果你的函数不是多项式,首先要尝试的是Brent的方法。如果你的函数是多项式,试试拉盖尔方法或詹金斯-特劳布方法

顺便说一句,听起来你好像有病理问题。你不应该期望有特别好的表现。病理问题是病理性的

附录
如果你对看起来像根但不是根的东西有问题,你需要注意如何评估你的函数。若你们有一个多项式,形成多项式的每一项,按绝对值排序,然后将最小值和最大值相加。大多数情况下,这会产生更好的精度,但如果您的te较大,则会失败
0.853553390593276 + 0.353553390593278i
0.853553390593276 - 0.353553390593278i
0.146446609406726 + 0.353553390593273i
0.146446609406726 - 0.353553390593273i
0.499999999999996 + 0.000000040142134i
0.499999999999996 - 0.000000040142134i