使用R语言计算并绘制流体力学中的二维泊肃叶流

平行平板间的二维流动

在流体力学中,当考虑两平行平板间的二维、定常、不可压缩流动,并且只存在沿x方向的流动速度,我们可以从N-S方程推导出方向的动量方程。对于给定的方程:

(式1)

其中,是压力,是动力粘度,是x方向的速度分量,是与平板垂直的方向。

如果我们假设将压力梯度 看作一个常数 (负号是为了方便,因为通常压力在流动方向上是减小的),然后对方程进行积分:

积分一次得到:

,

再积分一次得到:

,

其中,是积分常数,可以通过边界条件来确定。

在R语言中,我们可以定义这个函数,并给定边界条件来求解 。例如,假设在 时,,在 时,(即两平板间的距离为,且在平板上速度为零),那么我们可以得到:

所以最终的解为:

.

R 复制代码
library(ggplot2)  

G <- 1.0  # 压力梯度
mu <- 1.0  # 动力粘度  
h <- -1.0  # 平板间距  
  
# 设置y值范围  
y <- seq(0, h, length.out = 100)  
  
# 计算速度分布  
u <- function(y, G, mu, h) {  
  return((G / (2 * mu)) * (h * y - y^2))  
}  
  
# 计算速度  
u_values <- u(y, G, mu, h)  
  
# 存储y和u的值  
df <- data.frame(y = y, u = u_values)  
  
ggplot(df, aes(x = y, y = u)) +  
  geom_line() +                  
  labs(x = "y", y = "u(y)") +   
  ggtitle("速度分布图") +        
  theme_minimal()                

二维泊肃叶流

假设上下两个平板不动,则边界条件为无滑移条件:对式(1)积分两次,由边界条件得

(式2)

