python之有限体积法求解一维热传导问题

news2024/11/14 5:37:06

1、问题描述

考虑均匀发热无限大平板的稳定导热问题,上图中,A、B两面恒温,控制方程为如下形式:

\frac{\partial }{\partial x}\left(\Gamma {\frac{\partial \phi }{\partial x}} +S_\phi \right )=0

\Gamma为扩散系数,k为材料传热系数,给定厚度L=2cmk=5W/\left(m^2\cdot K \right )T_AT_B分别为100℃和400℃,发热量q为500kW/m^3,确定平板内的稳态温度分布?

2、基于有限体积法的公式推导

假定在y方向和z方向上尺寸无限大,温度梯度只在x方向上有意义。

把整个区域划分为4个控制体,给定\delta x=0.005m

由于传热系数是常数,定义k=k_e=k_w,体机源项S_\phi =q,节点2处的一般离散形式为

a_PT_P=a_ET_E+a_WT_W+b

其中

a_E=\frac{kA}{\delta x^2}

a_W=\frac{kA}{\delta x^2}

a_P=a_E+a_W

b=p

节点3得到控制方程和节点2一样。

对于节点1和4的控制体,在边界点和临近点之间的温度,采用线性近似。

对于恒定传热系数和热流量,方程变为

k\left(\frac{\partial T}{\partial x} \right )_e-k\left(\frac{\partial T}{\partial x} \right )_w+q\delta x=0

在控制体1的左侧和右侧,引入线性梯度近似:

kA\cdot\frac{T_E-T_P}{\delta x}-kA\cdot\frac{T_P-T_A}{\delta x/2}+q\delta x=0

对于节点1,得到离散方程:

a_PT_P=a_ET_E+a_WT_W+b

其中

a_E=\frac{kA}{\delta x^2}

a_W=0

a_P=a_E+a_W+\frac{2kA}{\delta x}

b=q\delta x+\frac{2kA}{\delta x}T_A

同理,节点4的离散方程为:

a_PT_P=a_ET_E+a_WT_W+b

其中

a_E=0

a_W=\frac{kA}{\delta x^2}

a_P=a_E+a_W+\frac{2kA}{\delta x}

b=q\delta x+\frac{2kA}{\delta x}T_B

将传热系数k=5W/\left(m^2\cdot K \right ),热流量q=500kW/m^3\delta x=0.005m以及单位面积A=1m^2等系数代入离散方程,得到如下方程组:

\begin{bmatrix} 3000&-1000 &0 &0 \\ -1000&2000 &-1000 &0 \\ 0&-1000 &2000 &-1000 \\ 0&0 &-1000 &3000 \end{bmatrix}  \begin{bmatrix} T1\\ T2 \\ T3 \\T4 \end{bmatrix} =\begin{bmatrix} 2000T_A+2500\\ 2500 \\ 2500 \\2000T_B+2500 \end{bmatrix}

3、python求解分析

3.1高斯消去法

高斯消去法是一种线性代数中的算法,用于求解线性方程组。它的优点和缺点如下:

优点:

精度高:高斯消去法通过将系数矩阵化为上三角矩阵,减少了求解过程中的误差,提高了求解的精度。

稳定性好:在求解过程中,高斯消去法通过选取主元来保证计算的稳定性。主元的选取可以避免出现除数为零的情况,从而保证了计算的稳定性。

可扩展性强:高斯消去法可以很容易地扩展到求解更大规模的线性方程组。只需要增加计算机的存储空间和计算能力,就可以求解更大规模的线性方程组。

算法简单易懂:高斯消去法的求解过程可以通过手工计算来理解,也可以通过编程实现来求解。

缺点:

计算量大:高斯消去法的计算量较大,尤其是在求解大规模线性方程组时,计算量更是巨大。这会导致求解时间较长,不适合实时求解。

存储空间大:高斯消去法需要存储系数矩阵和常数向量,这会占用较大的存储空间。在求解大规模线性方程组时,存储空间的需求更是巨大。

主元选取困难:高斯消去法的主元选取对计算结果的影响很大。如果选取不当,会导致计算结果的不稳定性和精度下降。因此,主元选取是一个比较困难的问题。

无法处理奇异矩阵:如果系数矩阵是奇异矩阵,那么高斯消去法将无法求解线性方程组。

