增加数字精度时为什么算法失败?如何降低算法对数字精度的敏感度?

时间:2017-01-25 21:02:03

标签: algorithm matlab precision numerical

我正在使用Newton Raphson +连续替代算法来执行闪光计算(化学过程模拟)。

当输入处于低精度(如0.1)时,算法可以很好地收敛,但是当数字精度增加到0.11111或0.99999时。算法不会收敛。

当我使用带有BFGS更新的准牛顿方法时,再次出现同样的问题。我们如何降低代码对数值精度的敏感度?

这是一个使用matlab解决Rachford-Rice方程的简单例子。当comp_overall = [0.9,1-0.9]时,它收敛良好。但是,当数字精度增加到[0.99999,1-0.99999]时。它不会收敛。

K=[0.053154011443159 34.234731216532658], 
comp_overall= [0.99999 1- 0.99999], phi=0.5; %initial values
epsilon = 1.0;
iter1 = 1; 
while (epsilon >=1.e-05)
  rc=0.0;
  drc=0.0;
  for i=1:2
    % Rachford-Rice Equation 
    rc = comp_overall(i)*(K(i)-1.0)/(1.0+phi*(K(i)-1.0))+rc;
    % Derivative 
    drc = comp_overall(i)*(K(i)-1.0)^2/(1.0+phiK(i)-1.0))^2+drc; 
  end 
  % Newton-Raphson 
  phi1 = phi +0.01 (rc / drc);
  epsilon = abs( (phi1-phi)/phi );  
  % Convergence
  phi = phi1; 
  iter1=iter1+1; 
end

1 个答案:

答案 0 :(得分:1)

Newton-Raphson方法依赖于任何两个连续近似之间可微分的函数。根据初始值的选择,z₁ = 0.99999可能不是这种情况。让我们看一下Rachford-Rice函数的图表:

Rachford-Rice function

此函数的根为φ₀ ≈ –0.0300781429,最近的不连续点为–1/(K₂-1) ≈ –0.0300890052。它们足够接近Newton-Raphson方法超调,跳过这种不连续性。

例如:

  • φ₁ = –0.025
  • f(φ₁) ≈ -0.9229770571
  • f'(φ₁) ≈ 1.2416569960
  • φ₂ = φ₁ + 0.01 * f(φ₁) / f'(φ₁) ≈ -0.0324334302
  • φ₂位于不连续的左侧,因此以下步骤将离开,而不是朝向根。
  • φ₃ = -0.0358986759 < φ₂

可以做些什么:

  1. 当算法无法收敛时,请用较小的步骤重复该算法。例如,从系数0.01(现在是)开始,每次失败后减少10次。
  2. 检测过冲。在每次迭代时检查当前近似值与前一个近似值之间是否存在不连续点(–1/(Kᵢ-1))。当它发生时,丢弃当前的近似值,减小系数并继续。
  3. 限制搜索范围。超出[0,1]的解决方案是否物理上有意义?如果没有,您可以在近似值超出该范围时停止。
  4. 使用不同的方法。该函数在两个连续不连续点之间的任何间隔上都是单调的,因此您可以在每个这样的间隔上执行二进制搜索。它比Newton-Raphson方法更快更强大。