问题描述
我正在尝试实现健壮/稳定的拉盖尔方法。我的代码适用于大多数多项式,但很少有人“失败”。分别我不知道如何正确处理“角落”情况。 以下代码尝试查找单个根(F64 - 64 位浮点数,C64 - 64 位复数):
private static C64 GetSingle( C64 guess,int degree,C64 [] coeffs )
{
var i = 0;
var x = guess;
var n = (F64) degree;
while( true )
{
++Iters;
var v0 = polyUtils.Evaluate( x,coeffs,degree );
if( v0.Abs() <= ACCURACY )
break;
var v1 = polyUtils.EvaluateDeriv1( x,degree );
var v2 = polyUtils.EvaluateDeriv2( x,degree );
var g = v1 / v0;
var gg = g * g;
var h = gg - ( v2 / v0 );
var f = C64.Sqrt(( n - 1.0 ) * ( n * h - gg ));
var d0 = g - f;
var d1 = g + f;
var dx = d0.Abs() >= d1.Abs() ? ( n / d0 ) : ( n / d1 );
x -= dx;
// if( dx.Abs() <= ACCURACY )
// break;
if( ++i == ITERS_PER_ROOT ) // even after trying all guesses we didn't converted to the root (within given accuracy)
break;
if(( i & ( ITERS_PER_GUESS - 1 )) == 0 ) // didn't converge yet --> restart with different guess
{
x = GUESSES[ i / ITERS_PER_GUESS ];
}
}
return x;
}
最后,如果它没有找到根,它会尝试不同的猜测,第一个问题(如果没有指定)总是“零”。
例如对于'x^4 + x^3 + x + 1',它找到第一个根'-1'。 通过 'x + 1' 缩小(除)原始多边形,因此第二根搜索继续使用多项式 'x^3 + 1'。 它再次以“零”作为初始猜测开始......但现在第一和第二导数都是“零”,这导致“d0”和“d1”中的“零”......以除以零结束(和根中的 NaN)。
另一个这样的例子是 'x^5 - 1' - 在搜索第一个根时,我们再次以零导数结束。
谁能告诉我如何处理这种情况?
如果导数是“零”,我应该再试一次吗?我在网上看到了很多实现,但没有 有这样的条件,所以我不知道我是否遗漏了什么。
谢谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)