import numpy as np
def gauss(a, b):
    m, n = a.shape
    c = np.zeros(n)
    for i in range(n):
        if (a[i][i] == 0): # 用高斯消去法解线性方程组时对角线元素不能为0
            print("no answer")

# k表示第一层循环,(0,n-1)行
# i表示第二层循环,(k+1,n)行,计算该行消元的系数
# j表示列
    for k in range(n - 1):
        for i in range(k + 1, n):
            c[i] = a[i][k] / a[k][k] # 计算出系数

            for j in range(k,m): # 从K开始,减少不必要的计算
                a[i][j] = a[i][j] - c[i] * a[k][j] # 对矩阵进行高斯消去
            b[i] = b[i] - c[i] * b[k]

        print('step',k,':n',a,'n')
#print(b)
    x = np.zeros(n)

    x[n - 1] = b[n - 1] / a[n - 1][n - 1] # 解出x[n-1],为回代作准备

# 回代求出方程解
    for i in range(n-2, -1, -1):
        sum= 0.0
        for j in range(n-1, -1, -1):
            sum= sum + a[i][j] * x[j]
        x[i] = (b[i]-sum) / a[i][i]
# 输出计算结果
    for i in range(n):
        print("x" + str(i + 1) + " = ","%.2f" % x[i]) # 输出结果

if __name__ == '__main__':
    A = np.array([
        [3000, -1000, 0, 0],
        [-1000, 2000, -1000, 0],
        [0, -1000, 2000, -1000],
        [0, 0, -1000, 3000],
    ])
    b = np.array([202500, 2500, 2500, 802500])
    gauss(A, b)

step 0 :n [[ 3000 -1000     0     0]
 [    0  1666 -1000     0]
 [    0 -1000  2000 -1000]
 [    0     0 -1000  3000]] n
step 1 :n [[ 3000 -1000     0     0]
 [    0  1666 -1000     0]
 [    0     0  1399 -1000]
 [    0     0 -1000  3000]] n
step 2 :n [[ 3000 -1000     0     0]
 [    0  1666 -1000     0]
 [    0     0  1399 -1000]
 [    0     0     0  2285]] n
x1 =  140.09
x2 =  217.77
x3 =  292.81
x4 =  365.13
 

3.2TDMA算法

TDMA算法,即三对角矩阵算法,是一种用于求解具有三对角线系数矩阵的代数方程组的算法。

其优点有:

高效:TDMA算法的计算复杂度为O(n),n为方程组的大小。这意味着对于较大规模的方程组,该算法能够快速求解。

稳定性高:该算法在求解过程中,不会出现数值不稳定性或误差累积的问题。

然而,它也有一些缺点:

需要额外的存储空间:对于大规模的问题,需要额外的存储空间来存储中间计算结果。

对初值敏感:TDMA算法的收敛速度可能会受到初值的影响,如果初值选择不当,可能会导致算法不收敛或者收敛速度很慢。

需要精确计算:由于涉及到大量的浮点运算,如果硬件或者软件出现故障,可能会导致计算结果不准确。

需要专业训练:该算法需要专业训练才能理解和使用,对于非专业人员来说可能会有一定的学习难度。

import numpy as np
def tdma(A,b):
    m,n = A.shape
    p = np.zeros(m)
    q = np.zeros(n)
    phi = np.zeros(m)

    p[0] = -A[0,1]/A[0,0]
    q[0] = b[0]/A[0,0]

    for i in range(1,m):
        if i != m-1 :
            p[i] = -A[i,i+1]/(A[i,i]+A[i,i-1]*p[i-1])
        else:
            p[i]= 0
        q[i] = (b[i]-A[i,i-1]*q[i-1])/(A[i,i]+A[i,i-1]*p[i-1])

    # 回代
    phi[m-1] = q[m-1]
    for i in range(m-2,-1,-1):
        phi[i] = p[i]*phi[i+1] +q[i]

    return phi

# 测试
A = np.array([
    [3000,-1000,0,0],
    [-1000,2000,-1000,0],
    [0,-1000,2000,-1000],
    [0,0,-1000,3000],
])
b = np.array([202500,2500,2500,802500])

phi = tdma(A,b)
print(phi)

[140.  217.5 292.5 365. ]

3.3雅可比迭代法

