MATLAB求解偏微分方程【PDE和差分法】

这篇具有很好参考价值的文章主要介绍了MATLAB求解偏微分方程【PDE和差分法】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言 

1.用差分法求解

显示差分

其他方程举例 :

r是什么

2.PDETOOL

3.pdepe函数

示例:热方程

代码:


 

前言 

在我们处理一些公式时,常常会有偏微分方程出现,所以我今天整理了一下求解偏微分方程的常用方法,希望有所帮助

在1979年复旦大学学者的一篇论文里,谈到了偏微分方程所需要的条件

 pde matlab,matlab,算法,开发语言

 即在下图中我们求解热传导方程

pde matlab,matlab,算法,开发语言

 热以箭头方向传导,我们需要知道初始温度,以及边界温度(上下面的温度)我们以热传导方程

pde matlab,matlab,算法,开发语言

 为例,

1.用差分法求解

显示差分

显式差分方法(Explicit Finite Difference Method)是一种常用的数值方法,用于求解偏微分方程。它基于将偏微分方程中的导数项转化为有限差分的形式,并使用离散化的网格来逼近连续的空间和时间域。

显式差分方法中,通过使用中心差分来近似空间导数项,并使用向前差分或向后差分来近似时间导数项。其中,向前差分是使用当前时间步的数据来近似时间导数,而向后差分是使用下一个时间步的数据来近似时间导数。

对于扩散方程的求解,显式差分方法可以使用如下的差分方程形式:

pde matlab,matlab,算法,开发语言 

在matlab

u(k+1, i) =u(k, i) + r * (u(k, i-1) - 2 * u(k, i) + u(k, i+1))

默认=1

其中,u(k+1, i) 表示下一个时间步 t_{k+1} 和空间位置 x_i 处的值,u(k, i) 表示当前时间步 t_k 和空间位置 x_i 处的值,r 为时间步长和空间步长的比值。

  • k 表示时间步数索引,即第 k 个时间步。通常,时间步长为 dt,那么第 k 个时间步的时间值为 t_k = k * dt。

  • i 表示空间步数索引,即第 i 个空间步。通常,空间步长为 dx,那么第 i 个空间步的位置值为 x_i = i * dx。

显式差分方法的优点是简单易实现,但其稳定性需要满足一个数值稳定性条件,即 r 小于一个特定的临界值。当 r 超过该临界值时,数值解可能会出现不稳定和振荡现象。

clear
clc
close all 

dx=0.05;    %x方向的步长
dt=0.001;   %t方向的步长
r=dt/(dx^2);  %计算r的值
x=0:dx:1;     %得到x的序列
t=0:dt:0.2;     %得到t的序列

M=length(x)-1;
N=length(t)-1;

u=ones(N+1,M+1);
u(1,:)=100;       %设置初值条件:u(x,0)=100
u(2:N+1,1)=0;     %设置边界条件:u(0,t)=0
u(2:N+1,M+1)=0;   %设置边界条件:u(1,t)=0

%根据差分方程,计算u的数值解
for k=1:N
    for i=2:M
        u(k+1,i)=(1-2*r)*u(k,i)+r*(u(k,i-1)+u(k,i+1));
    end
end

[x,t]=meshgrid(x,t);
mesh(x,t,u)     %绘制(x,t,u)的三维图
xlabel('x')
ylabel('t')
zlabel('\u(x,t)')
title('扩散方程的数值模拟')

u(x,0)=100          1

u(0,t)=0               2

u(1,t)=0               3

是限制条件,具体解释一下就是,

1.在t=0时,函数u在空间位置 x 处的值为 100 ,即初始温度为100°

2.上下温度均为0,换句话说,u在 x = 0 处的边界条件被设定为 0,在 x = 1 处的边界条件被设定为 0

所以,这个意思就是温度在长方形中间部位温度达到最高,随后逐渐消散变为0

pde matlab,matlab,算法,开发语言

 

其他方程举例 :

对于二维泊松方程: 

pde matlab,matlab,算法,开发语言

差分方程: 

pde matlab,matlab,算法,开发语言

对于一维对流-扩散方程:

pde matlab,matlab,算法,开发语言

差分方程:

pde matlab,matlab,算法,开发语言

matlab代码:

u(k+1, i) = u(k, i) - r * (v * (u(k, i+1) - u(k, i-1)) / (2*dx) - D * (u(k, i-1) - 2*u(k, i) + u(k, i+1)) / dx^2)

 

clc,clear
% 设置参数和网格
v = ...;            % 对流速度
D = ...;            % 扩散系数
dt = ...;           % 时间步长
dx = ...;           % 空间步长
x = x_min:dx:x_max; % 网格上的位置数组
t = 0:dt:t_max;     % 网格上的时间数组

