我正在使用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
答案 0 :(得分: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/(Kᵢ-1)
)。当它发生时,丢弃当前的近似值,减小系数并继续。