雅可比迭代法是一种求解线性方程组的迭代方法,其优点和缺点如下:

优点:

计算公式简单:雅可比迭代法的计算公式简单明了,每迭代一次只需要计算一次矩阵和向量的乘法。

并行计算:由于在计算过程中原始矩阵始终不变,因此雅可比迭代法比较容易进行并行计算。

缺点:

收敛速度较慢:雅可比迭代法的收敛速度通常比其他一些迭代方法慢,如高斯-赛德尔迭代法或牛顿法等。

存储空间较大:雅可比迭代法需要存储方程组的系数矩阵和常数向量,因此需要较大的存储空间,这可能在处理大规模问题时成为限制。

import numpy as np
# A为系数矩阵,b为结果矩阵
# k为最大迭代次数,tol为容差限
def Jacobi(A,b,k,tol):
    n = A.shape[1]
    D = np.eye(n)
    D[np.arange(n),np.arange(n)] = A[np.arange(n),np.arange(n)]
    LU = A - D
    X = np.zeros(n)

    # 迭代k次
    for i in range(k):
        X1= X.copy()
        D_inv = np.linalg.inv(D)
        X = -np.dot(np.dot(D_inv,LU),X) + np.dot(D_inv,b)
        if (np.max(np.abs(X-X1)))<=tol:
            print('计算收敛!')
            break
        print('n第',i,'次迭代:',X)
        print('残差值为:',np.abs(X-X1))
        print('当前最大残差为:', np.max(np.abs(X-X1)))
    return X

A = np.array([
    [3000,-1000,0,0],
    [-1000,2000,-1000,0],
    [0,-1000,2000,-1000],
    [0,0,-1000,3000],
])
b = np.array([202500,2500,2500,802500])
X = Jacobi(A, b, 1000,0.005)

n第 32 次迭代: [139.99525386 217.49138441 292.48962427 364.996059  ]
残差值为: [0.00066203 0.00562283 0.00144728 0.00257203]
当前最大残差为: 0.005622829086746606
计算收敛!

3.4高斯赛德尔迭代法

高斯-赛德尔迭代法是一种求解线性方程组的迭代方法,其优点和缺点如下:

优点:

收敛速度快:高斯-赛德尔迭代法通常具有较快的收敛速度,可以在较短的时间内求解出方程组的近似解。

适用范围广:高斯-赛德尔迭代法可以适用于各种线性方程组,无论是大型稀疏矩阵还是小型稠密矩阵都可以得到较好的结果。

计算量较小:相对于其他迭代方法,高斯-赛德尔迭代法的计算量较小,因此在计算时间和内存消耗方面具有优势。

可以处理稀疏矩阵:高斯-赛德尔迭代法可以有效地处理稀疏矩阵,可以减少计算时间和内存消耗。

缺点:

对系数矩阵的条件有要求:高斯-赛德尔迭代法的收敛性与系数矩阵的条件有关,如果系数矩阵不是正定矩阵或其条件数太大,可能会导致迭代不收敛或收敛速度慢。

需要选择适当的迭代参数:高斯-赛德尔迭代法的收敛速度和计算精度与初始迭代参数的选择有关,如果参数选择不当,可能会导致迭代不收敛或收敛速度慢。

对计算机内存要求较高:当处理大型稀疏矩阵时,高斯-赛德尔迭代法需要占用大量的内存空间来存储矩阵和向量,因此对计算机内存要求较高。

import numpy as np
# A为系数矩阵,b为结果矩阵
# k为最大迭代次数,tol为容差限
def Guauss_seidel(A,b,k,tol):
    n = A.shape[1]
    D = np.eye(n)
    D[np.arange(n),np.arange(n)] = A[np.arange(n),np.arange(n)]
    LU = A - D
    # 得到LU的上、下三角矩阵
    L = np.tril(LU)
    U = np.triu(LU)
    D_L = D + L
    X = np.zeros(n)

    # 迭代k次
    for i in range(k):
        X1= X.copy()
        D_L_inv = np.linalg.inv(D_L)
        X = -np.dot(np.dot(D_L_inv,U),X) + np.dot(D_L_inv,b)

        if (np.max(np.abs(X-X1)))<=tol:
            print('计算收敛!')
            break
        print('n第',i,'次迭代:',X)
        print('残差值为:',np.abs(X-X1))
        print('当前最大残差为:', np.max(np.abs(X-X1)))
    return X