% 计算稳定性条件
r = (v * dt) / (2 * dx);

% 初始化数值解
u = zeros(length(t), length(x));  % 数值解的矩阵
u(1, :) = ...;                    % 初始条件设置

% 遍历时间步
for k = 1:length(t)-1
    % 遍历空间步
    for i = 2:length(x)-1
        % 根据差分方程计算数值解
        u(k+1, i) = u(k, i) - r * (v * (u(k, i+1) - u(k, i-1)) / (2*dx) - D * (u(k, i-1) - 2*u(k, i) + u(k, i+1)) / dx^2);
    end
end

% 绘制数值解
mesh(x, t, u);
xlabel('x');
ylabel('t');
zlabel('u(x,t)');
title('一维对流-扩散方程的数值解');

r是什么

在这个问题中,r 是一个常数,它代表时间步长和空间步长的比值。 使用该值可以控制数值方法的稳定性和精度。

具体而言,在扩散方程的数值求解中,使用显式差分方法时,我们使用差分近似来代替偏微分方程中的导数项。而差分近似的准确性和稳定性取决于时间步长和空间步长的选择。

常见的稳定性要求是在进行数值模拟时确保 r 值小于或等于0.5。这被称为CFL条件(Courant-Friedrichs-Lewy条件)。

r 的计算公式如下:

r = dt / (dx^2)

其中 dt 是时间步长(时间间隔),dx 是空间步长(空间间隔)。

通过计算 r 的值,我们可以选择合适的时间步长和空间步长,以控制数值方法的稳定性和精度。

2.PDETOOL

如果你是高手,自然也会使用pdetool这个工具,直接在命令行窗口调用,绘图然后输入条件,最后导出数据,由于过程太麻烦,我就不再说了,大家可以参看这位的文章

MATLAB 偏微分方程工具箱 pdetool 入门教程 - 知乎 (zhihu.com)

3.pdepe函数

这个函数时matlab自带的,也是matlab帮助中心所运用的

示例:热方程

尝试此示例

抛物型 PDE 的一个示例是一维热方程:

pde matlab,matlab,算法,开发语言

此方程描述 0≤x≤L 和 t≥0 的散热情况。目标是求解 u(x,t) 温度问题。温度最初是一个非零常量,因此初始条件是

u(x,0)=T0.

此外,左边界的温度为零,右边界的温度不为零,因此边界条件为

u(0,t)=0,

u(L,t)=1.

要在 MATLAB 中求解该方程,需要对方程、初始条件和边界条件编写代码,然后在调用求解器 pdepe 之前选择合适的解网格。

编写方程代码

在编写方程代码之前,您需要确保它的形式符合 pdepe 求解器的要求:

pde matlab,matlab,算法,开发语言

因此,系数的值如下:

  • m=0

  • c=1

  • f=∂u/∂x

  • s=0

m 的值作为参数传递给 pdepe,而其他系数编写为方程的一个函数,即

function [c,f,s] = heatpde(x,t,u,dudx)
c = 1;
f = dudx;
s = 0;
end

在这里默认k=1,我们可以加上k

function [c,f,s] = heatpde(x,t,u,dudx)
k = 0.663;  % 热传导系数
c = 1;
f = k * dudx;
s = 0;
end

pde matlab,matlab,算法,开发语言

p,q值由上述边界条件得出

代码:

function [c,f,s] = heatpde(x,t,u,dudx)
c = 1;
f = dudx;
s = 0;
end
function u0 = heatic(x)
u0 = 0.5;%初始温度
end
function [pl,ql,pr,qr] = heatbc(xl,ul,xr,ur,t)
pl = ul;
ql = 0;
pr = ur - 1;
qr = 0;
end

选择解网格

使用包含 20 个点的空间网格和包含 30 个点的时间网格。由于解快速达到稳态,t=0 附近的时间点间隔更近以将此行为捕获到输出中。

L = 1;
x = linspace(0,L,20);
t = [linspace(0,0.05,20), linspace(0.5,5,10)];

求解方程

最后,使用对称性值 m、PDE 方程、初始条件、边界条件以及 x 和 t 的网格来求解方程。

m = 0;
sol = pdepe(m,@heatpde,@heatic,@heatbc,x,t);

对解进行绘图

使用 imagesc 可视化解矩阵。

colormap hot
imagesc(x,t,sol)
colorbar
xlabel('Distance x','interpreter','latex')
ylabel('Time t','interpreter','latex')
title('Heat Equation for $0 \le x \le 1$ and $0 \le t \le 5$','interpreter','latex')

 希望有所帮助!文章来源地址https://www.toymoban.com/news/detail-766754.html

