微分方程数值解法(2)——椭圆型方程的有限差分法

article/2025/8/27 23:17:56

此处参考教材为李荣华的《微分方程数值解法》
使用工具:Matlab

1. 算法:矩形网格上5点差分格式

在这里插入图片描述

2. 算法

I.需要求解的函数
function [v,vx,vy,f,aa,bb,cc,dd]=u2D(x,y,ft)% ft为方程编号,u1D为精确解函数u(t),注意与f2D 对应右端项函数f(t,u(t))switch ftcase 1 %P-104例题v=cos(3*x).*sin(pi*y)/(9+pi^2);vx=-3*sin(3*x).*sin(pi*y)/(9+pi^2);vy=pi*cos(3*x).*cos(pi*y)/(9+pi^2);f=cos(3*x).*sin(pi*y);aa=0;bb=pi;cc=0;dd=1;case 2 %P-104习题v=exp(pi*(x+y)).*sin(pi*x).*sin(pi*y);
vx=pi*exp(pi*(x+y)).*(sin(pi*x).*sin(pi.*y)+cos(pi*x).*sin(pi*y));
vy=pi*exp(pi*(x+y)).*(sin(pi*x).*sin(pi*y)+cos(pi*y).*sin(pi*x));
f=-2*(pi^2)*exp(pi*(x+y)).*(sin(pi*x).*cos(pi*y)+cos(pi*x).*sin(pi*y));
aa=0;bb=1;cc=0;dd=1;
end
II.求解例题的主函数:五点差分格式函数
function Elliptic_PDESolver(ft,M,N)
%初始化定义求解区域和网格
[~,~,~,~,x1,xr,y1,yr]=u2D(0,0,ft); %求解区域也从u2D函数调用,初始x和y设为0
h1=(xr-x1)/M;
h2=(yr-y1)/N;
xd=(x1:h1:xr); %网格节点坐标
yd=(y1:h2:yr); %网格节点坐标%定义全部节点编号集AId,网格节点编号与矩阵下标编号不一致
AId=zeros(M+1,N+1);
xk=zeros((M+1)*(N+1),1); %整体编号排序后的节点坐标
yk=zeros((M+1)*(N+1),1); %整体编号排序后的节点坐标
for i=0:Mfor j=0:NAId(i+1,j+1)=i*(N+1)+j+1; %注意矩阵编号从1开始,故i+1,j+1xk(i*(N+1)+j+1)=xd(i+1); %xd的编号从1开始,故i+1yk(i*(N+1)+j+1)=yd(j+1); %yd的编号从1开始,故j+1end
end
AId=AId';AId=AId(:);%定义内部节点编号集:InId
InId=zeros(M-1,N-1);
for i=1:M-1for j=1:N-1InId(i,j)=i*(N+1)+j+1;end
end
InId=InId';InId=InId(:);%定义左边界节点编号集   LbId
for j=0:NLbId(j+1)=0*(N+1)+j+1;
end%定义右边界节点编号集   RbId
for j=0:NRbId(j+1)=M*(N+1)+j+1;
end%定义下边界节点编号集   BbId
for i=0:MBbId(i+1)=i*(N+1)+0+1;
end%定义上边界节点编号集   TbId
for i=0:MTbId(i+1)=i*(N+1)+N+1;
end%显示整体节点编号图
figure;
for i=0:Mplot(xd(i+1)+0*yd,yd);hold on;
end
for j=0:Nplot(xd,yd(j+1)+0*xd);hold on;
end
for i=1:length(AId)text(xk(i),yk(i),num2str(i));
end%初始化矩阵右端项
A=zeros((M+1)*(N+1),(M+1)*(N+1));
b=zeros((M+1)*(N+1),1);
hh1=h1^2;
hh2=h2^2;%内部节点形成矩阵行元素及右端项
for i=1:length(InId)k=InId(i);A(k,k)=2*hh1+2*hh2;A(k,k-1)=-hh1;A(k,k+1)=-hh1;    A(k,k-N-1)=-hh2;A(k,k+N+1)=-hh2;[~,~,~,ff]=u2D(xk(k),yk(k),ft); %提取右端项函数值b(k)=hh1*hh2*ff;
end
%添加边界条件元素及右端项
%定义左边界节点矩阵行元素及右端项
for j=1:length(LbId)
k=LbId(j);
if ft==1A(k,k)=-1;A(k,k+N+1)=1;
[~,ux,~,~]=u2D(xk(k),yk(k),ft); %%提取右端项函数值,第二边值条件b(k)=h1*ux;
elseif ft==2A(k,k)=1;A(k,k+N+1)=0;[uv,~,~,~]=u2D(xk(k),yk(k),ft);  %提取右端项函数值;第一边值条件b(k)=uv;%b(k)=0;end
end% 定义右边界节点矩阵行元素及右端项
for j=1:length(RbId)
k=RbId(j);if ft==1A(k,k)=-1;A(k,k-N-1)=1;
[~,ux,~,~]=u2D(xk(k),yk(k),ft); %提取右端项函数数值,第二边值条件b(k)=h1*ux;elseif ft==2A(k,k)=1;A(k,k-N-1)=0;[uv,~,~,~]=u2D(xk(k),yk(k),ft);  %提取右端项函数数值,第一边值条件b(k)=uv;%b(k)=0;end
end% 定义下边界节点矩阵行元素及右端项
for i=1:length(BbId)k=BbId(i);A(k,:)=0; %由于与其他边界条件有重复,清空该行元素A(k,k)=1;[uv,~,~,~]=u2D(xk(k),yk(k),ft); %提取右端项函数值,第一边值条件b(k)=uv;%b(k)=0;
end% 定义上边界节点矩阵行元素及右端项
for i=1:length(TbId)k=TbId(i);A(k,:)=0; %由于与其他边界条件有重复,清空该行元素A(k,k)=1;[uv,~,~,~]=u2D(xk(k),yk(k),1); %提取右端项函数值,第一边值条件b(k)=uv;%b(k)=0;
enduk=A\b; %求解所得整体节点排序的数值解
ExUk=u2D(xk,yk,ft); %所得整体节点排序的精确解
MaxErr=max(abs(uk-ExUk));
fprintf('MaxErr=%3.6f\n',MaxErr);%将数值解转化为网格排序
NuU=zeros(M+1,N+1);
for i=0:Mfor j=0:Nk=i*(N+1)+j+1;NuU(i+1,j+1)=uk(k);end
end
NuU=NuU'; %转置后矩阵下标与U相同%精确解画图
[X,Y]=meshgrid(xd,yd);
U=u2D(X,Y,ft);
figure;
mesh(X,Y,U);
xlabel('X-axis'),ylabel('Y-axis'),zlabel('Z-axis');
hold on;
%数值解画图
plot3(xk,yk,uk,'+');
hold on;
III.补充算例:八边形区域剖分
function Elliptic_PDESolver2(ft,M,N)
fprintf('八边形区域网格剖分数M和N需相等并且为3的倍数 \n');
if(M~=N)||(mod(M,3)~=0)fprintf('输入M和N不正确 \n');return
end%clear all
% 初始化定义求解区域和网格
%ft=1;
%M=18;%N=18;[~,~,~,~,x1,xr,y1,yr]=u2D(0,0,ft); %求解区域也从u2D函数调用,初始x和y设为0
h1=(xr-x1)/M;
h2=(yr-y1)/N;
xd=(x1:h1:xr); %网格节点坐标
yd=(y1:h2:yr); %网格节点坐标% 定义全部节点编号集 AId,注意网格节点编号与矩阵下标编号
AId=zeros(M+1,N+1);
xk=zeros((M+1)*(N+1),1); %整体排序后的节点坐标
yk=zeros((M+1)*(N+1),1); %整体排序后的节点坐标
for i=0:Mfor j=0:NAId(i+1,j+1)=i*(N+1)+j+1; %注意矩阵编号从1开始,故i+1,j+1xk(i*(N+1)+j+1)=xd(i+1); %xd的编号从1开始,故i+1yk(i*(N+1)+j+1)=yd(j+1); %yd的编号从1开始,故i+1end
end
AId=AId';AId=AId(:);%显示整体节点编号图
figure;
for i=0:Mplot(xd(i+1)+0*yd,yd,'-.');hold on;
end
for j=0:Nplot(xd,yd(j+1)+0*xd,'-.');hold on;
end
for i=1:length(AId)text(xk(i),yk(i),num2str(i));
end%八边形区域
%定义内部节点编号集 InId
InId=[]; 
B1Id=[]; %四条斜边
B2Id=[]; %左边
B3Id=[]; %右边
B4Id=[]; %下边
B5Id=[]; %上边
for i=0:Mfor j=0:Nif(i>0)&&(i<M)&&(j>0)&&(j<N)&&(j>N/3-i)&&(j<2*N/3+i)&&(j>i-2*N/3)&&(j<5*N/3-i)InId=[InId,i*(N+1)+j+1];endif(j==N/3-i)||(j==2*N/3+i)||(j==i-2*N/3)||(j==5*N/3-i)B1Id=[B1Id,i*(N+1)+j+1];endif(i==0)&&(j>N/3)&&(j<2*N/3)B2Id=[B2Id,i*(N+1)+j+1];endif(i==M)&&(j>N/3)&&(j<2*N/3)B3Id=[B3Id,i*(N+1)+j+1];endif(j==0)&&(i>M/3)&&(i<2*M/3)B4Id=[B4Id,i*(N+1)+j+1];endif(j==N)&&(i>M/3)&&(i<2*M/3)B5Id=[B5Id,i*(N+1)+j+1];endend
end
plot(xk(InId),yk(InId),'ro');
hold on;
plot(xk(B1Id),yk(B1Id),'b*');
hold on;
plot(xk(B2Id),yk(B2Id),'g*',xk(B3Id),yk(B3Id),'g*');
hold on;
plot(xk(B4Id),yk(B4Id),'c*',xk(B5Id),yk(B5Id),'c*');
hold on;% 初始化矩阵和右端项
A=zeros((M+1)*(N+1),(M+1)*(N+1));
b=zeros((M+1)*(N+1),1);
hh1=h1^2;
hh2=h2^2;%内部节点形成矩阵行元素及右端项
for i=1:length(InId)k=InId(i); %提取内部节点编号A(k,k)=2*hh1+2*hh2;A(k,k-1)=-hh1;A(k,k+1)=-hh1;    A(k,k-N-1)=-hh2;A(k,k+N+1)=-hh2;[~,~,~,ff]=u2D(xk(k),yk(k),1); %提取右端项函数数值b(k)=hh1*hh2*ff;%b(k)=hh1*hh2*(cos(3*xk(k))*sin(pi*yk(k)));
end%添加边界条件矩阵元素及右端项
% 定义B1Id边界节点矩阵行元素及右端项
for j=1:length(B1Id)k=B1Id(j);A(k,k)=1;[uv,~,~,~]=u2D(xk(k),yk(k),1); %提取右端项函数数值,第一边值条件b(k)=uv;
end% 定义B2Id边界节点矩阵行元素及右端项
for j=1:length(B2Id)k=B2Id(j);A(k,k)=-1;A(k,k+N+1)=1;[~,ux,~,~]=u2D(xk(k),yk(k),1); %提取右端项函数数值,第二边值条件b(k)=h1*ux;
end% 定义B3Id边界节点矩阵行元素及右端项
for j=1:length(B3Id)k=B3Id(j);A(k,k)=1;A(k,k-N-1)=-1;[~,ux,~,~]=u2D(xk(k),yk(k),1); %提取右端项函数数值,第二边值条件b(k)=h1*ux;
end% 定义B4Id边界节点矩阵行元素及右端项
for j=1:length(B4Id)k=B4Id(j);A(k,k)=-1;A(k,k+1)=1;[~,~,uy,~]=u2D(xk(k),yk(k),1); %提取右端项函数数值,第一边值条件b(k)=h2*uy;
end% 定义B5Id边界节点矩阵行元素及右端项
for j=1:length(B5Id)k=B5Id(j);A(k,k)=1;A(k,k-1)=-1;[~,~,uy,~]=u2D(xk(k),yk(k),1); %提取右端项函数数值,第一边值条件b(k)=h2*uy;
end%矩阵A是按照所有(M+1)*(N+1)个节点生成的矩阵,里面有很多的非区域节点编号对应的0子阵
DmId=sort([InId,B1Id,B2Id,B3Id,B4Id,B5Id]);
OutId=setdiff(AId,DmId);
A(OutId,:)=[];A(:,OutId)=[]; %剔除非区域节点OutId对应的行和列
b(OutId,:)=[]; %剔除非区域节点OutId对应的右端项
uk=A\b; %求解所得整体节点排序的数值解
ExUk=u2D(xk(DmId),yk(DmId),ft); %整体节点排序的精确解
MaxErr=max(abs(uk-ExUk));
fprintf('MaxErr=%3.6f\n',MaxErr);%精确解画图
[X,Y]=meshgrid(xd,yd);
U=u2D(X,Y,ft);
figure;
mesh(X,Y,U);
xlabel('X-axis'),ylabel('Y-axis'),zlabel('Z-axis');
hold on;
%数值解画图
plot3(xk(DmId),yk(DmId),uk,'+');
hold on;

