当前位置: 首页 > article >正文

有限体积法:基于一维稳态扩散问题及其程序实现

文章目录

      • 有限体积法:基于一维稳态扩散问题及其程序实现
        • 1. 问题描述
        • 2. 有限体积法的应用步骤
          • 2.1 步骤一:生成离散网格
          • 2.2 步骤二:构造离散方程
          • 2.3 步骤三:解方程组
        • 3. 编程实现
        • 4. 总结

有限体积法:基于一维稳态扩散问题及其程序实现

在工程与科学计算中,有限体积法(Finite Volume Method, FVM)是一种常用的数值方法,广泛用于求解偏微分方程,特别是在计算流体动力学(CFD)中。本文将以一个经典的一维稳态导热问题为例,详细介绍有限体积法的应用步骤,并结合 Matlab 编程实现,展示其求解过程。

1. 问题描述

我们考虑一个无内热源的一维稳态导热问题,如下图所示:

  • 棒的长度为 L = 0.5  m L = 0.5\ \text{m} L=0.5 m,截面积为 A = 10 × 1 0 − 3   m 2 A = 10 \times 10^{-3}\ \text{m}^2 A=10×103 m2
  • 左端温度保持在 T A = 10 0 ∘ C T_A = 100^\circ\text{C} TA=100C,右端温度保持在 T B = 50 0 ∘ C T_B = 500^\circ\text{C} TB=500C
  • 棒的导热系数为 k = 1000  W / ( m ⋅ K ) k = 1000\ \text{W}/(\text{m}\cdot\text{K}) k=1000 W/(mK)

求解该棒在稳态下的温度分布。
稳态导热棒

2. 有限体积法的应用步骤

有限体积法求解一维稳态导热问题的步骤可以分为以下三步:

2.1 步骤一:生成离散网格

首先,将求解域划分为若干个控制体积。这里将棒分为 5 个控制体积,每个体积对应一个节点。节点间的距离 δ x = 0.1  m \delta x = 0.1\ \text{m} δx=0.1 m。如下图所示,这些节点标号为 1 到 5。
绝热棒离散网络

2.2 步骤二:构造离散方程

根据导热问题的控制方程:

d d x ( k A d T d x ) = 0 \frac{d}{dx}\left( kA\frac{dT}{dx} \right) = 0 dxd(kAdxdT)=0

在没有内热源的情况下,导热方程可以简化为:

k A d 2 T d x 2 = 0 kA \frac{d^2 T}{dx^2} = 0 kAdx2d2T=0

在离散化过程中,节点 2、3 和 4 的离散方程如下:

a P T P = a W T W + a E T E a_P T_P = a_W T_W + a_E T_E aPTP=aWTW+aETE

其中 a W = k A δ x a_W = \frac{kA}{\delta x} aW=δxkA a E = k A δ x a_E = \frac{kA}{\delta x} aE=δxkA a P = a W + a E a_P = a_W + a_E aP=aW+aE

对于边界节点 1 和 5,离散方程的处理稍有不同。以节点 1 为例,其离散方程为:

( k δ x A + 2 k δ x A ) T 1 = k δ x A T 2 + 2 k δ x A T A \left( \frac{k}{\delta x}A + \frac{2k}{\delta x}A \right) T_1 = \frac{k}{\delta x}A T_2 + \frac{2k}{\delta x}A T_A (δxkA+δx2kA)T1=δxkAT2+δx2kATA

通过类似方法,节点 5 的离散方程可以表示为:

( k δ x A + 2 k δ x A ) T 5 = k δ x A T 4 + 2 k δ x A T B \left( \frac{k}{\delta x}A + \frac{2k}{\delta x}A \right) T_5 = \frac{k}{\delta x}A T_4 + \frac{2k}{\delta x}A T_B (δxkA+δx2kA)T5=δxkAT4+δx2kATB

将离散方程组合成一个线性方程组:

300 T 1 = 100 T 2 + 200 T A 200 T 2 = 100 T 1 + 100 T 3 200 T 3 = 100 T 2 + 100 T 4 200 T 4 = 100 T 3 + 100 T 5 300 T 5 = 100 T 4 + 200 T B \begin{aligned} 300 T_1 &= 100 T_2 + 200 T_A \\ 200 T_2 &= 100 T_1 + 100 T_3 \\ 200 T_3 &= 100 T_2 + 100 T_4 \\ 200 T_4 &= 100 T_3 + 100 T_5 \\ 300 T_5 &= 100 T_4 + 200 T_B \end{aligned} 300T1200T2200T3200T4300T5=100T2+200TA=100T1+100T3=100T2+100T4=100T3+100T5=100T4+200TB
写成矩阵形式有

[ 300 − 100 0 0 0 − 100 200 − 100 0 0 0 − 100 200 − 100 0 0 0 − 100 200 − 100 0 0 0 − 100 300 ] { T 1 T 2 T 3 T 4 T 5 ] = { 200 T A 0 0 0 200 T B } \left[\begin{array}{ccccc} 300 & -100 & 0 & 0 & 0 \\ -100 & 200 & -100 & 0 & 0 \\ 0 & -100 & 200 & -100 & 0 \\ 0 & 0 & -100 & 200 & -100 \\ 0 & 0 & 0 & -100 & 300 \end{array}\right]\left\{\begin{array}{c} T_1 \\ T_2 \\ T_3 \\ T_4 \\ T_5 \end{array}\right]=\left\{\begin{array}{c} 200 T_A \\ 0 \\ 0 \\ 0 \\ 200 T_B \end{array}\right\} 300100000100200100000100200100000100200100000100300 T1T2T3T4T5 = 200TA000200TB

