首页/文章/ 详情

多孔介质参数拟合时系数为负值如何处理?

精品
作者优秀平台推荐
详细信息
文章亮点
作者优秀
优秀教师/意见领袖/博士学历/特邀专家
平台推荐
内容稀缺
2月前浏览2092

在Fluent中使用多孔介质区域或多孔阶跃边界时,需要对实验数据进行拟合。

在应用这类条件时,往往需要进行大量的试验以获取压力降与速度之间的函数关系,再将函数表达式中的系数换算成软件中的输入参数。而在软件求解计算的过程中,软件会利用输入的参数还原压力降与速度之间的函数关系。

通常情况下,压降-速度之间的函数表达式为截距为零的二次多项式:

其中  及  为常数,  为速度。
从物理意义上来说,  与  的值可以是任意值,因为软件只是利用速度计算得到压力,只要函数表达式可以正确的根据速度值计算得到压力降就不会有任何问题。但是通常情况下  和  取正值,因为如果  或  存在负值的话,有可能会出现速度越大压降越小或速度越小压降越大的非物理现象,这通常出现在试验参数未完全包含模拟工况的情况下。比如试验的时候速度范围10~30 m/s,但仿真计算得到的速度超出了这个范围(如仿真速度大于30 m/s或小于10 m/s),此时利用公式进行外插计算压降,而系数为负值时,则可能会导致压降出现反常(如速度小时压降变大,或速度更大时压降变小)。
因此,处理此类问题的两条建议:
  1. 确保试验的速度范围完全涵盖仿真计算的速度范围。
  2. 函数拟合时确保系数    和    均为正值
其中第一点容易保证,无非就是在设计试验的时候注意一下速度范围。那么第二点该怎么实现?这里用个简单的示例来描述处理过程。
如通过试验获取的速度-压力降数据表如下所示。
速度(m/s)压力降(Pa)
00
13851
215418
334413
462158
598711

直接采用最小二乘法进行二次多项式拟合(指定截距为零),拟合结果如下所示。

可以看到此时拟合得到的系数中,  为负值。
若想要使拟合得到的系数均为正值,可以采用下面的方式。
方式1:修改横坐标数据
从拟合得到的函数曲线可以看到,其对称轴是一个接近零且大于零的值,我们只需要将函数曲线向左挪动一点点位置(使对称轴小于零)即可确保两个系数均为正值。
将待拟合的数据修改为:
速度(m/s)压力降(Pa)
00
0.93851
1.915418
2.934413
3.962158
4.998711

拟合后的结果为:

可以看到,两个系数均变为了正值。这种方法简单粗暴,但是修改数据总是令人觉得不安。

方式2:拟合时约束系数值大于0

在对数据进行拟合的过程中,强制约束系数值大于等于零。拟合结果如下图所示。

三种方式计算得到的压力降如下表所示。
速度(m/s)压力降(Pa)直接拟合(Pa)方法1(Pa)方法2(Pa)
00000
138513485.374278.033919.86
21541815069.7816663.2215679.44
33441334753.2337155.5735278.74
46215862535.7265755.0862717.76
59871198417.25102461.897996.5

三种方法和测试值比较的偏差如下表所示。

速度(m/s)压力降(Pa)直接拟合偏差(%)方法1偏差(%)方法2偏差(%)
000.00%0.00%0.00%
13851-9.49%11.09%1.79%
215418-2.26%8.08%1.70%
3344130.99%7.97%2.52%
4621580.61%5.79%0.90%
598711-0.30%3.80%-0.72%

可以看到方法2的处理方式是可行的。其拟合程序如下所示。

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['MicroSoft YaHei']  # 指定使用的中文字体

# 定义二次函数模型,确保截距为0
def quadratic_model(x, a, b):
   return a * x**2 + b * x

# 读取数据(这里使用您提供的示例数据)
vel = np.array([0,1, 2, 3, 4, 5])
dp = np.array([0,3851, 15418, 34413, 62158, 98711])

# 进行曲线拟合,指定参数值的范围为大于1-e6
popt, pcov = curve_fit(quadratic_model, vel, dp, bounds=(1e-6, np.inf))
# 获取拟合参数
a, b = popt

# 计算R平方值
residuals = dp - quadratic_model(vel, a, b)
ss_res = np.sum(residuals**2)
ss_tot = np.sum((dp - np.mean(dp))**2)
r_squared = 1 - (ss_res / ss_tot)

# 打印拟合结果
print(f"拟合公式: velocity = {a:.2f} * x^2 + {b:.2f} * x")
print(f"R平方值: {r_squared:.4f}")

# 绘制原始数据和拟合曲线
plt.figure(figsize=(10, 6))
plt.scatter(vel, dp, label='原始数据')
x_fit = np.linspace(0, 5, 100)
y_fit = quadratic_model(x_fit, a, b)
plt.plot(x_fit, y_fit, 'r-', label='拟合曲线')
plt.xlabel('速度(m/s)')
plt.ylabel('压力降(Pa)')
plt.legend()
plt.title(f"拟合结果: vel = ${a:.2f} x^2 + ({b:.2f}) * x$\n$R^2= {r_squared:.4f}$")
plt.grid()
plt.grid(which='major',alpha= 0.6)
plt.grid(which='minor', alpha=0.3,linestyle='--')
plt.minorticks_on()
plt.show()

(完)

来源:CFD之道
Fluent多孔介质UM试验
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-08-14
最近编辑:2月前
CFD之道
博士 | 教师 探讨CFD职场生活,闲谈CFD里外
获赞 2553粉丝 11192文章 726课程 27
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