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

平行平板间的二维流动

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

\frac{dp}{dx}=\mu \frac{d^{2}u}{dy^{2}}.       (式1)

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

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

\mu \frac{d^{2}u}{dy^{2}} = -G,

积分一次得到:

\mu \frac{du}{dy} = -Gy + C_1,

 

再积分一次得到:

u(y) = -\frac{G}{2\mu}y^2 + \frac{C_1}{\mu}y + C_2,


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

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

C_1 = \frac{Gh}{2},C_2 = 0 ,

所以最终的解为:

u(y) = \frac{G}{2\mu}(h y - y^2).

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()                

 

二维泊肃叶流 

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

u = -\frac{1}{2\mu} \frac{dp}{dx} (b^2 - y^2).        (式2)

式中b 是平板间距的一半(因为平板位于 y=-by=b

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)可以分别计算出中线上最大速度值: 

u_{max}=-\frac{1}{2\mu}\frac{dp}{dx}b^{2},  

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()

 

通过两板间的流量 :

Q=\int^{b}_{-b}udy=-\frac{2}{3\mu}\frac{dp}{dx}b^{3},

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()

 

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

u_{average}=\frac{Q}{2b}=-\frac{1}{3\mu \frac{dp} {dx}}b^{2}=\frac{2}{3}u_{max},

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)))

 

壁面上的最大切应力: 

\tau_{max}=\mu\frac{du}{dy}|_{max} = \frac{dp}{dx}b=-\frac{3\mu u_{average}}{b},

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()

 

阻力系数: 

\lambda=\frac{|\tau_{max}|}{\frac{1}{2}\rho u^{2}_{average}}.

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()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/462336.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一瓶5.86万,听花酒什么来头?

听花酒&#xff0c;到底什么来头&#xff1f; 宣称有提升免疫力、改善睡眠、保障男性功能、调节生理紊乱、抗衰老等功效的听花酒&#xff0c;被315晚会曝光了。 相关话题词随即冲上了热搜。之后&#xff0c;售价最高达58600元的听花酒被京东、拼多多、淘宝等电商平台火速下架…

react中JSX的详解

目录 JSX的本质及其与JavaScript的关系探究 一、JSX的本质 二、JSX与JavaScript的关系 三、为什么要使用JSX 四、不使用JSX的后果 五、JSX背后的功能模块 JSX的本质及其与JavaScript的关系探究 在React开发中&#xff0c;JSX是一个不可或缺的部分。那么&#xff0c;JSX的…

信息系统项目管理(第四版)(高级项目管理)考试重点整理 第14章 项目沟通管理(四)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

【编程项目开源】拼图游戏(鸿蒙版)

目标 做个拼图游戏 效果 开发工具 下载DevEco Studio 工程截图 开源地址 https://gitee.com/lblbc/puzzle/tree/master/puzzle_hongmeng_arkUI 关于 厦门大学计算机专业|华为八年高级工程师 专注《零基础学编程系列》 http://lblbc.cn/blog 包含&#xff1a;Java | 安卓…

蓝桥杯刷题(九)

1.三国游戏 代码 #输入数据 nint(input()) Xlilist(map(int,input().split())) Ylilist(map(int,input().split())) Zlilist(map(int,input().split())) #分别计算X-Y-Z/Y-Z-X/Z-X-Y并排序 newXli sorted([Xli[i] - Yli[i] - Zli[i] for i in range(n)],reverseTrue) newYli …

图像去噪--(1)

系列文章目录 文章目录 系列文章目录前言一、图像噪声1.1 噪声定义1.2 基本特征 二、按照噪声概率分布分类1.高斯噪声2.泊松噪声 三、去噪算法3.1 线性滤波3.1.1 高斯滤波3.1.2 均值滤波 3.2 非线性滤波3.2.1 中值滤波3.2.2 双边滤波 四、深度学习总结 前言 一、图像噪声 1.1 …

如何使用Python进行数据可视化:Matplotlib和Seaborn指南【第123篇—Matplotlib和Seaborn指南】

如何使用Python进行数据可视化&#xff1a;Matplotlib和Seaborn指南 数据可视化是数据科学和分析中不可或缺的一部分&#xff0c;而Python中的Matplotlib和Seaborn库为用户提供了强大的工具来创建各种可视化图表。本文将介绍如何使用这两个库进行数据可视化&#xff0c;并提供…

(每日持续更新)jdk api之StringBufferInputStream基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

前端学习笔记 | WebAPIs(DOM+BOM)