A = np.array([
    [3000,-1000,0,0],
    [-1000,2000,-1000,0],
    [0,-1000,2000,-1000],
    [0,0,-1000,3000],
])
b = np.array([202500,2500,2500,802500])
X = Guauss_seidel(A, b, 1000,0.005)

n第 17 次迭代: [139.99560885 217.49300459 292.49490235 364.99830078]
残差值为: [0.00387807 0.00617804 0.00450202 0.00150067]
当前最大残差为: 0.006178036008577692
计算收敛!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】红黑树插入操作实现以及验证红黑树是否正确

文章目录 前言一、红黑树的插入操作1.红黑树结点的定义2.红黑树的插入1.uncle存在且为红2.uncle不存在3.uncle存在且为黑 3.完整代码 二、是否为红黑树的验证1.IsBlance函数2.CheckColor函数 三、红黑树与AVL树的比较 前言 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在…

气传导耳机什么意思?备受好评的气传导耳机推荐

​气传导耳机是近年来备受关注的一种新型耳机&#xff0c;它采用了独特的设计&#xff0c;将声音通过空气传递到耳朵&#xff0c;从而实现听音乐的效果。与传统的入耳式耳机相比&#xff0c;气传导耳机在听音乐的同时还能听到周围环境声音&#xff0c;提高了安全性和舒适性。如…

开学什么牌子的电容笔质量好耐用?精选4款好用的电容笔

随着新学期开始&#xff0c;我们该准备些什么&#xff1f;随着技术的发展&#xff0c;ipad上出现了各种各样的电容笔。一支好的电容笔&#xff0c;不但可以极大地提升我们的学习效率&#xff0c;也可以极大地提升我们的工作效率。国内厂商生产的这支平替电容笔&#xff0c;无论…

「网页开发|后端开发|Flask」08 python接口开发快速入门:技术选型写一个HelloWorld接口

本文主要介绍为网站搭建后端时的技术选型考虑&#xff0c;以及通过写一个简单的HelloWorld接口快速了解前端和后端交互的流程。 文章目录 本系列前文传送门一、场景说明二、后端语言技术选型三、后端框架技术选型Django 特点Flask 特点FastAPI 特点Tarnado 特点 四、用Flask先…

Gin 打包vue或react项目输出文件到程序二进制文件

Gin 打包vue或react项目输出文件到程序二进制文件 背景解决方案1. 示例目录结构2. 有如下问题要解决:3. 方案探索 效果 背景 前后端分离已成为行业主流&#xff0c;vue或react等项目生成的文件独立在一个单独目录&#xff0c;与后端项目无关。 实际部署中&#xff0c;通常前面套…

Scrum敏捷开发端到端管理流程

Leangoo领歌是Scrum中文网&#xff08;scrum.cn&#xff09;旗下的一款永久免费的敏捷研发管理工具。 Leangoo领歌覆盖了敏捷研发全流程&#xff0c;它提供端到端敏捷研发管理解决方案&#xff0c;包括小型团队敏捷开发&#xff0c;规模化敏捷SAFe&#xff0c;Scrum of Scrums…

父子进程区别与GDB多进程调试

父子进程之间的关系&#xff1a; 区别&#xff1a; 1.fork()函数的返回值不同&#xff0c;父进程中&#xff1a;>0 返回的子进程ID 子进程中&#xff1a;ID0 2.pcb中的数据有区别&#xff0c;当前进程的id pid &#xff0c;当前父进程的id ppid&#xff0c;信号集 共同点…

黑马头条 后端项目部署_持续集成 Jenkins配置

项目部署_持续集成 1 今日内容介绍 1.1 什么是持续集成 持续集成&#xff08; Continuous integration &#xff0c; 简称 CI &#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干 持续集成的组成要素 一个自动构建过程&#xff0c; 从检出…

如何在RK3568开发板上实现USBNET?——飞凌嵌入式/USB Gadget/USB-NET/网络

本文将借助飞凌嵌入式OK3568-C开发板为大家介绍实现USBNET模式的方法&#xff0c;在这之前需要先知道什么是USB Gadget——USB Gadget是指所开发的电子设备以USB从设备的模式通过USB连接到主机。举个例子&#xff1a;将手机通过USB线插入PC后&#xff0c;手机就是USB Gadget。同…