3. 给出简单结果

[^此处图略,仅给出简单数字结果;感兴趣的读者可以复制代码运行一下]

P104页:习题
(1) 步长k=h=1/64:

在命令行窗口输入
>>Elliptic_PDESolver(2,64,64)

所得结果:

MaxErr=0.028613

(2)步长k=h=1/128:

在命令行窗口输入
>> Elliptic_PDESolver(2,128,128)
所得结果:

MaxErr=0.007156

P104页:例题
(1) N=M=4:在命令行窗口输入

>> Elliptic_PDESolver(1,4,4)
所得结果:

MaxErr=0.117314

之后重复上面命令行的步骤

(2)M=N=8

MaxErr=0.047304

(3)M=N=16

MaxErr=0.019118

(4)M=N=32

MaxErr=0.008457

补充练习

>> Elliptic_PDESolver2(1,12,12)

八边形区域网格剖分数M和N需相等并且为3的倍数
MaxErr=0.019358

>> Elliptic_PDESolver2(1,15,15)

八边形区域网格剖分数M和N需相等并且为3的倍数
MaxErr=0.013485

4. 对算例结果进行简单的分析

在这两道数值例子中,显然当网格加密的时候误差越来越小,精确程度越来越高。但是在matlab程序运行过程中明显能感觉到,网格越密运行时间越长。
由补充练习知 八边形区域网格剖分数M和N需相等并且为3的倍数,且随着网格的加密误差逐渐变小。


