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


    Caputo 分数阶一维问题基于 L1 逼近的快速差分方法

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

    考虑如下时间分数阶慢扩散方程初边值问题
    { 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\{

    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]
    \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]).

    本文给出求解上述时间分数阶慢扩散方程初边值问题基于 L1 逼近的快速差分方法.

    差分格式的建立

    在结点 ( 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, \quad 1 \leqslant n \leqslant N . 0CDtαu(xi,tn)=uxx(xi,tn)+fin,1iM1,1nN.
    对上式中时间分数阶导数应用快速的 L1 公式离散、空间二阶导数 应用二阶中心差商离散, 可得
    { 1 Γ ( 1 − α ) [ ∑ l = 1 N exp ⁡ ω l F l , i n + a ^ 0 ( α ) ( U i n − U i n − 1 ) ] = δ x 2 U i n + f i n + ( r 4 ) i n , 1 ⩽ i ⩽ M − 1 , 1 ⩽ n ⩽ N , F l , i 1 = 0 , F l , i n = e − s l τ F l , i n − 1 + B l ( U i n − 1 − U i n − 2 ) , 1 ⩽ l ⩽ N exp ⁡ , 1 ⩽ i ⩽ M − 1 , 2 ⩽ n ⩽ N , \left\{

    1Γ(1α)[l=1NexpωlFl,in+a^0(α)(UinUin1)]=δx2Uin+fin+(r4)in,1iM1,1nN,Fl,i1=0,Fl,in=eslτFl,in1+Bl(Uin1Uin2),1lNexp,1iM1,2nN,
    \right. Γ(1α)1[l=1NexpωlFl,in+a^0(α)(UinUin1)]=δx2Uin+fin+(r4)in,1iM1,1nN,Fl,i1=0,Fl,in=eslτFl,in1+Bl(Uin1Uin2),1lNexp,1iM1,2nN,

    且存在正常数 c 4 c_{4} c4 使得
    ∣ ( r 4 ) i n ∣ ⩽ c 4 ( τ 2 − α + h 2 + ϵ ) , 1 ⩽ i ⩽ M − 1 , 1 ⩽ n ⩽ N . \left|\left(r_{4}\right)_{i}^{n}\right| \leqslant c_{4}\left(\tau^{2-\alpha}+h^{2}+\epsilon\right), \quad 1 \leqslant i \leqslant M-1,1 \leqslant n \leqslant N . (r4)inc4(τ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 .

    {Ui0=φ(xi),1iM1,U0n=μ(tn),UMn=ν(tn),0nN.
    {Ui0=φ(xi),U0n=μ(tn),1iM1,UMn=ν(tn),0nN.
    在上式中略去小量项 ( r 4 ) i n \left(r_{4}\right)_{i}^{n} (r4)in, 并用数值解 u i n u_{i}^{n} uin 代替精确解 U i n U_{i}^{n} Uin, 可得求解问题的如下差分格式:
    { 1 Γ ( 1 − α ) [ ∑ l = 1 N exp ⁡ ω l F l , i n + a ^ 0 ( α ) ( u i n − u i n − 1 ) ] = δ x 2 u i n + f i n 1 ⩽ i ⩽ M − 1 , 1 ⩽ n ⩽ N F l , i 1 = 0 , F l , i n = e − s l τ F l , i n − 1 + B l ( u i n − 1 − u i n − 2 ) 1 ⩽ l ⩽ N exp ⁡ , 1 ⩽ i ⩽ M − 1 , 2 ⩽ n ⩽ N u i 0 = φ ( x i ) , 1 ⩽ i ⩽ M − 1 , u 0 n = μ ( t n ) , u M n = ν ( t n ) , 0 ⩽ n ⩽ N \left\{
    1Γ(1α)[l=1NexpωlFl,in+a^0(α)(uinuin1)]=δx2uin+fin1iM1,1nNFl,i1=0,Fl,in=eslτFl,in1+Bl(uin1uin2)1lNexp,1iM1,2nNui0=φ(xi),1iM1,u0n=μ(tn),uMn=ν(tn),0nN
    \right.
    Γ(1α)1[l=1NexpωlFl,in+a^0(α)(uinuin1)]=δx2uin+fin1iM1,1nNFl,i1=0,Fl,in=eslτFl,in1+Bl(uin1uin2)1lNexp,1iM1,2nNui0=φ(xi),1iM1,u0n=μ(tn),uMn=ν(tn),0nN

    { u i k ∣ 0 ⩽ i ⩽ M , 0 ⩽ k ⩽ n − 1 } \left\{u_{i}^{k} \mid 0 \leqslant i \leqslant M, 0 \leqslant k \leqslant n-1\right\} {uik0iM,0kn1} 已知时, 得到 { F l , i n ∣ 1 ⩽ l ⩽ N exp ⁡ , 1 ⩽ i ⩽ M − 1 } \left\{F_{l, i}^{n} \mid 1 \leqslant l \leqslant N_{\exp }, 1 \leqslant i \leqslant M-1\right\} {Fl,in1lNexp,1iM1}, 并将其代入差分格式的左端, 得到关于 { u i n ∣ 0 ⩽ i ⩽ M } \left\{u_{i}^{n} \mid 0 \leqslant i \leqslant M\right\} {uin0iM} 的线性方程组, 其运算量为 O ( M N exp ⁡ ) O\left(M N_{\exp }\right) O(MNexp). 用追赶法解三对角方程组的运算量为 O ( M ) O(M) O(M). 因而此快速算法的总运算量为 O ( M N N exp ⁡ ) O\left(M N N_{\exp }\right) O(MNNexp).

    由传统的基于 L1 逼近得到关于 { u i n ∣ 0 ⩽ i ⩽ M } \left\{u_{i}^{n} \mid 0 \leqslant i \leqslant M\right\} {uin0iM} 的线性方程组, 其运算量为 O ( M n ) O(M n) O(Mn). 其算法的总运算量为 O ( M ∑ n = 1 N n ) = O ( M N 2 ) O\left(M \sum\limits_{n=1}^{N} n\right)=O\left(M N^{2}\right) O(Mn=1Nn)=O(MN2).

    N ≫ N exp ⁡ N \gg N_{\exp } NNexp 时, O ( M N 2 ) ≫ O ( M N N exp ⁡ ) O\left(M N^{2}\right) \gg O\left(M N N_{\exp }\right) O(MN2)O(MNNexp). 我们将上述算法称为基于 L1 逼近的快速算法或快速的 L1 差分格式.

    分数阶微分方程数值算例

    数值算例

    考虑问题:
    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\{

    ux=t2cosxuxx=t2sinx
    \quad\left\{
    ut=2tsinxutt=2sinx.
    \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 − α

    0cDtαu(x,t)=1Γ(1α)0t2ssinx(ts)αds=2sinxΓ(1α)0t(tst)(ts)αds=2sinxΓ(1α)0t[(ts)1αt(ts)α]ds=2sinxΓ(1α)[0t(ts)1αd(ts)+01t(ts)αd(ts)]=2sinxΓ(1α)[12α(ts)2α|t0+t1α(ts)1α|0t]=2sinxΓ(1α)[t2α2α+t1α(t1α)]=2sinxΓ(1α)t2α(2α)(1α)=2sinxΓ(3α)t2α
    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 .

    f(x,t)=0CDtαu(x,t)2ux2(x,t)=2sinxΓ(3α)t2α+t2sinx.
    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\{

    0CDtαu(x,t)=uxx(x,t)+2sinxΓ(3α)t2α+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]
    \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]

    代数系统

    由差分格式:
    1 Γ ( 1 − α ) [ ∑ l = 1 N exp ⁡ ω l F l , i n + a ^ 0 ( α ) ( u i n − u i n − 1 ) ] = δ x 2 u i n + f i n \frac{1}{\Gamma(1-\alpha)}\left[\sum\limits_{l=1}^{N_{\exp }} \omega_{l} F_{l, i}^{n}+\hat{a}_{0}^{(\alpha)}\left(u_{i}^{n}-u_{i}^{n-1}\right)\right]=\delta_{x}^{2} u_{i}^{n}+f_{i}^{n} Γ(1α)1l=1NexpωlFl,in+a^0(α)(uinuin1)=δx2uin+fin
    得到如下代数系统:
    A ( u 1 n u 2 n ⋮ u M − 2 n u M − 1 n ) = b \mathbf{A}\left(

    u1nu2nuM2nuM1n
    \right)=\mathbf{b} Au1nu2nuM2nuM1n=b
    其中
    A = ( 1 Γ ( 1 − α ) a ^ 0 ( α ) + 2 h 2 − 1 h 2 − 1 h 2 1 Γ ( 1 − α ) a ^ 0 ( α ) + 2 h 2 − 1 h 2 ⋱ ⋱ 1 Γ ( 1 − α ) a ^ 0 ( α ) + 2 h 2 − 1 h 2 ) \mathbf{A}=\left(
    1Γ(1α)a^0(α)+2h21h21h21Γ(1α)a^0(α)+2h21h21Γ(1α)a^0(α)+2h21h2
    \right)
    A=Γ(1α)1a^0(α)+h22h21h21Γ(1α)1a^0(α)+h22h21Γ(1α)1a^0(α)+h22h21

    b = 1 h 2 ⋅ ( u 0 n 0 ⋮ 0 u M n ) + a ^ 0 ( α ) Γ ( 1 − α ) ⋅ ( u 1 n − 1 u 2 n − 1 ⋮ u M − 2 n − 1 u M − 1 n − 1 ) − 1 Γ ( 1 − α ) ∑ l = 1 N e x p ω l F l , i n + f i n \mathbf{b}=\frac{1}{h^{2}} \cdot\left(

    u0n00uMn
    \right)+\frac{\hat{a}_0^{(\alpha)}}{\Gamma(1-\alpha)} \cdot\left(
    u1n1u2n1uM2n1uM1n1
    \right)-\frac{1}{\Gamma(1-\alpha)} \sum\limits_{l=1}^{N_{exp}} \omega_{l} F_{l, i}^{n}+f_{i}^{n} b=h21u0n00uMn+Γ(1α)a^0(α)u1n1u2n1uM2n1uM1n1Γ(1α)1l=1NexpωlFl,in+fin

    数值结果

    时间方向参数选取:
    FL1参数设置-时间方向-

    时间方向数值结果:
    FL1数值结果-时间方向-

    空间方向参数选取:
    FL1参数设置-空间方向-

    空间方向数值结果:
    FL1数值结果-空间方向-

    程序运行时间:

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

    误差Error =6.9887e-07

    而相同的网格剖分及精度下, 传统的基于 L1 逼近需历时 122.812862 秒.

    误差Error =6.9845e-07

    源代码

    主程序:

    clc,clear
    tic
    %% 初始化定解问题
    alpha=0.2;
    epsilon=1e-8;
    tau_hat=1e-6;
    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);  %   定义右边界条件
    
    [xs,ws,nexp] = sumofexpappr2new(alpha,epsilon,tau_hat,T_b);
    %% 两层格式(启动层)
    n=2;
    % 创建代数系统 
    F_l=zeros(M-1,nexp);
    % 系数矩阵 Coefficient_Matrix_A
    Coefficient_Matrix_A=toeplitz([2/h^2+1/gamma(1-alpha)*a_hat(0,alpha,tau),-1/h^2,zeros(M-3,1)']);
    % 右端 Right_Term_B
    Right_Term_B=1/gamma(1-alpha)*a_hat(0,alpha,tau)*u(2:M,n-1)...
        +f_source(x(2:M),t(n),alpha)'...
        +1/h^2.*[u(1,n);zeros(M-3,1);u(M+1,n)]...
        -1/gamma(1-alpha)*F_l*ws;
    % 求解迭代系统(由0层求第1层的值)
    u(2:M,n)=Coefficient_Matrix_A\Right_Term_B;
    fprintf('进程:\t%d/%d\n',n,N+1)
    
    %% 三层格式
    B_l=1./(-xs*tau).*(exp(1).^(-2*xs*tau)-exp(1).^(-xs*tau));
    for n=3:N+1
        % 创建代数系统
        F_l=F_l*diag(exp(1).^(-xs*tau))+((u(2:M,n-1)-u(2:M,n-2)))*B_l';
        % 系数矩阵 Coefficient_Matrix_A
        Coefficient_Matrix_A=toeplitz([2/h^2+1/gamma(1-alpha)*a_hat(0,alpha,tau),-1/h^2,zeros(M-3,1)']);
        % 右端 Right_Term_B1
        Right_Term_B1=1/gamma(1-alpha)*a_hat(0,alpha,tau)*u(2:M,n-1)...
            +f_source(x(2:M),t(n),alpha)'...
            +1/h^2.*[u(1,n);zeros(M-3,1);u(M+1,n)]...
            -1/gamma(1-alpha)*F_l*ws;
        % 求解代数系统(由 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('数值解','精确解')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

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

    参考文献

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


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

    作者:图灵的猫

    作者邮箱: turingscat@126.com

  • 相关阅读:
    vector的模拟实现
    【每日刷题】Day22
    第8章 注意力机制与外部记忆
    零基础看深度学习python代码的基本方法
    [深度学习]基于C++和onnxruntime部署yolov10的onnx模型
    C语言第六课:函数(1)——分类、参数与调用
    Flink sql 实现 -connection-clickhouse的 source和 sink
    import导入顺序杂乱的问题
    动态规划---最长序列问题详解
    Kotlin 的锁和多线程同步
  • 原文地址:https://blog.csdn.net/qq_42818403/article/details/125367493