4. 二元体系亚规则溶液模型对液相互溶间隙的再现

为什么规则溶液模型画不出液相互溶间隙

规则溶液模型中,液相摩尔Gibbs能写作:

GLm = xAGA0,L + xBGB0,L + RT(xAlnxA + xBlnxB) + xAxBL0

其中相互作用参数 L0 为常数。当 L0 足够大且为正时,Gm–x 曲线出现双谷,但对称的规则溶液模型只能给出对称的互溶间隙,且临界点固定在 xB = 0.5。实际体系(如Al–Zn、Cu–Ni、Fe–Cr等)的液相互溶间隙往往不对称,临界成分偏离0.5,必须引入成分依赖的亚规则项。

亚规则溶液模型与参数设置

亚规则溶液模型将相互作用参数展开为成分的线性函数:

L(xB) = L0 + L1(xA − xB) = L0 + L1(1 − 2xB)

此时过剩Gibbs能 GE = xAxB[L0 + L1(xA − xB)]。化学势差(即公切线条件)为:

ΔμB = GB0,L − GA0,L + RT ln(xB/xA) + GE + (1 − xB)∂GE/∂xB

互溶间隙边界由 ΔμB(xBα) = ΔμB(xBβ) 且 ΔμA(xBα) = ΔμA(xBβ) 确定。临界点满足 ∂²Gm/∂xB² = 0 且 ∂³Gm/∂xB³ = 0。

教学示例参数(Al–Zn液相,假设值,仅用于演示计算逻辑):

GAl0,L − GZn0,L ≈ 0(取参考态相等,简化演示)

L0 = +18000 J/mol,L1 = −6000 J/mol,R = 8.314 J/(mol·K)

互溶间隙与临界点的计算流程

以下Python代码使用亚规则模型,在给定温度下求解公切线方程,得到互溶间隙两端的成分,并扫描温度找到临界点。

import numpy as np
from scipy.optimize import fsolve, brentq

R = 8.314
L0 = 18000.0   # J/mol
L1 = -6000.0   # J/mol

def dG_dx(xB, T):
    """亚规则模型 dGm/dxB (除以RT归一化前的原始值)"""
    xA = 1.0 - xB
    # 理想混合项导数: RT*ln(xB/xA)
    ideal = R * T * np.log(xB / xA)
    # 过剩项 GE = xA*xB*(L0 + L1*(xA-xB))
    # dGE/dxB = (1-2xB)*(L0+L1*(1-2xB)) + xA*xB*(-2*L1)
    s = 1.0 - 2.0 * xB
    dGE = s * (L0 + L1 * s) + xA * xB * (-2.0 * L1)
    return ideal + dGE

def common_tangent(x, T):
    """公切线条件: dG/dxB 在 x[0] 和 x[1] 处相等, 且截距相等"""
    x1, x2 = x
    # 条件1: 两处斜率相等
    eq1 = dG_dx(x1, T) - dG_dx(x2, T)
    # 条件2: 两处切线截距相等 (用 dG/dxB 和 G 的关系)
    # G(x) = RT[xA ln xA + xB ln xB] + xA*xB*(L0+L1*(xA-xB))
    def Gm(xB):
        xA = 1.0 - xB
        ideal = R * T * (xA * np.log(xA) + xB * np.log(xB))
        s = xA - xB
        ge = xA * xB * (L0 + L1 * s)
        return ideal + ge
    # 截距: G(x) - x * dG/dx 在两点相等
    b1 = Gm(x1) - x1 * dG_dx(x1, T)
    b2 = Gm(x2) - x2 * dG_dx(x2, T)
    eq2 = b1 - b2
    return [eq1, eq2]

# 在 T = 700 K 求解互溶间隙
T_test = 700.0
x_guess = [0.15, 0.85]
sol = fsolve(common_tangent, x_guess, args=(T_test,))
x_alpha, x_beta = sorted(sol)
print(f"T = {T_test} K: 互溶间隙 = {x_alpha:.4f} ~ {x_beta:.4f}")