http://chatgpt.dhexx.cn/article/nYM3UoNF.shtml

相关文章

基础数学(8)——常微分方程数值解法

文章目录 期末考核方式基础知识解析解&#xff08;公式法&#xff09;解析解例题&#xff08;使用公式法&#xff0c;必考&#xff09;解析解的局限性 数值解数值解的基本流程 显示Euler法显示欧拉&#xff08;差值理解&#xff09;显示欧拉&#xff08;Taylor展开理解&#xf…

微分方程数值解法(1)——常微分方程初值问题的数值解法

此处参考教材为李荣华的《微分方程数值解法》 使用工具&#xff1a;Matlab 1. 算法 注: 最后一行应为k4,上面为笔误 2. 算法 I.需要求解的函数 function ff1D(t,u,ft)% ft为方程编号&#xff0c;u1D为精确解函数u(t),注意与f1D对应右端项函数f(t,u(t))switch ftcase 1 %P10…

偏微分方程数值解法pdf_天生一对,硬核微分方程与深度学习的联姻之路

机器之心原创 作者&#xff1a;蒋思源 微分方程真的能结合深度神经网络&#xff1f;真的能用来理解深度神经网络、推导神经网络架构、构建深度生成模型&#xff1f;本文将从鄂维南、董彬和陈天琦等研究者的工作中&#xff0c;窥探微分方程与深度学习联袂前行的路径。 近日&…

