【问题标题】:Why the algorithm fails when increase the number precision? How can we decrease the sensitivity of the algorithm to the number precision?为什么增加数字精度时算法会失败?我们如何降低算法对数字精度的敏感性?
【发布时间】:2017-01-25 21:02:02
【问题描述】:

我正在使用 Newton Raphson +successive Substitute 算法进行快速计算(化学过程模拟)。

当输入是0.1这样的低精度时,算法可以很好地收敛,但是当数字精度增加到0.11111或0.99999时。算法不会收敛。

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

这是一个使用 matlab 求解 Rachford-Rice 方程的简单示例。当 comp_overall=[0.9,1-0.9] 时,它收敛得很好。但是,当数字精度增加到 like[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

【问题讨论】:

  • 你的意思是Newton-Raphson
  • 您需要发布代码。实际算法必然如此收敛。但是,基本上你的代码中有一个错误导致它出现问题。

标签: algorithm matlab precision numerical


【解决方案1】:

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

这个函数的根是φ₀ ≈ –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 方法更快、更稳健。

【讨论】:

  • 您好,非常感谢您的回答。对于您上面列出的建议,我之前已经尝试过其中的一些。像减少迭代步长或增加线搜索方法一样,结果并不那么令人满意。现在我正在尝试更复杂的方法,如牛顿高斯算法或残差梯度法。
猜你喜欢
  • 1970-01-01
  • 2022-11-02
  • 2017-02-13
  • 2018-11-15
  • 2013-01-09
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多