# 扫描温度找临界点: 两相成分合并
def gap_width(T):
    try:
        s = fsolve(common_tangent, [0.15, 0.85], args=(T,), full_output=True)
        xa, xb = sorted(s[0])
        if s[2] == 1 and 0 < xa < xb < 1:
            return xb - xa
    except Exception:
        pass
    return None

T_scan = np.linspace(600, 900, 61)
widths = []
for T in T_scan:
    w = gap_width(T)
    widths.append(w if w is not None else np.nan)

# 找宽度趋近0的温度作为临界温度估计
valid = [(T, w) for T, w in zip(T_scan, widths) if w is not None and w > 1e-4]
if valid:
    T_c_est = valid[-1][0]
    print(f"临界温度估计: T_c ≈ {T_c_est:.1f} K")
    # 在临界温度附近细化
    for T in np.linspace(T_c_est - 5, T_c_est + 5, 21):
        w = gap_width(T)
        if w is not None:
            print(f"  T = {T:.1f} K, 间隙宽度 = {w:.5f}")

参数对临界点位置的影响

通过改变 L0 和 L1,可以观察临界温度和临界成分的变化规律:

  • 增大 L0:互溶间隙扩大,临界温度升高。规则溶液模型下 Tc = L0/(2R),亚规则模型下临界温度近似为 Tc ≈ (L0 + L1/3)/(2R)(小 L1 近似)。
  • 引入 L1 ≠ 0:临界成分偏离0.5。当 L1 < 0 时,临界成分向 xB < 0.5 方向移动;当 L1 > 0 时向 xB > 0.5 方向移动。
  • 临界成分的解析近似:在临界点附近,xc ≈ 0.5 − L1/(6L0 + 2L1),可用于快速估算。

参数调整建议:先用规则模型(L1 = 0)确定 L0 使临界温度接近实验值,再引入 L1 调整临界成分和间隙不对称性。每次调整后重新计算公切线,检查间隙宽度随温度的变化是否合理。

结果判读与验证

计算完成后,需要检查以下要点:

  1. 间隙宽度随温度单调减小:从低温到临界温度,两相成分应逐渐靠近,宽度趋近于零。
  2. 临界点处二阶和三阶导数同时为零:可用数值微分验证 ∂²Gm/∂xB² 和 ∂³Gm/∂xB³ 在临界点附近变号。
  3. 公切线条件残差:将求得的 xα 和 xβ 代回公切线方程,残差应小于 1×10−6。
  4. 与实验相图对比:若已知实验互溶间隙数据,检查计算边界是否落在实验误差范围内。
亚规则溶液模型:参数对液相互溶间隙与临界点的影响 Gm–xB 曲线与公切线 xB Gm 规则模型 (L1=0, 对称) 亚规则模型 (L1<0, 不对称) xα xβ 临界点 参数影响与临界点移动 L0 ↑ 间隙扩大 Tc 升高 L1 ≠ 0 临界成分偏移 间隙不对称 临界温度近似 Tc ≈ (L0 + L1/3) / (2R) 临界成分近似 xc ≈ 0.5 − L1 / (6L0 + 2L1) 教学示例参数 L0 = +18000 J/mol L1 = −6000 J/mol R = 8.314 J/(mol·K) → Tc ≈ 750 K, xc ≈ 0.44 L1 < 0 时临界成分向 xB < 0.5 偏移;L1 > 0 时向 xB > 0.5 偏移

实操检查清单

检查项通过条件常见问题
公切线残差< 1×10−6初值选取不当导致收敛到平凡解
间隙宽度随T变化单调递减至0参数过大导致数值溢出
临界点导数条件∂²G/∂x² 和 ∂³G/∂x³ 同时变号仅检查二阶导数,遗漏三阶条件
临界成分偏移方向与L1符号一致符号约定错误
与实验对比边界落在实验误差带内未考虑固相或其它相的竞争

注意:亚规则模型仅引入线性成分依赖,对于强不对称体系(如临界成分偏离0.5超过0.15)可能需要更高阶项(L2、L3)或Redlich–Kister展开。此外,液相互溶间隙常与固相析出竞争,实际相图计算中需同时考虑所有相的稳定性。