椭圆型偏微分方程数值解法

一、 一维椭圆方程数值解 matlab代码&#xff1a; function chap2_fdm_elliptic_1D % 一维椭圆方程求解(常微分方程边值问题) % -u q(x)u f(x), 0<x<1, 取q(x) x, f(x) (x-1)exp(x) % u(0) 1, u(1) e; 边界条件 % 真解为 u exp(x)N 20; h 1/N; x_al…

Python小白的数学建模课-11.偏微分方程数值解法

偏微分方程可以描述各种自然和工程现象&#xff0c; 是构建科学、工程学和其他领域的数学模型主要手段。 偏微分方程主要有三类&#xff1a;椭圆方程&#xff0c;抛物方程和双曲方程。 本文采用有限差分法求解偏微分方程&#xff0c;通过案例讲解一维平流方程、一维热传导方程…

偏微分方程数值解法pdf_单摆-微分方程浅谈

引子[1] 单摆&#xff0c;这个在中学物理都学过的东西&#xff0c;应该是非常熟悉了。 图片来源-维基百科 小角度简单摆 若最高处( )的绳子和最低处(速度最大值)的绳子的角度为 &#xff0c;则可使用下列公式算出它的振动周期。 公式证明 摆球受力分析 绳与对称线夹角为 &…