一、作用和分类 1、基本概念 作用&#xff1a;使用JS去操作HTML和浏览器 分类&#xff1a;DOM&#xff08;文档对象模型&#xff09;和BOM&#xff08;浏览器对象模型&#xff09; html的标签JS的DOM对象 2、获取DOM对象-参数必须加引号 &#xff08;1&#xff09;选择匹配的第…

使用 OpenAI 的 Embedding模型 构建知识向量库并进行相似搜索

OpenAI的embedding模型的使用 首先第一篇文章中探讨和使用了ChatGPT4的API-Key实现基础的多轮对话和流式输出&#xff0c;完成了对GPT-API的一个初探索&#xff0c;那第二步打算使用OpenAI的embedding模型来构建一个知识向量库&#xff0c;其实知识向量库本质上就是一个包含着一…

电脑自带dll修复在哪里打开呢?马上教会你

由于各种原因&#xff0c;电脑可能会出现一些问题&#xff0c;其中之一就是dll文件丢失。Dll文件是动态链接库文件&#xff0c;它们包含了许多程序运行所需的函数和资源。当这些文件丢失或损坏时&#xff0c;可能会导致程序无法正常运行或出现错误提示。本文将介绍电脑dll文件丢…

springboot蛋糕订购小程序的设计与实现

摘 要 相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低商家的运营人员成本&#xff0c;实现了蛋糕订购的标准化、制度化、程序化的管理&#xff0c;有效地防止了蛋糕订购的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准确…

工作总结!日志打印的11条建议

前言 大家好&#xff0c;我是 JavaPub。日志是我们定位问题的得力助手&#xff0c;也是我们团队间协作沟通&#xff08;甩锅&#xff09;、明确责任归属&#xff08;撕B&#xff09;的利器。没有日志的程序运行起来就如同脱缰的野&#x1f40e;。打印日志非常重要。今天我们来…

Linux内存管理--系列文章貮

接上文&#xff0c;用户态写完&#xff0c;本章写内核态内存空间。 3.2内核态内存 大家会发现用户态空间不管32还是64位&#xff0c;这种内存分布是相差不大的。是因为使用虚拟内存的系统&#xff0c;会让应用程序感到和别的程序是相互独立的&#xff0c;互不干扰&#xff0c…

mysql索引 (索引的忧缺点 ,联合索引)

索引的忧缺点 优点 &#xff08;增加读操作效率&#xff0c;排序成本&#xff09; 1 查询效率高 2 降低排序成本&#xff0c;索引对应的字段 就已经 自动排序&#xff0c;因为索引本身就是一种排好序的数据结构 缺点&#xff08;降低写操作效率&#xff0c;占用空间&#xf…

【Unity】读取Json的三种方法(JsonUtility,LitJson,Newtonsoft)

介绍 在Unity开发过程中&#xff0c;Json是比较常用的一种数据存储文本&#xff0c;尤其是在和第三方交互中&#xff0c;基本都是json格式。 先给出一个Json示例&#xff0c;我们来看看是如何解析的。 {"Player": [{"id": 1001,"name": "…

UCORE 清华大学os实验 lab0 环境配置

打卡 lab 0 &#xff1a; 环境配置 &#xff1a; 首先在ubt 上的环境&#xff0c;可以用虚拟机或者直接在windows 上面配置 然后需要很多工具 如 qemu gdb cmake git 就是中间犯了错误&#xff0c;误以为下载的安装包&#xff0c;一直解压不掉&#xff0c;结果用gpt 检查 结…

Js输入输出语句

输入语法 prompt("您想输入的是&#xff1f;")输出语法: 语法1: document.write(‘要出的内容’&#xff09; <body><script>document.write("你好")document.write("<h1>我是<h1>")</script> </body>作…

【开发】Spring整合MyBatis、MyBatisPlus

目录 前言 Spring整合MyBatis 1. 在项目中的pom.xml中导入MyBatis和Spring相关的依赖&#xff1a; 2. 配置数据源 3. 编写实体类 4. 编写API接口 5. 编写单元测试方法&#xff08;业务&#xff09; Spring整合MyBatis-Plus 1. 在项目中导入依赖&#xff1a; 2. 配置数…

电大搜题:开启学习新时代

身处信息化时代&#xff0c;学习的方式已经发生了巨大的变革。在这个多元化的学习环境中&#xff0c;传统的学习模式已经无法满足现代学习者的需求。然而&#xff0c;电大搜题应运而生&#xff0c;为学习者提供了一个高效、便捷的学习途径。 电大搜题&#xff0c;作为黑龙江开…