差分、偏微分方程的解法

在这里插入图片描述

微分方程数值求解——有限差分法

差分方法又称为有限差分方法或网格法,是求偏微分方程定解问题的数值解中应用 最广泛的方法之一。它的基本思想是:先对求解区域作网格剖分,将自变量的连续变化 区域用有限离散点(网格点)集代替;将问题中出现的连续变量的函数用定义在网格点 上离散变量的函数代替;通过用网格点上函数的差商代替导数,将含连续变量的偏微分 方程定解问题化成只含有限个未知数的代数方程组(称为差分格式)。如果差分格式有 解,且当网格无限变小时其解收敛于原微分方程定解问题的解,则差分格式的解就作为 原问题的近似解(数值解)。因此,用差分方法求偏微分方程定解问题一般需要解决一下问题:

  • 选取网络;
    由于matlab数组下标从1开始,而离散变量的初值都是从0开始,因此除却初始条件,我们所求的矩阵区域对应的数组下标是 2~ N+1
    这点需要注意,像下文中的代码,实际意义上是将时域划分为了length(t)-1个区域,因为下标1对应的是初值,但只求了 2~ N
    我写代码时习惯于
dx=0.02;
x=0:dx:1;
dt=0.0001;%0.0001
t=0:dt:1;
n=length(x)+1,m=length(t)+1
u=zeros(n,m);
%在求解U(x,t)时的循环过程则为
for i=1:m-1-1
...
  • 对微分方程及定解条件选择差分近似,列出差分格式;

  • 求解差分格式;

  • 讨论差分格式解对于微分方程解的收敛性及误差估计

在这里插入图片描述
常微分方程用欧拉法

大部分,下标位置,上标时间
有热源或者是扩散源,连续的、分成很多份、离散地取值,有限多个数来近似一个函数
在这里插入图片描述
在这里插入图片描述

1,N+1
在这里插入图片描述
这里是说算法的尺比,每个算法尺比有要求,就是空间步长与时间步长的比
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
初始算出 1,1~ N+1,可得到2,2~N,通过 边界条件,可得到 2,1 ~ N+1,继续向上推

求解准备(对矩阵的构造)

在这里插入图片描述
左侧矩阵是u关于x的二阶导
左侧矩阵是u关于x的二阶导,但只是先后对于 2~ N的二阶导,要求得 1 ~ N+1 的二阶导,还需要借助边界条件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
表达的式子是
在这里插入图片描述

matlab代码

改成简单的边界条件

m1=1+0.0*sin(t); %t的函数,两个边界条件
m2=2-0.0*sin(10*t);
clc,clear
a=1;
dx=0.02;
x=0:dx:1;
dt=0.0001;%0.0001
t=0:dt:1;
u=zeros(length(x),length(t));
%行数和x的个数一样
u(:,1)=sin(pi*x);%x的函数,初始函数,第一列
m1=1+0.0*sin(t); %t的函数,两个边界条件
m2=2-0.0*sin(10*t);
A=-2*eye(length(x))+diag(ones(1,length(x)-1),1)++diag(ones(1,length(x)-1),-1);
%eye 主对角线,单位矩阵
%diag(,1)对角矩阵往上挪1
for n=1:length(t)-1
    u(:,n+1)=u(:,n)+a^2*dt/dx^2*A*u(:,n);% a^2*(u关于x的二阶导)
    u(1,n+1)=m1(n+1); %边界条件
    u(end,n+1)=m2(n+1);
    
end

%plot(x,u(:,end),'-bp')

  [X,T]=meshgrid(t,x);
    surf(X,T,u)
    shading interp  

在这里插入图片描述
在这里插入图片描述

差分法的运用(依旧是连续变量——>离散网格点)

在这里插入图片描述
由于向前差分有误差,如果我们进行两次向前差分的话,计算的误差可能会增大,因此,第二次偏导我们选择向后差分。即我们混合向前差分、向后差分来近似代替两次偏导。

因此,第二次我们用向后差分
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
该块内容来自博文

clc;
clear;
f1 = @(x)2 * log(1+x);
f2 = @(x)log((1+x).^2+1);
f3 = @(y)log(1+y.^2);
f4=  @(y)log(4+y.^2);
u=zeros(4);
m=4;% 总列数
n=4;% 总行数
h=1/3;
u(1,1:m)=feval(f3,0:h:(m-1)*h)';
u(n,1:m)=feval(f4,0:h:(m-1)*h)';
u(1:n,1)=feval(f1,0:h:(n-1)*h);
u(1:n,m)=feval(f2,0:h:(n-1)*h);
b = -[u(2,1)+u(1,2);u(4,2)+u(3,1);u(2,4)+u(1,3);u(3,4)+u(4,3)];
a = [-4,1,1,0;1,-4,0,1;1,0,-4,1;0,1,1,-4];
x=a\b;

PDE求解思路

古典解、广义解
对于PDE(偏微分方程)来说,如果存在一个函数u uu具有所需要的各阶连续偏导数,将它们带入方程时能使方程成为恒等式,则称这个函数为该方程的解 (这种解又称为古典解)。

用一个充分光滑的初值函数序列来逼近不够光滑的初值函数,前者所对应的解序列的极限就定义为后者所确定的解,称为问题的广义解。

求解ODE思路
求解常微分方程的办法,先求出方程的通解,再用定解条件去确定任意常数。现在,如能找出主方程的通解,再利用定解条件去确定任意函数。

求解PDE思路
求出PDE满足边界条件的足够数目的特解,再利用叠加原理,使之满足初始条件,从而得到混合方程的解。

在这里插入图片描述

工具箱求解

demo1

在这里插入图片描述
参考博文

demo2

在这里插入图片描述
在这里插入图片描述

%主函数
function main
clc,clear
m=0;
x=linspace(0,1,20); % 方程区间为(0,1)
t=linspace(0,2,10); % t 的范围可以随取,只需要大于0即可
sol=pdepe(m,@pdex1pde,@pdex1ic,@pdex1bc,x,t); % 10x20的矩阵与t*x的维度一致
u = sol(:,:,1); %解向量 u 的第 1 个分量的近似值
surf(x,t,u) 
title('Numerical solution computed with 20 mesh points.')
xlabel('Distance x')
ylabel('Time t')

figure
plot(x,u(end,:))% t=2时,u随x的变化曲线
title('Solution at t = 2')
xlabel('Distance x')
ylabel('u(x,2)')

end
%PDE方程 
function [c,f,s]=pdex1pde(x,t,u,DuDx)
    c=pi^2;
    f=DuDx;
    s=0;
 end
%初始条件格式
function uo=pdex1ic(x)
    uo=sin(pi*x);
end
%边界条件
function [pl,ql,pr,qr]=pdex1bc(x1,u1,xr,ur,t)
    pl=u1; 
    ql=0; 
    pr=pi*exp(-t); 
    qr=1; 
    end

在这里插入图片描述

参考博文
matlab文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值