将流变学数据拟合至Carreau-Yasuda模型时scipy curve_fit效果不佳求助
Carreau模型拟合优化方案
精准设置参数初始猜测
Carreau模型的5个参数都有明确物理意义,别凭感觉瞎猜:- $\eta_0$:取剪切率最小时的实测粘度值
- $\eta_\infty$:取剪切率最大时的实测粘度值
- $\lambda$:特征时间,用剪切率中间值的倒数估算,或者先做幂律拟合后反推
- $n$:直接用幂律拟合得到的幂律指数
- $a$:经典模型里固定为2,若要拟合,初始值设为2就行
放弃对数线性化,改用加权非线性拟合
对数变换会放大低粘度数据的权重,导致高剪切区拟合偏差。直接用原始数据,给高剪切率数据加更高权重,修改curve_fit的sigma参数:
# 示例:按剪切率平方加权,提升高剪切数据的拟合权重 weights = shear_rate ** 2 sigma = 1 / weights popt, pcov = curve_fit(carreau_model, shear_rate, viscosity, p0=initial_guess, sigma=sigma)
- 给参数加物理约束
Carreau参数有严格物理范围,用bounds限制避免拟合出无意义值:
# 边界示例:保证零剪切粘度大于无穷剪切粘度,幂律指数在0-1之间等 bounds = ( [1e-3, 1e-6, 1e-5, 0.01, 1], # 参数下界 [1e3, 1e-1, 1e2, 0.99, 3] # 参数上界 ) popt, pcov = curve_fit(carreau_model, shear_rate, viscosity, p0=initial_guess, bounds=bounds)
先排查数据问题
- 确认剪切率覆盖范围是否足够宽(从接近0到高剪切区间),如果数据只集中在中间段,两端的$\eta_0$和$\eta_\infty$根本没法准确拟合
- 检查异常值:用残差图或箱线图找出偏离过大的测量点,比如突然跳变的粘度值,先剔除再拟合
换用更鲁棒的拟合算法
如果curve_fit的LM算法对噪声敏感,改用scipy.optimize.minimize自定义损失函数,比如用L1绝对误差替代平方误差,对异常值耐受性更强:
from scipy.optimize import minimize def carreau_loss(params, shear_rate, viscosity): eta0, etainf, lam, n, a = params pred = etainf + (eta0 - etainf) * (1 + (lam * shear_rate)**a)**((n-1)/a) return np.sum(np.abs(pred - viscosity)) # L1损失,鲁棒性优于默认的L2 initial_guess = [eta0_guess, etainf_guess, lam_guess, n_guess, 2] result = minimize(carreau_loss, initial_guess, args=(shear_rate, viscosity), bounds=bounds) popt = result.x
内容的提问来源于stack exchange,提问作者Aran Klair
相关产品推荐
相关产品推荐

