一维热传导问题与C++描述
1一维热传导问题与C++描述
1.1理论推导
扩散问题的通用方程可以写为:
\begin{equation} \nabla\nabla\Gamma +S = 0\tag{1} \end{equation}
一维热传导问题可以讲上式子简化为来:
\begin{equation} \frac{d}{dx}(\Gamma\frac{d\phi}{dx}) +S = 0\tag{2} \end{equation}
将其在网格上离散可以得到下图的控制体单元表示:
将1.2式在网格上积分并利用Gauss定理就可以得到:
\begin{equation} \int_{{\Delta}V}\frac{d}{dx}(\Gamma\frac{d\phi}{dx})dV+\int_{{\Delta}V}SdV =({\Gamma}A\frac{d\phi}{dx})_{e}-({\Gamma}A\frac{d\phi}{dx})_w+\bar S{\Delta}V=0\tag{3} \end{equation}
Γw{\Gamma}_{w}与 Γe{\Gamma}_{e}可以用线性插值的方法得到。1.3再在w,e面上的值即可以写为
\begin{equation} ({\Gamma}A\frac{d\phi}{dx})_{e}={\Gamma}_{e}A_e\frac{\phi_E-\phi_P}{{\delta}_{EP}}\tag{4} \end{equation}
\begin{equation} ({\Gamma}A\frac{d\phi}{dx})_{w}={\Gamma}_{w}A_w\frac{\phi_P-\phi_W}{{\delta}_{PW}}\tag{5} \end{equation}
源项可以用 S¯ΔV=Su+Spϕp\bar S{\Delta}V=S_{u}+S_{p}\phi_{p}代替,则式3可以写为:
\begin{equation} {\Gamma}_{e}A_e\frac{\phi_E-\phi_P}{{\delta}_{EP}}-{\Gamma}_{w}A_w\frac{\phi_P-\phi_W}{{\delta}_{PW}}+S_{u}+S_{p}\phi_{p}=0\tag{6} \end{equation}
整理就得到:
\begin{equation} a_{P}\phi_{P}=a_{W}\phi_{W}+a_{E}\phi_{E}+S_u\tag{7} \end{equation}
其中:
aWa_{W} | aEa_{E} | aPa_{P} |
---|---|---|
ΓWδxWPAW\frac{\Gamma_{W}}{{\delta}{x}_{WP}}A_{W} | ΓEδxPEAE\frac{\Gamma_{E}}{{\delta}{x}_{PE}}A_{E} | aW+aE+Sua_{W}+a_{E}+S_u |
1.2一维传热的小case
其中δx\delta x为0.1m0.1m,k=1000w/m⋅sk=1000w/m\cdot s,截面积A=0.01m2A = 0.01m^{2}。
根据公式7我们可以直接得到2、3、4节点处的方程组的系数。而对于边界1点处,可以类比公式6:
\begin{equation} {\Gamma}A\frac{T_2-T_1}{{\delta}_{21}}-{\Gamma}A\frac{T_P-T_A}{{\delta}_{1A}}=0\tag{8} \end{equation}
同理对于5点我们也有:
\begin{equation} {\Gamma}A\frac{T_B-T_5}{{\delta}_{5B}}-{\Gamma}A\frac{T_5-T_4}{{\delta}_{54}}=0\tag{8} \end{equation}
对于这个case我们所需的全部都已经得到,可以用C++编程语言进行具体的求解。
1.3 C++描述
1.3.1一个有用的数据结构
观察公式7、8、9我们发现实际上对于结构化网格,实际上网格任意一点所需求解的值都仅与相邻网格或者边界上的值相关,我们也就可以用
\begin{equation} a_{P}\phi_{P}=a_{W}\phi_{W}+a_{E}\phi_{E}+a_{N}\phi_{N}+a_{S}\phi_{S}+a_{T}\phi_{T}+a_{B}\phi_{B} +S_u\tag{7} \end{equation}
来表示任意一个网格节点处的离散化的控制方程。在这里就可以定义一个非常哟用的类或者结构体来储存这些系数。
#ifndef _LinearCofs_
#define _LinearCofs_using namespace std;class LinearCofs
{
public:double ap_, ae_, aw_, an_, as_, at_, ab_;double b_;LinearCofs():ap_(0), ae_(0), aw_(0), an_(0), as_(0), at_(0), ab_(0), b_(0){}{}LinearCofs(double ap, double ae, double aw, double an, double as, double at, double ab, double b):ap_(ap), ae_(ae), aw_(aw), an_(an), as_(as), at_(at), ab_(ab), b_(b){}};#endif
即使在后面的三维问题的求解中我们也可以利用上述类。
1.3.2 求解过程
#include <iostream>
#include <vector>#include "LinearCofs.h"#include "Matrix.h"const double N = 5;
const double k_ = 0.5;
const double A_ = 1;
const double L_ = 0.02;
const double TA_ = 100;
const double TB_ = 500;double deltx = L_ / N;using namespace std;void InerField(vector<LinearCofs>& lcDiffusion1D)
{for( int i = 1; i < N - 1; i++){lcDiffusion1D[i].ae_ = -k_ / deltx * A_;lcDiffusion1D[i].aw_ = -k_ / deltx * A_;lcDiffusion1D[i].ap_ = -(lcDiffusion1D[i].ae_ + lcDiffusion1D[i].aw_);}}void BoundaryCondition(vector<LinearCofs>& lcDiffusion1D)
{double deltx = L_ / N;lcDiffusion1D[0].ae_ = -k_ / deltx * A_;lcDiffusion1D[0].aw_ = 0.0;lcDiffusion1D[0].ap_ = -(lcDiffusion1D[0].ae_ + lcDiffusion1D[0].aw_)+2 * k_ / deltx * A_;lcDiffusion1D[N - 1].ae_ = 0.0;lcDiffusion1D[N - 1].aw_ = -k_ / deltx * A_;lcDiffusion1D[N - 1].ap_ = -(lcDiffusion1D[N - 1].ae_ + lcDiffusion1D[N - 1].aw_)+2 * k_ / deltx * A_;
}void CofsToMatrix(Matrix& mDiffusion1D, vector<LinearCofs>& lcDiffusion1D)
{for(int i = 0; i < N; i++){for(int j = 0; j < N; j++){mDiffusion1D(i,j) = 0.0;}}mDiffusion1D(0,0) = lcDiffusion1D[0].ap_;mDiffusion1D(0,1) = lcDiffusion1D[0].ae_;for (int i = 1; i < N-1 ; i++){ mDiffusion1D(i,i-1) = lcDiffusion1D[i].aw_;mDiffusion1D(i,i) = lcDiffusion1D[i].ap_;mDiffusion1D(i,i+1) = lcDiffusion1D[i].ae_;}mDiffusion1D(N-1,N-2) = lcDiffusion1D[N-1].aw_;mDiffusion1D(N-1,N-1) = lcDiffusion1D[N-1].ap_;}void CofsToB_(vector<LinearCofs>& lcDiffusion1D)
{lcDiffusion1D[0].b_ = 2 * k_ / deltx*A_ * TA_;lcDiffusion1D[N-1].b_ = 2 * k_/ deltx*A_ * TB_;}int main()
{Matrix mDiffusion1D(N,N);vector<LinearCofs> lcDiffusion1D;AllocateDim(lcDiffusion1D, N);InerField(lcDiffusion1D);BoundaryCondition( lcDiffusion1D );CofsToMatrix(mDiffusion1D, lcDiffusion1D);CofsToB_( lcDiffusion1D );cout << "Matrix A is: " << endl;cout << mDiffusion1D;vector<double> x(N),b(N);for(int i = 0; i < N; i++){b[i] = lcDiffusion1D[i].b_; }mDiffusion1D.GaussElimination(x, b);cout << endl;cout << " The solution is " << endl;for(int i = 0; i < N; i++){cout <<"x["<<i<<"]="<< x[i] <<" ";}cout << endl;system("pause");return 0;
}
这里第一个函数InerField()是对内部的3\4\5节点赋值,BoundaryCondition()函数则是对两端的1\5点赋值,CofsToMatrix()是将得到的方程组放到矩阵中求解,矩阵求解器可以再我前面的文章中得到,大家可以直接复制,然后include 到头文件中。我们的矩阵求解器有两款线性方程组求解的算法,当然后面我们对于二维问题,因为比较复杂,会有一个gauss-seidel的求解器,会在后面给出那种直接求解不需要赋值到矩阵中的方法。
利用上述算法我们可以得到每个节点处的值了。
一维热传导问题与C++描述相关推荐
- MATLAB模拟导热过程,一维热传导MATLAB模拟.doc
PAGE 昆 明 学 院 2015 届毕业设计(论文) 设计(论文)题目 一维热传导问题的数值解法及其MATLAB模拟 子课题题目 无 姓 名 伍有超 学 号 201117030225 所 属 系 物 ...
- 数值方法3:偏微分方程1:使用有限差分法解一维热传导(扩散)方程
初学练习,看b站课程,教学为matlab代码,自己写的Python代码,后面会放b站课程链接,感兴趣的同学可以学习观看. 说明:Python初学者,代码可能不够漂亮,欢迎大家批评指正.本系列代码用no ...
- 利用有限元法求解一维热传导问题
我们都知道热传导方程是大名鼎鼎的傅里叶提出的,而对于此方程的解也可以用傅里叶变换的方法得到,但笔者已经记不起该怎么求解了(尽管上学期才刚学过数理方法啊).但是无伤大雅,因为我已经掌握了(其实还没有)对 ...
- 热传递 matlab,一维热传导MATLAB模拟.pdf
昆 明 学 院 2015 届毕业设计(论文) 设计(论文)题目 一维热传导问题的数值解法及其 MATLAB 模拟 子课题题目 无 姓 名 伍有超 学 号 201117030225 所 属 系 物理科学 ...
- 一维热传导方程 matlab隐式解,一维热传导偏微分方程的数值解的matlab程序问题出在哪儿?...
我现在编写了一个求解一维热传导的偏微分方程,调程序都调了好多天了 不知道问题在哪儿,求各位高手帮忙看一下好么? 我在此表示万分感谢 需求解的方程看图片,我的程序如下 %---------------- ...
- Python——求解一维热传导
1.问题 求一维热传导方程混合问题: 求解其的数值解,取N=10,h=0.1,计算到K=36为止. 2.程序 #python import numpy as np import matplotlib. ...
- 金属热传导的matlab,热传导matlab代码
· 昆明学院 2015 届毕业设计(论文) 设计(论文)题目 一维热传导问题的数值解法及其 MATLAB 模拟 子课题题目 无 姓名 学号 所属系 专业年级 指导教师 伍有超 5...... Comp ...
- 多维卷积与一维卷积的统一性(运算篇)
http://blog.sina.com.cn/s/blog_7445c2940102wmrp.html 多维卷积与一维卷积的统一性(运算篇) 转载2016-10-16 16:00:31 标签:卷积二 ...
- 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组
整篇文章为对java数组的完整理解以及部分排序,并有一些简单的demo,经典的案例与蓝桥杯的一些经典数组题有专门的文章梳理. 目录 数组概述 什么是数组 数组的结构 数组的特点: 数组分类 一维数组声 ...
- 计算机视觉大型攻略 —— 特征与匹配(3)特征描述符
接上一篇文章.这篇写特征描述符.特征匹配算法在确定角点后,还需要使用描述符来描述这些角点. 本文参考书籍:Computer Vision: Algorithms and Applications, R ...
最新文章
- oracle 回滚段介绍(三)
- 函数式编程学习之路(一)
- SAP UI5 extension component loads standard component
- react动画库_React 2020动画库
- 人工智能AI实战100讲(六)-利用CNN来检测伪造图像
- 函数传参string_C/C++的三种函数传值方式及其区别
- eclipse使用小技巧
- 22.C++- 继承与组合,protected访问级别
- http://blog.sina.com.cn/s/blog_6145ed810102vr8k.html
- Java中字符输入输出流
- 数组的几种定义方式及初始化
- iOS开发之创建颜色渐变视图View
- 阿里云服务器如何进行网站域名解析?
- 开源版多用户博客系统
- 何謂 Raw Data ?
- 网页游戏开发语言AS3(ActiveScript3.0)
- 关于数据治理的读书笔记 - 什么是数据战略?
- 图形 1.1渲染流水线(知识梳理笔记)
- 密码学的安全性浅析3
- git clone失败:Cloning into... fatal: unable to access... error setting certificate verify locations