到了这里,关于MATLAB求解偏微分方程【PDE和差分法】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • matlab使用教程(27)—微分代数方程(DAE)求解

            微分代数方程是一类微分方程,其中一个或多个因变量导数未出现在方程中。方程中出现的未包含其导数的变量称为代数变量,代数变量的存在意味着您不能将这些方程记为显式形式 y ′ = f t , y 。相反,您可以解算下列形式的 DAE:         • ode15s 和 ode23t

    2024年02月11日
    浏览(31)
  • 40.利用欧拉法求解微分方程组(matlab程序)

    1. 简述        求解微分方程的时候,如果不能将求出结果的表达式,则可以对利用数值积分对微分方程求解,获取数值解。欧拉方法是最简单的一种数值解法。前面介绍过MATLAB实例讲解欧拉法求解微分方程,今天实例讲解欧拉法求解一阶微分方程组。 本文理论部分来自知乎

    2024年02月14日
    浏览(42)
  • 【数学建模\MATLAB】掌握用Matlab求解微分方程问题

    d y d t = a y 2 cfrac{dy}{dt}=ay^2 d t d y ​ = a y 2 结果 d 3 y d t 3 = b y cfrac{d^3y}{dt^3}=by d t 3 d 3 y ​ = b y 结果 x 2 + y + ( x − 2 y ) y ′ = 0 x^2+y+(x-2y)yprime=0 x 2 + y + ( x − 2 y ) y ′ = 0 结果: d 2 y d t 2 = a y , 初 始 条 件 为 y ( 0 ) = 5 , y ′ ( 0 ) = 1 cfrac{d^2y}{dt^2}=ay, text初始条件为y(0)=5,yprime(

    2024年02月03日
    浏览(28)
  • matlab使用教程(28)—微分方程(ODE)求解常见问题

            本博客说明如何将 ODE 解约束为非负解。施加非负约束不一定总是可有可无,在某些情况下,由于方程的物理解释或解性质的原因,可能有必要施加非负约束。仅在必要时对解施加此约束,例如不这样做积分就会失败或者解将不适用的情况。         如果解的

    2024年02月11日
    浏览(39)
  • 欧拉法与梯形法求解微分方程【含matlab源代码】

    本文介绍两种入门级求解微分方程的方法 —— 梯形法与欧拉法。 将上述方程组改写成matlab语言: 一、欧拉法 1.1 向前欧拉公式 1.2 向后欧拉公式     欧拉法求解源代码       欧拉法结果图   二、梯形法    梯形法求解源代码       梯形法结果图    感谢 Miracle 向公众

    2024年02月15日
    浏览(33)
  • 微分方程+传染病模型(指数传播、SI、SIS、SIR模型)+MATLAB求解

    本文为北海的数模课程学习笔记,课程出自微信公众号:数学建模BOOM。 求赞!求收藏!求关注! 微分方程结合传染病模型(如指数传播、SI、SIS、SIR模型)提供了一种用数学公式描述疾病传播动态的方法,有助于理解和预测疾病在人群中的传播路径和速度。 目录 指数传播模

    2024年02月04日
    浏览(40)
  • Fortran 微分方程求解 --ODEPACK

    最近涉及到使用Fortran对微分方程求解,我们知道MATLAB已有内置的函数,比如ode家族,ode15s,对应着不同的求解办法。通过查看odepack的官方文档,我尝试使用了dlsode求解刚性和非刚性常微分方程组。 首先是github网址:https://github.com/jacobwilliams/odepack 具体使用办法: 1.我使用的

    2024年02月11日
    浏览(31)
  • PINN深度学习求解微分方程系列一:求解框架

    下面我将介绍内嵌物理知识神经网络(PINN)求解微分方程。首先介绍PINN基本方法,并基于Pytorch框架实现求解一维Poisson方程。 内嵌物理知识神经网络(PINN)入门及相关论文 深度学习求解微分方程系列一:PINN求解框架(Poisson 1d) 深度学习求解微分方程系列二:PINN求解burg

    2023年04月16日
    浏览(27)
  • Simulink基础【1】-弹簧-阻尼模型的常微分方程求解

    Simulink是Matlab软件的框图设计环境,可用于各种动态系统的建模、分析与仿真过程。如:导航制导、通讯、电子、机械、热力学等诸多领域。这些系统在数学角度描述上涉及连续、离散、非线性、时变等用解析方法难以求解的系统,因而采用Simulink进行建模与仿真是指导这些系

    2023年04月08日
    浏览(33)
  • Python和Julia TensorFlow科学计算常微分方程求解器

    常微分方程(ODE)可用于描述动态系统。 从某种程度上来说,我们生活在一个动态系统中,窗外的天气从黎明到黄昏都在变化,我们体内发生的新陈代谢也是一个动态系统,因为随着时间的推移,成千上万的反应和分子被合成和降解。 更正式地说,如果我们定义一组变量,

    2024年02月01日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包