Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法(附Matlab代码)

Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法

Caputo 分数阶一维问题基于 L1 逼近的快速差分方法(附Matlab程序)

文章目录

  • Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法
    • 差分格式的建立
    • 分数阶微分方程数值算例
      • 数值算例
      • 源项和初边值条件
      • 代数系统
      • 数值结果
      • 源代码
    • 参考文献

考虑如下时间分数阶慢扩散方程初边值问题
{ 0 C D t α u ( x , t ) = u x x ( x , t ) + f ( x , t ) , x ∈ ( 0 , L ) , t ∈ ( 0 , T ] u ( x , 0 ) = φ ( x ) , x ∈ ( 0 , L ) u ( 0 , t ) = μ ( t ) , u ( L , t ) = ν ( t ) , t ∈ [ 0 , T ] \left\{\begin{array}{l} { }_{0}^{C} D_{t}^{\alpha} u(x, t)=u_{x x}(x, t)+f(x, t), \quad x \in(0, L), t \in(0, T] \\ u(x, 0)=\varphi(x), \quad x \in(0, L) \\ u(0, t)=\mu(t), \quad u(L, t)=\nu(t), \quad t \in[0, T] \end{array}\right. 0CDtαu(x,t)=uxx(x,t)+f(x,t),x(0,L),t(0,T]u(x,0)=φ(x),x(0,L)u(0,t)=μ(t),u(L,t)=ν(t),t[0,T]
其中 α ∈ ( 0 , 1 ) , f , φ , μ , ν \alpha \in(0,1), f, \varphi, \mu, \nu α(0,1),f,φ,μ,ν 为已知函数, 且 φ ( 0 ) = μ ( 0 ) , φ ( L ) = ν ( 0 ) \varphi(0)=\mu(0), \varphi(L)=\nu(0) φ(0)=μ(0),φ(L)=ν(0).

设解函数 u ∈ C ( 4 , 2 ) ( [ 0 , L ] × [ 0 , T ] ) u \in C^{(4,2)}([0, L] \times[0, T]) uC(4,2)([0,L]×[0,T]).

差分格式的建立

在结点 ( x i , t n ) \left(x_{i}, t_{n}\right) (xi,tn) 处考虑微分方程, 得到
0 C D t α u ( x i , t n ) = u x x ( x i , t n ) + f i n , 1 ⩽ i ⩽ M − 1 , 1 ⩽ n ⩽ N . { }_{0}^{C} D_{t}^{\alpha} u\left(x_{i}, t_{n}\right)=u_{x x}\left(x_{i}, t_{n}\right)+f_{i}^{n}, \quad 1 \leqslant i \leqslant M-1,1 \leqslant n \leqslant N . 0CDtαu(xi,tn)=uxx(xi,tn)+fin,1iM1,1nN.
对上式中时间分数阶导数应用 L1 公式离散, 空间二阶导数应用二阶中心差商离散, 可得
τ − α Γ ( 2 − α ) [ a 0 ( α ) U i n − ∑ k = 1 n − 1 ( a n − k − 1 ( α ) − a n − k ( α ) ) U i k − a n − 1 ( α ) U i 0 ] = δ x 2 U i n + f i n + ( r 3 ) i n , 1 ⩽ i ⩽ M − 1 , 1 ⩽ n ⩽ N , \begin{aligned} & \frac{\tau^{-\alpha}}{\Gamma(2-\alpha)}\left[a_{0}^{(\alpha)} U_{i}^{n}-\sum_{k=1}^{n-1}\left(a_{n-k-1}^{(\alpha)}-a_{n-k}^{(\alpha)}\right) U_{i}^{k}-a_{n-1}^{(\alpha)} U_{i}^{0}\right] \\ =& \delta_{x}^{2} U_{i}^{n}+f_{i}^{n}+\left(r_{3}\right)_{i}^{n}, \quad 1 \leqslant i \leqslant M-1,1 \leqslant n \leqslant N, \end{aligned} =Γ(2α)τα[a0(α)Uink=1n1(ank1(α)ank(α))Uikan1(α)Ui0]δx2Uin+fin+(r3)in,1iM1,1nN,
且存在正常数 c 3 c_{3} c3 使得
∣ ( r 3 ) i n ∣ ⩽ c 3 ( τ 2 − α + h 2 ) , 1 ⩽ i ⩽ M − 1 , 1 ⩽ n ⩽ N . \left|\left(r_{3}\right)_{i}^{n}\right| \leqslant c_{3}\left(\tau^{2-\alpha}+h^{2}\right), \quad 1 \leqslant i \leqslant M-1,1 \leqslant n \leqslant N . (r3)inc3(τ2α+h2),1iM1,1nN.
注意到初边值条件, 有
{ U i 0 = φ ( x i ) , 1 ⩽ i ⩽ M − 1 , U 0 n = μ ( t n ) , U M n = ν ( t n ) , 0 ⩽ n ⩽ N . \begin{cases}U_{i}^{0}=\varphi\left(x_{i}\right), & 1 \leqslant i \leqslant M-1, \\ U_{0}^{n}=\mu\left(t_{n}\right), & U_{M}^{n}=\nu\left(t_{n}\right), \quad 0 \leqslant n \leqslant N .\end{cases} {Ui0=φ(xi),U0n=μ(tn),1iM1,UMn=ν(tn),0nN.

在上式中略去小量项 ( r 3 ) i n \left(r_{3}\right)_{i}^{n} (r3)in, 并用数值解 u i n u_{i}^{n} uin 代替精确解 U i n U_{i}^{n} Uin, 可得如下差分格式:
{ τ − α Γ ( 2 − α ) [ a 0 ( α ) u i n − ∑ k = 1 n − 1 ( a n − k − 1 ( α ) − a n − k ( α ) ) u i k − a n − 1 ( α ) u i 0 ] = δ x 2 u i n + f i n u i 0 = φ ( x i ) , 1 ⩽ i ⩽ M − 1 , u 0 n = μ ( t n ) , u M n = ν ( t n ) , 0 ⩽ n ⩽ M − 1 , 1 ⩽ n ⩽ N , \left\{\begin{array}{l} \frac{\tau^{-\alpha}}{\Gamma(2-\alpha)}\left[a_{0}^{(\alpha)} u_{i}^{n}-\sum\limits_{k=1}^{n-1}\left(a_{n-k-1}^{(\alpha)}-a_{n-k}^{(\alpha)}\right) u_{i}^{k}-a_{n-1}^{(\alpha)} u_{i}^{0}\right]=\delta_{x}^{2} u_{i}^{n}+f_{i}^{n} \\ u_{i}^{0}=\varphi\left(x_{i}\right), \quad 1 \leqslant i \leqslant M-1, \\ u_{0}^{n}=\mu\left(t_{n}\right), \quad u_{M}^{n}=\nu\left(t_{n}\right), \quad 0 \leqslant n \leqslant M-1,1 \leqslant n \leqslant N, \end{array}\right. Γ(2α)τα[a0(α)uink=1n1(ank1(α)ank(α))uikan1(α)ui0]=δx2uin+finui0=φ(xi),1iM1,u0n=μ(tn),uMn=ν(tn),0nM1,1nN,

s = τ α Γ ( 2 − α ) , λ = s h 2 . s=\tau^{\alpha} \Gamma(2-\alpha), \quad \lambda=\frac{s}{h^{2}} . s=ταΓ(2α),λ=h2s.

分数阶微分方程数值算例

数值算例

考虑问题:
0 C D t α u ( x , t ) = ∂ 2 u ∂ x 2 ( x , t ) + f ( x , t ) , ( x , t ) ∈ ( 0 , 1 ) × ( 0 , 1 ) , { }_{0}^{C} D_{t}^{\alpha} u(x, t)=\frac{\partial^{2} u}{\partial x^{2}}(x, t)+f(x, t),(x, t) \in(0,1) \times(0,1), 0CDtαu(x,t)=x22u(x,t)+f(x,t),(x,t)(0,1)×(0,1),

其中 0 < α < 1 0<\alpha<1 0<α<1, 右端源项 f ( x , t ) f(x, t) f(x,t) 和相应的初边值条件由真解 u ( x , t ) = sin ⁡ ( x ) t 2 u(x, t)=\sin (x) t^{2} u(x,t)=sin(x)t2 确定.

源项和初边值条件

由真解 u ( x , t ) = sin ⁡ ( x ) t 2 . u(x, t)=\sin (x) t^{2}. u(x,t)=sin(x)t2.
则有
{ u x = t 2 cos ⁡ x u x x = − t 2 sin ⁡ x { u t = 2 t sin ⁡ x u t t = 2 sin ⁡ x . \left\{\begin{array}{l}u_{x}=t^{2} \cos x \\ u_{x x}=-t^{2} \sin x\end{array} \quad\left\{\begin{array}{l}u_{t}=2 t \sin x \\ u_{t t}=2 \sin x .\end{array}\right.\right. {ux=t2cosxuxx=t2sinx{ut=2tsinxutt=2sinx.

将真解对应部分带入微分方程从而反解右端源项 f ( x , t ) f(x, t) f(x,t)

0 c D t α u ( x , t ) = 1 Γ ( 1 − α ) ∫ 0 t 2 s sin ⁡ x ( t − s ) α d s = − 2 sin ⁡ x Γ ( 1 − α ) ∫ 0 t ( t − s − t ) ( t − s ) − α d s = − 2 sin ⁡ x Γ ( 1 − α ) ∫ 0 t [ ( t − s ) 1 − α − t ( t − s ) − α ] d s = − 2 sin ⁡ x Γ ( 1 − α ) [ ∫ 0 t − ( t − s ) 1 − α d ( t − s ) + ∫ 0 1 t ( t − s ) − α d ( t − s ) ] = − 2 sin ⁡ x Γ ( 1 − α ) [ 1 2 − α ( t − s ) 2 − α ∣ t 0 + t 1 − α ( t − s ) 1 − α ∣ 0 t ] = − 2 sin ⁡ x Γ ( 1 − α ) [ t 2 − α 2 − α + t 1 − α ⋅ ( − t 1 − α ) ] = − 2 sin ⁡ x Γ ( 1 − α ) ⋅ − t 2 − α ( 2 − α ) ( 1 − α ) = 2 sin ⁡ x Γ ( 3 − α ) t 2 − α \begin{aligned} { }_{0}^{c} D_{t}^{\alpha} u(x, t)&=\frac{1}{\Gamma(1-\alpha)} \int_{0}^{t} \frac{2s \sin x}{(t-s)^{\alpha}} d s\\ &=\frac{-2 \sin x}{\Gamma(1-\alpha)} \int_{0}^{t}(t-s-t)(t-s)^{-\alpha} d s\\ &=\frac{-2 \sin x}{\Gamma(1-\alpha)} \int_{0}^{t}\left[(t-s)^{1-\alpha}-t(t-s)^{-\alpha}\right] d s\\ &=\frac{-2 \sin x}{\Gamma(1-\alpha)}\left[\int_{0}^{t}-(t-s)^{1-\alpha} d(t-s)+\int_{0}^{1} t(t-s)^{-\alpha} d(t-s)\right]\\ &=\frac{-2 \sin x}{\Gamma(1-\alpha)}\left[\left.\frac{1}{2-\alpha}(t-s)^{2-\alpha}\right|_{t} ^{0}+\left.\frac{t}{1-\alpha}(t-s)^{1-\alpha}\right|_{0} ^{t}\right]\\ &=\frac{-2 \sin x}{\Gamma(1-\alpha)}\left[\frac{t^{2-\alpha}}{2-\alpha}+\frac{t}{1-\alpha} \cdot\left(-t^{1-\alpha}\right)\right]\\ &=\frac{-2 \sin x}{\Gamma(1-\alpha)} \cdot \frac{-t^{2-\alpha}}{(2-\alpha)(1-\alpha)}\\ &=\frac{2 \sin x}{\Gamma(3-\alpha)} t^{2-\alpha} \end{aligned} 0cDtαu(x,t)=Γ(1α)10t(ts)α2ssinxds=Γ(1α)2sinx0t(tst)(ts)αds=Γ(1α)2sinx0t[(ts)1αt(ts)α]ds=Γ(1α)2sinx[0t(ts)1αd(ts)+01t(ts)αd(ts)]=Γ(1α)2sinx[2α1(ts)2αt0+1αt(ts)1α0t]=Γ(1α)2sinx[2αt2α+1αt(t1α)]=Γ(1α)2sinx(2α)(1α)t2α=Γ(3α)2sinxt2α

由于 0 C D t α u ( x , t ) = ∂ 2 u ∂ x 2 ( x , t ) + f ( x , t ) { }_{0}^{C} D_{t}^{\alpha} u(x, t)=\frac{\partial^{2} u}{\partial x^{2}}(x, t)+f(x, t) 0CDtαu(x,t)=x22u(x,t)+f(x,t)
于是 f ( x , t ) = 0 C D t α u ( x , t ) − ∂ 2 u ∂ x 2 ( x , t ) = 2 sin ⁡ x Γ ( 3 − α ) t 2 − α + t 2 sin ⁡ x . \begin{aligned} f(x, t)&={ }_{0}^{C} D_{t}^{\alpha} u(x, t)-\frac{\partial^{2} u}{\partial x^{2}}(x, t)\\ &=\frac{2 \sin x}{\Gamma(3-\alpha)} t^{2-\alpha}+t^{2} \sin x. \end{aligned} f(x,t)=0CDtαu(x,t)x22u(x,t)=Γ(3α)2sinxt2α+t2sinx.

综上所述, 完整的数值算例为:

{ 0 C D t α u ( x , t ) = u x x ( x , t ) + 2 sin ⁡ x Γ ( 3 − α ) t 2 − α + t 2 sin ⁡ x , x ∈ ( 0 , L ) , t ∈ ( 0 , T ] u ( x , 0 ) = 0 , x ∈ ( 0 , L ) u ( 0 , t ) = 0 , u ( L , t ) = t 2 sin ⁡ L , t ∈ [ 0 , T ] \left\{\begin{array}{l} { }_{0}^{C} D_{t}^{\alpha} u(x, t)=u_{x x}(x, t)+\frac{2 \sin x}{\Gamma(3-\alpha)} t^{2-\alpha}+t^{2} \sin x, \quad x \in(0, L), t \in(0, T] \\ u(x, 0)=0, \quad x \in(0, L) \\ u(0, t)=0, \quad u(L, t)=t^2\sin L, \quad t \in[0, T] \end{array}\right. 0CDtαu(x,t)=uxx(x,t)+Γ(3α)2sinxt2α+t2sinx,x(0,L),t(0,T]u(x,0)=0,x(0,L)u(0,t)=0,u(L,t)=t2sinL,t[0,T]

代数系统

由差分格式:
τ − α Γ ( 2 − α ) [ a 0 ( α ) u i n − ∑ k = 1 n − 1 ( a n − k − 1 ( α ) − a n − k ( α ) ) u i k − a n − 1 ( α ) u i 0 ] = δ x 2 u i n + f i n \frac{\tau^{-\alpha}}{\Gamma(2-\alpha)}\left[a_{0}^{(\alpha)} u_{i}^{n}-\sum\limits_{k=1}^{n-1}\left(a_{n-k-1}^{(\alpha)}-a_{n-k}^{(\alpha)}\right) u_{i}^{k}-a_{n-1}^{(\alpha)} u_{i}^{0}\right]=\delta_{x}^{2} u_{i}^{n}+f_{i}^{n} Γ(2α)τα[a0(α)uink=1n1(ank1(α)ank(α))uikan1(α)ui0]=δx2uin+fin
得到如下代数系统:
A ( u 1 n u 2 n ⋮ u M − 2 n u M − 1 n ) = b \mathbf{A}\left(\begin{array}{c}u_{1}^{n} \\ u_{2}^{n} \\ \vdots \\ u_{M-2}^{n} \\ u_{M-1}^{n}\end{array}\right)=\mathbf{b} Au1nu2nuM2nuM1n=b
其中
A = ( 2 h 2 + τ − α Γ ( 2 − α ) α 0 − 1 h 2 − 1 h 2 2 h 2 + τ − α Γ ( 2 − α ) a 0 − 1 h 2 ⋱ ⋱ 2 h 2 + τ − α Γ ( 2 − α ) a 0 − 1 h 2 ) \mathbf{A}=\left(\begin{array}{ccc}\frac{2}{h^{2}}+\frac{\tau^{-\alpha}}{\Gamma(2-\alpha)} \alpha_{0} & -\frac{1}{h^{2}} &\\ -\frac{1}{h^{2}} & \frac{2}{h^{2}}+\frac{\tau^{-\alpha}}{\Gamma(2-\alpha)} a_{0} & -\frac{1}{h^{2}} \\ &\ddots & \ddots &\\ & & \frac{2}{h^{2}}+\frac{\tau^{-\alpha}}{\Gamma(2-\alpha)} a_{0}& -\frac{1}{h^{2}}\end{array}\right) A=h22+Γ(2α)ταα0h21h21h22+Γ(2α)ταa0h21h22+Γ(2α)ταa0h21
b = 1 h 2 ⋅ ( u 0 n 0 ⋮ 0 u M n ) + τ − α a n − 1 Γ ( 2 − α ) ⋅ ( u 1 0 u 2 0 ⋮ u M − 2 0 u M − 1 0 ) + τ − α Γ ( 2 − α ) ∑ k = 1 n − 1 ( a n − k − 1 − a n − k ) ( u 1 k u 2 k ⋮ u M − 2 k u M − 1 k ) + f i n \mathbf{b}=\frac{1}{h^{2}} \cdot\left(\begin{array}{c}u_{0}^{n} \\ 0 \\ \vdots \\ 0 \\ u_{M}^{n}\end{array}\right)+\frac{\tau^{-\alpha}a_{n-1}}{\Gamma(2-\alpha)} \cdot\left(\begin{array}{c}u_{1}^{0} \\ u_{2}^{0} \\ \vdots \\ u_{M-2}^{0}\\ u_{M-1}^{0}\end{array}\right)+\frac{\tau^{-\alpha}}{\Gamma(2-\alpha)} \sum\limits_{k=1}^{n-1}\left(a_{n-k-1}-a_{n-k}\right)\left(\begin{array}{c}u_{1}^{k} \\ u_{2}^{k} \\ \vdots \\ u_{M-2}^{k}\\ u_{M-1}^{k}\end{array}\right)+f_{i}^{n} b=h21u0n00uMn+Γ(2α)ταan1u10u20uM20uM10+Γ(2α)ταk=1n1(ank1ank)u1ku2kuM2kuM1k+fin

数值结果

时间方向参数选取:
Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法(附Matlab代码)_第1张图片

时间方向数值结果:
Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法(附Matlab代码)_第2张图片

空间方向参数选取:
Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法(附Matlab代码)_第3张图片

空间方向数值结果:
Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法(附Matlab代码)_第4张图片

程序运行时间:

时间步长为 0.000100 空间步长为 0.012500 时 L1 插值逼近历时 122.812862 秒.

误差Error =6.9845e-07

而相同的网格剖分及精度下, 基于 L1 逼近的快速差分方法仅需历时 4.104740 秒.

误差Error =6.9887e-07

源代码

主程序:

clc,clear
tic
%% 初始化定解问题
alpha=0.2;
tau=1/10000;   T_a=0;      T_b=1;  
h=1/80;     L_a=0;      L_b=1;                
M=(L_b-L_a)/h;  
N=(T_b-T_a)/tau;       
x=L_a:h:L_b;        t=T_a:tau:T_b; 

u=zeros(M+1,N+1);          %   @u 初始化数值解
u(:,1)=f_ic(x,T_a,0,0);    %   定义初值条件
u(1,:)=f_bc(L_a,t,0,0);    %   定义左边界条件
u(M+1,:)=f_bc(L_b,t,0,0);  %   定义右边界条件

%% 两层格式(启动层)
n=2;
% 创建代数系统
m=n-1;
% 系数矩阵 Coefficient_Matrix_A
Coefficient_Matrix_A=toeplitz([2/h^2+tau^(-alpha)/gamma(2-alpha)*a(0,alpha),-1/h^2,zeros(M-3,1)']);
% 右端 Right_Term_B
Right_Term_B=1/h^2.*[u(1,n);zeros(M-3,1);u(M+1,n)]...
    +tau^(-alpha)/gamma(2-alpha)*a(m-1,alpha)*u(2:M,1)...
    +f_source(x(2:M),t(n),alpha)';
% 求解代数系统(由 k-2 层及第 k-1 层求第 k 层的值)
u(2:M,n)=Coefficient_Matrix_A\Right_Term_B;
fprintf('进程:\t%d/%d\n',n,N+1)

%% 三层格式
for n=3:N+1
    % 创建代数系统
    m=n-1;
    % 生成求和项
    S=zeros(M-1,1);
    for k=1:m-1
        S=S+(a(m-k-1,alpha)-a(m-k,alpha)).*u(2:M,k+1);
    end
    % 系数矩阵 Coefficient_Matrix_A
    Coefficient_Matrix_A=toeplitz([2/h^2+tau^(-alpha)/gamma(2-alpha)*a(0,alpha),-1/h^2,zeros(M-3,1)']);
    % 右端 Right_Term_B
    Right_Term_B1=1/h^2.*[u(1,n);zeros(M-3,1);u(M+1,n)]...
        +tau^(-alpha)/gamma(2-alpha)*a(m-1,alpha).*u(2:M,1)...
        +f_source(x(2:M),t(n),alpha)'...
        +tau^(-alpha)/gamma(2-alpha)*S;
    % 求解代数系统(由 k-2 层及第 k-1 层求第 k 层的值)
    u(2:M,n)=Coefficient_Matrix_A\Right_Term_B1;
    fprintf('进程:\t%d/%d\n',n,N+1)
end
% clc
fprintf(['时间步长为 %f 空间步长为 %f 时 L1 插值逼近 %d\n'],tau,h)
toc
%% 误差分析
U=zeros(size(u));
for m=1:M+1
    for n=1:N+1
        U(m,n)=u_exact(x(m),t(n),0,0);
    end
end
Error=max(max(abs(u-U)))

%% 绘图
figure
plot(t,u(7,:))
hold on
plot(t,U(7,:))
legend('数值解','精确解')

此处由于字数限制, 仅展示了主程序代码部分, 若需要绘图及误差分析等完整代码, 请在评论区留下邮箱.

参考文献

孙志忠,高广花.分数阶微分方程的有限差分方法(第二版).北京:科学出版社,2021.


本人水平有限, 若有不妥之处, 恳请批评指正.

作者:图灵的猫

作者邮箱: [email protected]

你可能感兴趣的:(偏微分方程,非线性方程求解,笔记,matlab,慢扩散方程,分数阶)