1一维热传导问题与C++描述

1.1理论推导

扩散问题的通用方程可以写为:

∇∇Γ+S=0(1)

\begin{equation} \nabla\nabla\Gamma +S = 0\tag{1} \end{equation}

一维热传导问题可以讲上式子简化为来:

ddx(Γdϕdx)+S=0(2)

\begin{equation} \frac{d}{dx}(\Gamma\frac{d\phi}{dx}) +S = 0\tag{2} \end{equation}
将其在网格上离散可以得到下图的控制体单元表示:


将1.2式在网格上积分并利用Gauss定理就可以得到:

∫ΔVddx(Γdϕdx)dV+∫ΔVSdV=(ΓAdϕdx)e−(ΓAdϕdx)w+S¯ΔV=0(3)

\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面上的值即可以写为

(ΓAdϕdx)e=ΓeAeϕE−ϕPδEP(4)

\begin{equation} ({\Gamma}A\frac{d\phi}{dx})_{e}={\Gamma}_{e}A_e\frac{\phi_E-\phi_P}{{\delta}_{EP}}\tag{4} \end{equation}

(ΓAdϕdx)w=ΓwAwϕP−ϕWδPW(5)

\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可以写为:

ΓeAeϕE−ϕPδEP−ΓwAwϕP−ϕWδPW+Su+Spϕp=0(6)

\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}
整理就得到:

aPϕP=aWϕW+aEϕE+Su(7)

\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:

ΓAT2−T1δ21−ΓATP−TAδ1A=0(8)

\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点我们也有:

ΓATB−T5δ5B−ΓAT5−T4δ54=0(8)

\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我们发现实际上对于结构化网格,实际上网格任意一点所需求解的值都仅与相邻网格或者边界上的值相关,我们也就可以用

aPϕP=aWϕW+aEϕE+aNϕN+aSϕS+aTϕT+aBϕB+Su(7)

\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++描述相关推荐

  1. MATLAB模拟导热过程,一维热传导MATLAB模拟.doc

    PAGE 昆 明 学 院 2015 届毕业设计(论文) 设计(论文)题目 一维热传导问题的数值解法及其MATLAB模拟 子课题题目 无 姓 名 伍有超 学 号 201117030225 所 属 系 物 ...

  2. 数值方法3:偏微分方程1:使用有限差分法解一维热传导(扩散)方程

    初学练习,看b站课程,教学为matlab代码,自己写的Python代码,后面会放b站课程链接,感兴趣的同学可以学习观看. 说明:Python初学者,代码可能不够漂亮,欢迎大家批评指正.本系列代码用no ...

  3. 利用有限元法求解一维热传导问题

    我们都知道热传导方程是大名鼎鼎的傅里叶提出的,而对于此方程的解也可以用傅里叶变换的方法得到,但笔者已经记不起该怎么求解了(尽管上学期才刚学过数理方法啊).但是无伤大雅,因为我已经掌握了(其实还没有)对 ...

  4. 热传递 matlab,一维热传导MATLAB模拟.pdf

    昆 明 学 院 2015 届毕业设计(论文) 设计(论文)题目 一维热传导问题的数值解法及其 MATLAB 模拟 子课题题目 无 姓 名 伍有超 学 号 201117030225 所 属 系 物理科学 ...

  5. 一维热传导方程 matlab隐式解,一维热传导偏微分方程的数值解的matlab程序问题出在哪儿?...

    我现在编写了一个求解一维热传导的偏微分方程,调程序都调了好多天了 不知道问题在哪儿,求各位高手帮忙看一下好么? 我在此表示万分感谢 需求解的方程看图片,我的程序如下 %---------------- ...

  6. Python——求解一维热传导

    1.问题 求一维热传导方程混合问题: 求解其的数值解,取N=10,h=0.1,计算到K=36为止. 2.程序 #python import numpy as np import matplotlib. ...

  7. 金属热传导的matlab,热传导matlab代码

    · 昆明学院 2015 届毕业设计(论文) 设计(论文)题目 一维热传导问题的数值解法及其 MATLAB 模拟 子课题题目 无 姓名 学号 所属系 专业年级 指导教师 伍有超 5...... Comp ...

  8. 多维卷积与一维卷积的统一性(运算篇)

    http://blog.sina.com.cn/s/blog_7445c2940102wmrp.html 多维卷积与一维卷积的统一性(运算篇) 转载2016-10-16 16:00:31 标签:卷积二 ...

  9. 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组

    整篇文章为对java数组的完整理解以及部分排序,并有一些简单的demo,经典的案例与蓝桥杯的一些经典数组题有专门的文章梳理. 目录 数组概述 什么是数组 数组的结构 数组的特点: 数组分类 一维数组声 ...

  10. 计算机视觉大型攻略 —— 特征与匹配(3)特征描述符

    接上一篇文章.这篇写特征描述符.特征匹配算法在确定角点后,还需要使用描述符来描述这些角点. 本文参考书籍:Computer Vision: Algorithms and Applications, R ...

最新文章

  1. oracle 回滚段介绍(三)
  2. 函数式编程学习之路(一)
  3. SAP UI5 extension component loads standard component
  4. react动画库_React 2020动画库
  5. 人工智能AI实战100讲(六)-利用CNN来检测伪造图像
  6. 函数传参string_C/C++的三种函数传值方式及其区别
  7. eclipse使用小技巧
  8. 22.C++- 继承与组合,protected访问级别
  9. http://blog.sina.com.cn/s/blog_6145ed810102vr8k.html
  10. Java中字符输入输出流
  11. 数组的几种定义方式及初始化
  12. iOS开发之创建颜色渐变视图View
  13. 阿里云服务器如何进行网站域名解析?
  14. 开源版多用户博客系统
  15. 何謂 Raw Data ?
  16. 网页游戏开发语言AS3(ActiveScript3.0)
  17. 关于数据治理的读书笔记 - 什么是数据战略?
  18. 图形 1.1渲染流水线(知识梳理笔记)
  19. 密码学的安全性浅析3
  20. git clone失败:Cloning into... fatal: unable to access... error setting certificate verify locations

热门文章

  1. fckeditor java_FCKeditor.Java 源代码下载
  2. 用友打印问题合集 二【各模块】
  3. Linux下的经典软件
  4. 安卓设计模式のAdapter模式
  5. 怎么选择boost升压电路的电感?只要三个公式
  6. 显卡天梯图2022年4月 最新显卡性能排行天梯图
  7. xposed 入门之修改手机 IMEI
  8. VC 2015 x86的DLL绿色包(QT 5.6)
  9. 超市管理系统java_java实现超市管理系统
  10. 通过libxml2的xpath解析xml