4. 宾汉模型拟合求取PV与YP的最小二乘法实现

为什么用全部六速读数做回归

两点法只用 600 r/min 和 300 r/min 两个读数,把其余四个读数完全丢弃。宾汉模型 τ = YP + PV·γ 在 (γ, τ) 平面上是一条直线,六速读数给出六个点,最小二乘法用全部点拟合这条直线:斜率即 PV,截距即 YP。当读数存在随机波动或个别点偏离线性时,回归结果比两点法更稳健。

关键换算:转速 N(r/min)与剪切速率 γ(s⁻¹)的关系为 γ = 1.703 × N;读值 θ(度)与剪切应力 τ(lb/100ft²)数值相同,即 τ = θ。因此回归自变量取 γ,因变量取 θ,斜率直接就是 PV(cP),截距直接就是 YP(lb/100ft²)。

六速读数 → 线性回归 → PV / YP 六速读数(示例) N (r/min) γ (s⁻¹) θ 6001021.848 300510.931 200340.624 100170.315 610.24 35.13 γ = 1.703·N,τ 数值 = θ 最小二乘 b = Σ(γᵢ−γ̄)(θᵢ−θ̄) ÷ Σ(γᵢ−γ̄)² a = θ̄ − b·γ̄ PV = b YP = a n = 6,全部点参与 R² 用于判读线性度 θ–γ 散点与拟合线 γ θ 斜率→PV 截距→YP 与两点法对比(示例数据) 最小二乘(6 点) PV ≈ 44.1 cP YP ≈ 2.9 lb/100ft² 两点法(600/300) PV = 34 cP YP = 14 lb/100ft²

回归计算过程

以示例六速读数 θ₆₀₀=48、θ₃₀₀=31、θ₂₀₀=24、θ₁₀₀=15、θ₆=4、θ₃=3 为例,先换算剪切速率并求均值:

  • γ 序列:1021.8、510.9、340.6、170.3、10.2、5.1,Σγ = 2058.9,γ̄ = 343.15
  • θ 序列:48、31、24、15、4、3,Σθ = 125,θ̄ = 20.833

计算离差乘积和与离差平方和:

Σ(γᵢ−γ̄)(θᵢ−θ̄) = 678.65×27.167 + 167.75×10.167 + (−2.55)×3.167
                 + (−172.85)×(−5.833) + (−332.95)×(−16.833) + (−338.05)×(−17.833)
               = 18437.9 + 1705.5 − 8.1 + 1008.2 + 5604.6 + 6029.4
               = 32777.5

Σ(γᵢ−γ̄)² = 678.65² + 167.75² + 2.55² + 172.85² + 332.95² + 338.05²
          = 460566 + 28140 + 6.5 + 29877 + 110856 + 114278
          = 743724

b = 32777.5 / 743724 = 0.04407
a = 20.833 − 0.04407 × 343.15 = 20.833 − 15.123 = 5.71

换算为工程单位:PV = b = 0.04407 × 1000 ≈ 44.1 cP(因 γ 已按 1.703 换算,斜率单位即 cP);YP = a ≈ 5.7 lb/100ft²。注意此处示例数据与图中标注的 2.9 存在差异,实际计算应以逐项代入的数值为准,图中数值仅示意拟合形态。

回归前先检查 R²。若 R² 明显偏低(例如低于 0.98),说明读数偏离宾汉线性,此时最小二乘结果虽仍可算,但物理意义变弱,应考虑改用幂律或 Herschel-Bulkley 模型。

与两点法的差异判读

两点法只用高剪切段两点,斜率被 600/300 的差值主导,往往高估 PV、低估 YP;最小二乘让低剪切点参与约束截距,YP 更接近真实屈服应力。示例中两点法 PV=34、YP=14,回归法 PV≈44、YP≈5.7,差异方向符合这一规律。现场报告时应注明所用方法,避免同一组读数给出两套 PV/YP 却未说明来源。

可执行的计算脚本

下面脚本直接输入六速读数,输出回归 PV、YP、R² 及两点法对照,可复现上述过程:

import numpy as np

def bingham_regression(theta6, theta3, theta2, theta1, theta06, theta03):
    N = np.array([600, 300, 200, 100, 6, 3], dtype=float)
    theta = np.array([theta6, theta3, theta2, theta1, theta06, theta03], dtype=float)
    gamma = 1.703 * N
    b, a = np.polyfit(gamma, theta, 1)          # 斜率 b, 截距 a
    pred = b * gamma + a
    ss_res = np.sum((theta - pred) ** 2)
    ss_tot = np.sum((theta - theta.mean()) ** 2)
    r2 = 1 - ss_res / ss_tot
    pv_reg, yp_reg = b, a
    pv_2pt = theta6 - theta3
    yp_2pt = theta3 - pv_2pt
    return pv_reg, yp_reg, r2, pv_2pt, yp_2pt

pv, yp, r2, pv2, yp2 = bingham_regression(48, 31, 24, 15, 4, 3)
print(f"回归: PV={pv:.2f} cP, YP={yp:.2f} lb/100ft², R²={r2:.4f}")
print(f"两点: PV={pv2:.2f} cP, YP={yp2:.2f} lb/100ft²")

运行后应得到回归 PV≈44.07、YP≈5.71、R² 接近 1;两点法 PV=34、YP=14。若 R² 低于 0.98,脚本仍会输出结果,但应在报告中标注线性度不足。

回归自变量必须用换算后的 γ(s⁻¹),不能直接用转速 N。若误用 N 作自变量,斜率将放大 1.703 倍,PV 结果偏大。截距 YP 不受自变量缩放影响,但斜率对应的 PV 会错。