偏微分方程数值解法pdf_数值模拟偏微分方程的三种方法:FDM、FEM及FVM

偏微分方程数值模拟常用的方法主要有三种:有限差分方法(FDM)、有限元方法(FEM)、有限体积方法(FVM),本文将对这三种方法进行简单的介绍和比较。 一.有限差分方法 有限差分方法(Finite Difference Methods)是数值模拟偏微分方程最早采用的方法,至今仍被广泛运用。该方法包括区…

正圆锥体空间方程_数值模拟偏微分方程的三种方法:FDM、FEM及FVM

偏微分方程数值模拟常用的方法主要有三种:有限差分方法(FDM)、有限元方法(FEM)、有限体积方法(FVM),本文将对这三种方法进行简单的介绍和比较。 一.有限差分方法 有限差分方法(Finite Difference Methods)是数值模拟偏微分方程最早采用的方法,至今仍被广泛运用。该方法包括区…

抖音图标

抖音图标&#xff1a; 1.创建一张画布&#xff0c;再用圆角矩形工具创建一个圆角矩形 2.新建一个图层&#xff0c;用椭圆选框工具创建一个圆&#xff0c;再alt键从选区减去一个圆 3.再填充一个颜色&#xff0c;再剪切1/4圆接着粘贴拖拽至右上方 4.新建一个图层&#xff0c;用…

抖音图标——ps

抖音图标 1.用圆角矩形工具画个圆角&#xff08;空格键可以移动&#xff09;&#xff0c;填充为黑色&#xff0c;把此图层转换为珊格式化 2.再新建一个图层&#xff0c;用椭圆选框工具画个换个环&#xff08;用alt会出现&#xff0c;shift会出现加号&#xff09; 3.Ctrlx剪…