式中 是平板间距的一半(因为平板位于

R 复制代码
library(ggplot2)  
  
b <- 1.0 # 平板间距的一半  
mu <- 1.0 # 动力粘度  
dp_dx <- -1.0 # 压力梯度 
  
# 创建y值的细粒度向量  
y <- seq(-b, b, length.out = 100)  
  
# 速度分布函数  
u <- function(y, b, mu, dp_dx) {  
  return(-(1/(2*mu)) * dp_dx * (b^2 - y^2))  
}  
  
# 计算速度分布  
u_values <- u(y, b, mu, dp_dx)  
  
df <- data.frame(y = y, u = u_values)  
  
ggplot(df, aes(x = y, y = u)) +  
  geom_line(color = "black", linewidth = 1.0) + 
  geom_point(data = data.frame(y = c(-b, b), u = 0), aes(x = y, y = u),color = "red", size = 1, shape = 19) +  
labs(x = "y", y = "u(y)", title = "二维泊肃叶流速度分布图") + 
  theme_minimal() 

该式为流场中的速度分布,由式(2)可以分别计算出中线上最大速度值:

R 复制代码
library(ggplot2) 

mu <- 1.0     # 动力粘度 
dp_dx <- -0.1   # 压力梯度
b <- 1.0       # 流道的一半宽度

# 最大速度  
u_max <- -1 / (2 * mu) * dp_dx * b^2  
cat("中线上的最大速度 u_max 为:", u_max, "m/s\n")  

b_values <- seq(0.01, 0.1, by = 0.01)  # 流道宽度范围  
dp_dx_values <- seq(-50, -200, by = -50)  # 压力梯度范围  
mu_fixed <- mu  # 固定动力粘度  

u_max_matrix <- matrix(0, nrow = length(b_values), ncol = length(dp_dx_values))  

for (i in 1:length(b_values)) {  
  for (j in 1:length(dp_dx_values)) {  
    u_max_matrix[i, j] <- -1 / (2 * mu_fixed) * dp_dx_values[j] * b_values[i]^2  
  }  
}  

# 绘制- u_max作为b和dp/dx的函数  
df <- expand.grid(b = b_values, dp_dx = dp_dx_values)  
df$u_max <- as.vector(t(u_max_matrix))  
ggplot(df, aes(x = b, y = u_max, color = factor(dp_dx))) +  
  geom_line() +  
  labs(x = "流道半宽(b)",  
       y = "最大速度(u_max)",  
       color = "压力梯度(dp/dx)") +  
  scale_color_discrete(breaks = rev(dp_dx_values), labels = paste0("dp/dx = ", 
                                rev(dp_dx_values), " Pa/m")) +  
  theme_minimal()

通过两板间的流量 :

R 复制代码
library(ggplot2) 

mu <- 1.0  # 动力粘度, 单位 Pa·s  

b_values <- seq(0.01, 0.1, by = 0.01)  # 流道宽度范围  
dp_dx_values <- seq(-50, -500, by = -50)  # 压力梯度范围  
mu_fixed <- mu  # 固定动力粘度  

# 初始化一个矩阵来存储结果  
Q_matrix <- matrix(0, nrow = length(b_values), ncol = length(dp_dx_values))  

# 计算不同参数下的流量Q  
for (i in 1:length(b_values)) {  
  for (j in 1:length(dp_dx_values)) {  
    Q_matrix[i, j] <- -(b_values[i]^3) / (3 * mu_fixed) * dp_dx_values[j]  
  }  
}  

df <- as.data.frame(as.table(Q_matrix))  
names(df) <- c("b", "dp_dx", "Q")  
df$b <- rep(b_values, each = length(dp_dx_values))  
df$dp_dx <- rep(dp_dx_values, times = length(b_values))  

# 绘制-Q为b和dp/dx的函数  
ggplot(df, aes(x = b, y = Q, color = factor(dp_dx))) +  
  geom_line() +  
  labs(x = "流道半宽(b)",  
       y = "流量(Q)",  
       color = "压力梯度(dp/dx)") +  
  scale_color_discrete(breaks = rev(unique(df$dp_dx)), 
                       labels = paste0("dp/dx = ", rev(unique(df$dp_dx)), " Pa/m")) +  
  theme_minimal()

两平板间流动的平均速度:

R 复制代码
library(ggplot2)  
  
u <- function(y, b, mu, dp_dx) {  
  return(-(1/(2*mu)) * dp_dx * (b^2 - y^2))  
}  
  
b <- 1.0  # 平板间距的一半  
mu <- 1.0  # 动力粘度  
dp_dx <- -1.0  # 压力梯度  
  
# 最大速度 u_max  
u_max <- u(0, b, mu, dp_dx)  
  
# 计算平均速度 u_avg  
u_avg <- (2/3) * u_max  
  
# 创建向量来计算速度分布  
y_values <- seq(-b, b, length.out = 100)  
u_values <- sapply(y_values, u, b=b, mu=mu, dp_dx=dp_dx)  
df <- data.frame(y = y_values, u = u_values)  
  
ggplot(df, aes(x = y, y = u)) +  
  geom_line(color = "black", size = 0.8) +  
  geom_hline(yintercept = u_avg, color = "red", linetype = "dashed") + labs(x = "y", y = "u(y)", title = "二维泊肃叶流平均流速分布图") + 
  theme_minimal() +annotate("text", x = 0, 
y = u_avg + 0.05, label = paste("平均流速 =", round(u_avg, 2)))

壁面上的最大切应力:

R 复制代码
library(ggplot2)  
  
mu <- 1.0  
u_avg_base <- 0.33   
dp_dx_values <- c(-0.5, -1.0, -1.5)  
  
all_data <- data.frame()  
  
for (dp_dx in dp_dx_values) {  
  b_values <- seq(0.1, 1.0, by = 0.1)  # 
  tau_max_values <- sapply(b_values, function(b) {  
    return(dp_dx * b)  # 
  })  
 
  df <- data.frame(b = b_values, tau_max = tau_max_values, dp_dx = dp_dx)  
  all_data <- rbind(all_data, df)  
}  
  

ggplot(all_data, aes(x = b, y = tau_max, color = factor(dp_dx))) +  
  geom_line(size = 0.8) +  
  scale_color_discrete(name = "压力梯度 (dp/dx)", labels = paste("dp/dx =", dp_dx_values)) +  
  labs(x = "b (平板间距的一半)", y = "τ_max (壁面最大切应力)", title = "二维泊肃叶流壁面最大切应力") +  
  theme_minimal()

阻力系数:

R 复制代码
library(ggplot2)  
  
rho <- 1000  # 流体密度 (kg/m3)  
u_avg <-100  # 平均速度 (m/s)  
dp_dx_values <- seq(-100, 0, by = 10)  # 压力梯度范围 (Pa/m)
h_values <- seq(0.01, 0.1, by = 0.01)  # 平板间距范围 (m)  
  
lambda_data <- data.frame()  
  
for (dp_dx in dp_dx_values) {  
  for (h in h_values) {  
    tau_max <- -dp_dx * h / 2   
    lambda <- abs(tau_max) / (0.5 * rho * u_avg^2)  
    lambda_data <- rbind(lambda_data, data.frame(dp_dx = dp_dx, h = h, lambda = lambda))  
  }  
}  
  
ggplot(lambda_data, aes(x = h, y = lambda, color = factor(dp_dx))) +  
  geom_line(size = 1) +  
  scale_color_discrete(name = "压力梯度 (dp/dx)", breaks = dp_dx_values, labels = paste("dp/dx =", dp_dx_values)) +  
  labs(x = "平板间距 (h)", y = "阻力系数 (λ)", title = "二维泊肃叶流阻力系数曲线") +  
  theme_minimal()
相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大9 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai10 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜10 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa10 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio