Matlab循环中gamma2变量未更新问题排查求助
问题分析:gamma2始终未更新的原因
循环内变量x1,x2,T1,T2,P1_sat,P2_sat,gamma1均能正常更新,但gamma2始终保持初始值不变,核心原因是迭代逻辑形成了数学闭环:
先看
rr函数与r2函数的数学关系:rr(gamma, T)的计算逻辑:x = sqrt(log(gamma)/A),其中A = 2.771 - 0.00523*Tr2(x, T)的计算逻辑:gamma_2 = exp(A * x^2)
代入迭代步骤拆解:
每次循环中,先通过x1 = rr(gamma2, T0)得到x1,随后又用gamma2 = r2(x1, T0)计算新的gamma2。将x1的表达式代入r2的计算:gamma2 = exp(A * (sqrt(log(gamma2_old)/A))^2) = exp(A * (log(gamma2_old)/A)) = exp(log(gamma2_old)) = gamma2_old这就导致
gamma2永远等于上一次的取值,完全没有变化。补充说明:
初始T0=0时,A=2.771,计算出的x1固定;后续T0增加时A会变化,但由于上述逆运算关系,gamma2依然会保持前一次的值,无法更新。
解决方向
需要重新梳理迭代逻辑:当前x1 = rr(gamma2,T0)这一步的合理性存疑,应根据相平衡的实际物理模型调整x1的计算方式,打破这个无意义的数学闭环。
原始代码
P = 101.33; y1 = 0.4; y2 = 0.6; T1 = reverse_antoine1(P); T2 = reverse_antoine2(P);dT = 0.01; Tf = 1000; n = round(Tf/dT); x1 = 0.0001; x2 = 0.9999;T=0;gamma1 = 1.01;gamma2 = 1.01; T0 = 0; for i = 1:n P1_sat = antoine1(T0); P2_sat = antoine2(T0); x1 = rr(gamma2,T0); x2 = 1 - x1; T1 = reverse_antoine1(P1_sat); T2 = reverse_antoine2(P2_sat); gamma1 = r1(x2, T0); gamma2 = r2(x1, T0); fprintf('\nIntermediate values at iteration %d: gamma2 = %.16f\n', i, gamma2); if ((abs(x1*gamma1*P1_sat + x2*gamma2*P2_sat - P)) < 0.1); T = T0; break; end T0 = T0 + dT; end function [gamma_1] = r1(x, T) A = 2.771 - 0.00523 * T; gamma_1 = exp(A*(x^2)); end function [gamma_2] = r2(x, T) A = 2.771 - 0.00523 * T; gamma_2 = exp(A * x^2); end function [x] = rr(gamma, T) A = 2.771 - 0.00523 * T; x = sqrt(log(gamma)/A); end function [P_1_sat] = antoine1(T) P_1_sat = exp(16.59158 - 3643.31/(T - 33.424)); end function [P_2_sat] = antoine2(T) P_2_sat = exp(14.25326 - 2665.54/(T - 53.424)); end function [T1_0] = reverse_antoine1(P) T1_0 = 3643.31 / (16.59158 - log(P)) + 33.424; end function [T2_0] = reverse_antoine2(P) T2_0 = 2665.54 / (14.25326 - log(P)) + 53.424; end
内容的提问来源于stack exchange,提问作者koh05163
相关产品推荐
相关产品推荐