【IP数据报】IP地址和MAC地址的区别

1、用IP地址来标识Internet的主机 在每个IP数据报中&#xff0c;都会携带源IP地址和目标IP地址来标识该IP数据报的源和目的主机。IP数据报在传输过程中&#xff0c;每个中间节点(IP 网关)还需要为其选择从源主机到目的主机的合适的转发路径(即路由)。IP协议可以根据路由选择协…

Android Update Engine 分析(十九)Extent 到底是个什么鬼?

文章目录 0. 导读1. 什么是 Extent?1. 什么是 Extent?2. Wikipedia 中的解释3. Ext4 中的 Extent2. Android OTA 中的 Extent2.1 update_metadata.proto 中的 Extent2.2 update engine 代码中的 Extentpayload_consumer 中的 Extentpayload_generator 中的 Extent2.3 OTA 中的…

Shell 正则表达式及综合案例及文本处理工具

目录 一、常规匹配 二、常用特殊字符 三、匹配手机号 四、案例之归档文件 五、案例之定时归档文件 六、Shell文本处理工具 1. cut工具 2. awk工具 一、常规匹配 一串不包含特殊字符的正则表达式匹配它自己 例子&#xff0c;比如说想要查看密码包含root字符串的&#x…

【华为云云耀云服务器L实例评测|云原生】自定制轻量化表单Docker快速部署云耀云服务器

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

发现某设备 adb shell ps 没有输出完整信息

某错误示例 并不是都使用 -ef 参数查找都能够返回完整信息&#xff0c;某些版本设备不适用 -ef 也不会返回完整信息。 简单兼容 简单兼容不同版本 Android 设备查找进程列表&#xff0c;没有通过脚本判断 Android 版本&#xff0c;如有兴趣可以自己修改。 :loop adb shell…

代码配置仓库GitLab安装部署

Github是目前世界上代码行数最多的在线软件版本配置库平台&#xff0c;而Gitlab是Github对应的开源版本&#xff0c;本文主要描述Gitlab的安装部署。 https://about.gitlab.com/ https://gitlab.cn/install/ 如上所示&#xff0c;从官方网站中下载不同操作系统的版本&#xf…

聚合物发光材料荧光量子效率测量

近年来‚聚合物发光材料与器件受到人们的极大关注和高度重视‚其关键是聚合物发光器件具有光吸收范围宽‚吸收强度大‚发光效率高‚激发阈值低以及制备工艺简便灵活等显著特点‚已成为有机固体激光领域一个新的研究热点。 现有的聚合物发光材料体系主要集中在&#xff1a;聚噻…

04-Flask-新版Flask运行方式

新版Flask运行方式 前言老版本运行方式新版本运行方式命令行方式运行pycharm运行 前言 本篇来学习下新版Flask运行方式 老版本运行方式 app.run()&#xff1a;1.0之前版本 # -*- coding: utf-8 -*- # Time : 2023/9/16 # Author : 大海# 导入flask from flask import F…

react路由02——react-routerV6 中路由表的使用(useRoutes钩子)

react路由02——react-routerV6 中路由表的使用&#xff08;useRoutes钩子&#xff09; 1. 不使用路由表1.1 关于react-routerV6路由简单使用1.2 未配置路由表 2. 路由表——useRoutes钩子2.1 配置路由表2.2 一级路由组件——useRoutes钩子2.3 二级路由组件——Outlet组件2.4 目…

进化算法、遗传编程和学习

一、说明 进化算法是一系列搜索算法&#xff0c;其灵感来自自然界&#xff08;达尔文主义&#xff09;进化过程。所有不同家庭成员的共同点是&#xff0c;通过应用受自然遗传学和自然选择启发的 算子&#xff0c;通过进化出最初 随机的候选解决方案群体来解决问题&#…

打包发布异常01

缺一不可 Build starting... Start: Fri Sep 15 08:07:01 UTC 2023 bfdf11d63b70 Git: 0.33-0-g6190381 commit 61903816b88ff5cf3e0848cd19fcb190af0801cd Author: 米伟强 Date: Fri Sep 15 15:57:28 2023 0800gradle插件版本Init SDKMan Found Android manifest Android …