隐式差分+追赶法求解PDE

2024-09-03 06:12
文章标签 差分 求解 隐式 pde 追赶

本文主要是介绍隐式差分+追赶法求解PDE,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

偏微分方程的求解一般分为两步:

(1)利用有限差分构造出三对角矩阵,而有限差分又分为三种:显式差分、隐式差分、C-N差分(即六点差分)有限差分学习笔记-CSDN博客

(2)追赶法求解三对角矩阵:

         三对角矩阵算法(英语:tridiagonal matrix algorithm),又称为托马斯算法(Thomas algorithm,名称源于英国数学家卢埃林·托马斯)是数值线性代数中的一种算法,通过简化形式的高斯消元法求解三对角矩阵。包含n个未知数的三对角方程组可以写成

{\displaystyle a_{i}x_{i-1}+b_{i}x_{i}+c_{i}x_{i+1}=d_{i},\,\!}

其中a1=0、 cn=0写成矩阵形式则为

{\displaystyle {\begin{bmatrix}{b_{1}}&{c_{1}}&{}&{}&{0}\\{a_{2}}&{b_{2}}&{c_{2}}&{}&{}\\{}&{a_{3}}&{b_{3}}&\ddots &{}\\{}&{}&\ddots &\ddots &{c_{n-1}}\\{0}&{}&{}&{a_{n}}&{b_{n}}\\\end{bmatrix}}{\begin{bmatrix}{x_{1}}\\{x_{2}}\\{x_{3}}\\\vdots \\{x_{n}}\\\end{bmatrix}}={\begin{bmatrix}{d_{1}}\\{d_{2}}\\{d_{3}}\\\vdots \\{d_{n}}\\\end{bmatrix}}.}

高斯消元法在求解一般线性方程组时需要{\displaystyle O(n^{3})}时间复杂度,但对于三对角系统则只需{\displaystyle O(n)}复杂度。

原理

三对角矩阵算法可分为如下两步进行。第一步求解系数{\displaystyle c_{i}'}{\displaystyle d_{i}'}

{\displaystyle c'_{i}={\begin{cases}{\begin{array}{lcl}{\cfrac {c_{i}}{b_{i}}}&;&i=1\\{\cfrac {c_{i}}{b_{i}-a_{i}c'_{i-1}}}&;&i=2,3,\dots ,n-1\\\end{array}}\end{cases}}\,}

以及

