在 NLS 上使用 Kutta Merson

计算科学 pde 非线性方程 龙格库塔
2021-12-15 08:13:22

我正在尝试使用Kutta-Merson来获得与Solitons、Nonlinear Evolution Equations and Inverse Scattering - MJ Ablowitz - pg 140一书中相同的结果

作者建议在以下方案中使用 Kutta-Merson:

idujdt+(uj12uj+uj+1)/h2+|uj|2(uj1+uj+1)=0

给定的周期性条件和以下初始条件

u(x,0)=0.5+0.05cos(μx)+105isin(μx)
在哪里L=2π2是区间的长度和μ=2π/L

我对 PDE 的这种方法不是很熟悉,但这是我尝试做的,使用 scilab:

我使用 scilab 函数定义了拉普拉斯算子和非线性,并将该方案以库塔方法的形式

dujdt=F(uj)

我使用周期性条件来定义 F。这是拉普拉斯算子:

function l =L(u)
    A = zeros(M+1,M+1)
    // Condição periódica imposta ao laplaciano
    A(1,1) = -2; A(1,2) = 1; A(1,M+1) = 1
    for j=2:M
        A(j,j-1) = 1; A(j,j) = -2; A(j,j+1) = 1
    end
    A(M+1,1) = 1; A(M+1,M) = 1; A(M+1,M+1) = -2
    A = h^(-2)*A

    l = A*u
endfunction

这是非线性热

function n = N(u)
    n(1) = abs(u(1))^2 * (u(M+1) + u(2))
    for j=2:M
        n(j) = abs(u(j))^2 *(u(j-1) + u(j+1))
    end
    n(M+1) = abs(u(M+1))^2 * (u(M) + u(1))
endfunction

则 F 变为:

function f = F(u)
    f = %i*(L(u) + N(u)) 
endfunction

最后我用它来计算解决方案

for n=1:Nt

    k1 = k*F(U(:,n))
    k2 = k*F(U(:,n) + 1/3*k1)
    k3 = k*F(U(:,n) + 1/6*k1 + 1/6*k2)
    k4 = k*F(U(:,n) + 1/8*k1 + 3/8*k3)
    k5 = k*F(U(:,n) + 1/2*k1 - 3/2*k3 + 2*k4)

    U(:,n+1) = U(:,n) + 1/6*k1 + 2/3*k4 + 1/6*k5
end

我在时间网格使用 5000 个点,在 x-grid 使用 20 个点。我真的一无所知,所以如果我在做一些奇怪的事情,请告诉我并推荐一些关于它的材料

1个回答

A在 的每次调用中计算矩阵是没有意义的F,实际上你根本不需要构造这个矩阵。使用向量运算

function l =Lin(u)
  l = -2*u;
  l(1:M) += u(2:M+1); l(M+1) += u(1);
  l(2:M+1) += u(1:M); l(1) += u(M+1);
  l *= h^(-2);
endfunction

同样,您可以矢量化非线性部分

function n = NonLin(u)
    n = 0*u;
    n(1)=u(M+1)+u(2);
    n(2:M)= u(1:M-1)+u(3:M+1);
    n(M+1)=u(M)+u(1);
    n = n.*abs(u).^2
endfunction

function f = F(u)
  f = 1i.*(Lin(u) + NonLin(u));
endfunction 

使用M=50andk=0.02和描述的其他数据,我得到输出

在此处输入图像描述

从时间 5 到 10 似乎有一个回到原始曲线的振荡