2.3 步骤三:解方程组

T A = 100 , T B = 500 T_A=100, T_B=500 TA=100,TB=500 代入, 解此方程组, 可得

{ T 1 T 2 T 3 T 4 T 5 } = { 140 220 300 380 460 } \left\{\begin{array}{l} T_1 \\ T_2 \\ T_3 \\ T_4 \\ T_5 \end{array}\right\}=\left\{\begin{array}{l} 140 \\ 220 \\ 300 \\ 380 \\ 460 \end{array}\right\} T1T2T3T4T5 = 140220300380460

此两端固定温度值的绝热棒稳态分析解为线性温度分布:

T = 800 x + 100 T=800 x+100 T=800x+100

下图为分析解与数值解的图形比较, 从中可以看出数值解有很高的计算精度(随着网格加密精度将进一步提高)。
在这里插入图片描述

3. 编程实现

以下是基于 Matlab 的编程实现:

function temperatureDistribution = computeHeatDistribution()
% 参数初始化
lengthRod = 0.5;  % 棒的长度
thermalConductivity = 1000;  % 导热系数
temperatureLeft = 100;  % 左端温度
temperatureRight = 500;  % 右端温度
numNodes = 5;  % 节点数
deltaX = lengthRod / (numNodes - 1);  % 控制容积宽度

% 系数矩阵和右端项初始化
coeffMatrix = zeros(numNodes, numNodes);
rhs = zeros(numNodes, 1);

% 内部节点的离散方程
for i = 2:numNodes-1
    coeffMatrix(i, i-1) = thermalConductivity / deltaX;
    coeffMatrix(i, i) = -2 * thermalConductivity / deltaX;
    coeffMatrix(i, i+1) = thermalConductivity / deltaX;
end

% 边界条件
coeffMatrix(1, 1) = 3 * thermalConductivity / deltaX;
coeffMatrix(1, 2) = -thermalConductivity / deltaX;
rhs(1) = 2 * thermalConductivity / deltaX * temperatureLeft;

coeffMatrix(numNodes, numNodes-1) = -thermalConductivity / deltaX;
coeffMatrix(numNodes, numNodes) = 3 * thermalConductivity / deltaX;
rhs(numNodes) = 2 * thermalConductivity / deltaX * temperatureRight;

% 求解线性方程组
temperatureDistribution = coeffMatrix \ rhs;

% 计算分析解
x = linspace(0, lengthRod, 100);
analyticalSolution = 800 * x + 100;

% 绘图
figure;
plot(x, analyticalSolution, '--', 'LineWidth', 1.5, 'Color', [0, 0.6, 0.3]);
hold on;
plot(linspace(deltaX/2, lengthRod-deltaX/2, numNodes), temperatureDistribution, 'o', 'MarkerSize', 8 , 'LineWidth', 1.5, 'MarkerSize', 8, 'Color', [0.7, 0.2, 0.2]);
hold on;
% 添加边界点
plot([0, lengthRod], [temperatureLeft, temperatureRight], 'o', 'MarkerSize', 8, 'LineWidth', 1.5, 'Color', [0.7, 0.2, 0.2]);
xlabel('位置 (m)', 'FontSize', 12, 'FontWeight', 'bold');
ylabel('温度 (°C)', 'FontSize', 12, 'FontWeight', 'bold');
title('一维稳态导热问题的温度分布', 'FontSize', 14, 'FontWeight', 'bold');
legend('精确解', '数值解', 'Location', 'Best');
grid on;
set(gca, 'FontSize', 10);
hold off;

% 输出数值解
fprintf('数值解:\n');
disp(temperatureDistribution);
end

该代码通过构建系数矩阵和右端项,利用 Matlab 内置的线性方程求解函数,得到了每个节点的温度分布。最终的温度分布图如图 2-5 所示,数值解与理论解具有良好的吻合性,验证了有限体积法在该问题中的有效性。

4. 总结

本文通过详细解析一维稳态导热问题的有限体积法求解过程,结合一维稳态扩散问题展示了从问题描述到离散化再到数值求解的完整流程。通过该案例,读者可以更深入地理解有限体积法的基本原理和应用场景,为进一步的数值计算研究奠定基础。


http://www.kler.cn/a/295104.html

相关文章:

  • 在linux中使用nload实时查看网卡流量
  • Openstack7--安装消息队列服务RabbitMQ
  • 时序数据库TimescaleDB安装部署以及常见使用
  • 机器学习day3-KNN算法、模型调优与选择
  • 使用Matlab建立随机森林
  • 若依笔记(八):Docker容器化并部署到公网
  • sping boot 基于 RESTful 风格,模拟增删改查操作
  • 【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)
  • 使用LSTM(长短期记忆网络)模型预测股票价格的实例分析
  • 复旦大学王龑团队发布《静态与动态情感的面部表情识别》综述
  • 漫谈设计模式 [5]:建造者模式
  • 通用内存快照裁剪压缩库Tailor介绍及源码分析(一)
  • ubuntu安装maven
  • C++可以被重载的操作符Overloadable operators
  • SpringBoot 依赖之 Spring for RabbitMQ
  • LabVIEW如何确保采集卡稳定运行
  • 基于SSM+Vue+MySQL的可视化高校公寓管理系统
  • 【Qt笔记】QUndoView控件详解
  • 大数据开发职场:理性分析拖延
  • box64 安装
  • 开源模型应用落地-LlamaIndex学习之旅-LLMs-集成vLLM(二)
  • [Linux]:环境变量与进程地址空间
  • Python中的私有属性与方法:解锁面向对象编程的秘密
  • django ubuntu 踩坑集锦
  • jmeter之TPS计算公式
  • Kafka命令