{\displaystyle d'_{i}={\begin{cases}{\begin{array}{lcl}{\cfrac {d_{i}}{b_{i}}}&;&i=1\\{\cfrac {d_{i}-a_{i}d'_{i-1}}{b_{i}-a_{i}c'_{i-1}}}&;&i=2,3,\dots ,n.\\\end{array}}\end{cases}}\,}

第二步通过回代得到最终结果:

{\displaystyle x_{n}=d'_{n}\,}\\ {\displaystyle x_{i}=d'_{i}-c'_{i}x_{i+1}\qquad ;\ i=n-1,n-2,\ldots ,1.}

举例

实现

clear;%清除工作区变量
clc;%清屏
close all;%关闭所有图形窗口z=[];
h=8.6125; %空气交换系数
%% 材料参数输入
m1=6;m2=60;m3=36;m4=50;% 分别对四种介质分割
m=m1+m2+m3+m4;% 介质分割和
n=5400;% 对时间分割
t=5400;% 总时长
l1=0.6/1000;l2=6/1000;l3=3.6/1000;l4=5/1000;% 四种材料厚度
lam_1=0.082;lam_2=0.37;lam_3=0.045;lam_4=0.028;% 四种材料的热传导率
de_1=300;de_2=862;de_3=74.2;de_4=1.18;% 四种材料的密度
c1=1377;c2=2100;c3=1726;c4=1005;% 四种材料的比热容%% 计算热扩散率
a1=lam_1/(c1*de_1);% I层材料的热扩散率
a2=lam_2/(c2*de_2);% II层材料的热扩散率
a3=lam_3/(c3*de_3);% III层材料的热扩散率
a4=lam_4/(c4*de_4);% IV层材料的热扩散率%% 材料长度分割和时间步长分割求解
derta_x1=l1/m1;% I层材料的分割长度
derta_x2=l2/m2;% II层材料的分割长度
derta_x3=l3/m3;% III层材料的分割长度
derta_x4=l4/m4;% IV层材料的分割长度
derta_t=t/n;% 时间步长分割%% 计算各层介质剖分的步长比
r1=derta_t/derta_x1^2*a1;% 第I层介质剖分的步长比
r2=derta_t/derta_x2^2*a2;% 第II层介质剖分的步长比
r3=derta_t/derta_x3^2*a3;% 第III层介质剖分的步长比
r4=derta_t/derta_x4^2*a4;% 第IV层介质剖分的步长比u=zeros(m+1,n+1);% 定义四层耦合介质温度分布矩阵
%% 初始条件和边界条件
u(:,1)=37;%初始条件
u(1,:)=75;%边界条件%% 差分格式的系数矩阵的构造
A=zeros(m,m);
for i=1:m1-1A(i,i)=1+2*r1;A(i,i+1)=-r1;if i>=2A(i,i-1)=-r1;end
end
A(m1,m1)=(lam_1/derta_x1+lam_2/derta_x2);
A(m1,m1-1)=-lam_1/derta_x1;
A(m1,m1+1)=-lam_2/derta_x2;for i=m1+1:m1+m2-1A(i,i)=1+2*r2;A(i,i+1)=-r2;A(i,i-1)=-r2;
end
A(m1+m2,m1+m2)=(lam_2/derta_x2+lam_3/derta_x3);
A(m1+m2,m1+m2-1)=-lam_2/derta_x2;
A(m1+m2,m1+m2+1)=-lam_3/derta_x3;for i=m1+m2+1:m1+m2+m3-1A(i,i)=1+2*r3;A(i,i+1)=-r3;A(i,i-1)=-r3;
end
A(m1+m2+m3,m1+m2+m3)=(lam_3/derta_x3+lam_4/derta_x4);
A(m1+m2+m3,m1+m2+m3-1)=-lam_3/derta_x3;
A(m1+m2+m3,m1+m2+m3+1)=-lam_4/derta_x4;for i=m1+m2+m3+1:m1+m2+m3+m4-1A(i,i)=1+2*r4;A(i,i-1)=-r4;A(i,i+1)=-r4;
end
A(m,m)=h+lam_4/derta_x4;
A(m,m-1)=-lam_4/derta_x4;%% 构造右端项
for k=2:n+1d=zeros(m,1);for i=2:m-1d(i,1)=u(i+1,k-1);endd(1,1)=u(2,k-1)+r1*u(1,k);d(m1,1)=0;d(m1+m2,1)=0;d(m1+m2+m3,1)=0;d(m,1)=37*h;%% 追赶法求解b=diag(A);a=[0;diag(A,-1)];c=diag(A,1);N=length(b);L=zeros(N);L(1)=b(1);D(1)=d(1)/L(1);C(1)=c(1)/L(1);for i=2:(N-1)L(i)=b(i)-a(i)*C(i-1);D(i)=(d(i)-D(i-1)*a(i))/L(i);C(i)=c(i)/L(i);endL(N)=b(N)-a(N)*C(N-1);D(N)=(d(N)-D(N-1)*a(N))/L(N);x(N)=D(N);for i=(N-1):-1:1x(i)=D(i)-C(i)*x(i+1);endu(2:m+1,k)=x';
end%% 绘制不同时刻不同厚度温度分布图
x=1:1:m+1;
t=1:1:t+1;
surf(t,x,u)
shading interp
xlabel('t')
ylabel('x')
zlabel('u')u=round(u,2);
xlswrite('不同时间不同厚度下的温度分布.xlsx',u)% 生成温度分布的excle文件%% 四个临界面下的部分温度分布表
U=zeros(5401,4);
U(:,1)=u(m1+1,:)';
U(:,2)=u(m1+m2+1,:)';
U(:,3)=u(m1+m2+m3+1,:)';
U(:,4)=u(m1+m2+m3+m4+1,:)';xlswrite('problem1.xlsx',U)% 存储生成四个临界面下的部分温度分布表于problem1figure
subplot(2,2,1)
plot(U(:,1),'r')
xlabel('t');ylabel('u');
title('临界面I')
axis([0 5400 30 80])
subplot(2,2,2)
plot(U(:,2),'r')
xlabel('t');ylabel('u');
title('临界面II')
axis([0 5400 30 80])
subplot(2,2,3)
plot(U(:,3),'r')
title('临界面III')
axis([0 5400 30 80])
xlabel('t');ylabel('u');
subplot(2,2,4)
plot(U(:,4),'r')
title('临界面IV')
axis([0 5400 30 80])
xlabel('t');ylabel('u');

这篇关于隐式差分+追赶法求解PDE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132244

相关文章

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

Python中差分进化differential_evolution的调用及参数说明

在场景应用中,要求我们的函数计算结果尽可能的逼近实际测量结果,可转化计算结果与测量结果的残差,通过最小化残差,便可求出最优的结果。但使用最小二乘等方法来计算时,常常会使迭代的结果显然局部最优点而导致结算错误。 差分进化原理 差分进化(Differential Evolution,DE)是一种基于群体差异的进化算法,其计算思想主要包括以下几个方面: 一、初始化种群 首先,随机生成一个初始种群

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

selenium的webdriver三种等待方式(显式等待WebDriverWait+implicitly_wait隐式等待+sleep强制等待)

隐式等待是等页面加载,不是等元素!!! 1、显式等待  一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码。显式等待是等元素加载!!! from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

C++隐式转换

文章目录 一、基本类型转换1.1 整型提升(Integer Promotion)1.2 算术转换(Arithmetic Conversion) 二、类类型的隐式转换2.1 通过单参数构造函数进行隐式转换2.2 通过转换函数进行隐式转换 三、隐式类型转换的注意事项3.1 防止不必要的隐式转换3.2 隐式类型转换的优先级 四、总结 视频教学笔记1、隐形构造函数案例1案例2 2、explicit使

JD 1147:Jugs(一种用最少步骤求解的方法)

OJ题目:click here~~ 题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。 输入的三个数:a,b,n;> 由题不定方程ax+by=n必定有解> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2