抖音软件分析

前几天看了看关于短视频软件的火的一些话题&#xff0c;就去看了看关于抖音的&#xff0c;对于抖音是那几个方面&#xff0c;自己也去做了一些分析&#xff0c;首先是在两个方面去做的一个理解&#xff0c;一个是软件制作&#xff0c;一个是商业运营。 软件制作 在抖音的软件…

仿抖音视频自动播放html,vue 仿抖音视频播放切换

一、第一部分html页面的准备 {{item.title}} {{item.introduction}} 二、数据说明部分 data() {let u = navigator.userAgent; return {showSlide: 0, allLoaded: false, //数据是否全部加载完 page: 1, isLoading: true, option: {}, current: 0, videoList: [], isVideoShow:…

抖音账号官方认证

介绍 认证功能入口 【我】—【创作者服务中心】— 【官方认证】 抖音黄V是什么&#xff1f; 抖音黄V是抖音平台对个人能力与专业性的认可。换句话讲&#xff0c;黄V即能体现个人身份标签又可以获得官方在内容发布的“豁免权”。如未认证的用户去进行科普&#xff0c;轻则警…

仿抖音首页界面

目录 效果图 顶部相关代码 顶部效果图 内容相关代码 内容效果图 底部导航栏相关代码 底部导航栏效果图 完整代码 html css js ​flexible.js 要想做出抖音短视频的首页界面&#xff0c;我们要引用swiper插件、还需要用到iconfont图标&#xff08;可自行到官网上下载…

抖音小程序Tiktok开发教程之 基础组件 04 icon 图标组件

什么是icon组件? icon是图标组件 icon组件运行效果 icon组件如何使用呢? 首先,在ttml界面中添加下面代码 <view class="container"><view class="body"><view class="page-section page-default"><view class="…

分享图片或链接到抖音

目录 前言 一、官方文档 二、开始配置 第一步&#xff1a;向抖音短视频申请你的 clientkey 及相关权限 第二步&#xff1a;集成到开发环境 1.根目录下build.gradle引入库 2.app moudel目录下build.gradle引入库 3.配置抖音的软件包可见性 使用一&#xff1a;Android-分…

仅用一个 HTML 标签,实现带动画的抖音 Logo

作者 | 零一 来源 | 前端印象 今天给大家表演 仅用一个HTML标签实现带动画的抖音LOGO&#xff0c;涉及了很多知识点&#xff0c;欢迎交流讨论 先上结果&#xff0c;最终实现效果如下&#xff1a; 成品图 还原度应该还可以吧&#xff1f; 抖音Logo结构 想要用CSS来画抖音的Logo&…

用python+pillow模块实现抖音晃眼睛的特效,图像处理之路(附源码)

前言 利用Python实现抖音晃眼睛的特效&#xff0c;让我们愉快地开始吧~ 开发工具 Python版本&#xff1a; 3.6.4 相关模块&#xff1a; pillow模块&#xff1b; numpy模块&#xff1b; argparse模块&#xff1b; 以及一些Python自带的模块。 环境搭建 安装Python并添加到…

仅用一个HTML标签,实现带动画的抖音LOGO

大家好&#xff0c;我是零一&#xff0c;今天给大家表演 仅用一个HTML标签实现带动画的抖音LOGO&#xff0c;涉及了很多知识点&#xff0c;欢迎交流讨论 先上结果&#xff0c;最终实现效果如下&#xff1a; 还原度应该还可以吧&#xff1f; 抖音Logo结构 想要用CSS来画抖音的…

uni-app项目引入图标

uni-app项目引入图标 普通图标引入 1、阿里巴巴矢量图官网创建图标项目 2、将搜索的图标添加进购物车&#xff0c;在购物车里面将图标添加进项目里面 3、下载该文件到本地&#xff0c;将该文件的css文件复制到项目里面 &#xff08;并设置大小&#xff09; 4、修改icon…