求解Klein-Gordon方程的有限差分法在MatLab中的实现

lf5gs5x2  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(1576)

我正在尝试数值求解Klein-Gordon方程,它可以找到here。为了确保我正确地解决了它,我将它与可以在同一链接上找到的解析解进行比较。我使用的是有限差分法和MatLab。初始空间条件是已知的,而不是初始时间条件。
我首先初始化常量和时空坐标系:

close all
clear 
clc
 
%% Constant parameters

A      = 2; 
B      = 3; 
lambda = 2; 
mu     = 3; 
a      = 4; 
b      = - (lambda^2 / a^2) + mu^2;  

%% Coordinate system

number_of_discrete_time_steps = 300; 
t = linspace(0, 2, number_of_discrete_time_steps); 
dt = t(2) - t(1); 

number_of_discrete_space_steps = 100; 
x = transpose( linspace(0, 1, number_of_discrete_space_steps) ); 
dx = x(2) - x(1);

接下来,我定义并绘制分析解决方案:

%% Analitical solution

Wa = cos(lambda * x) * ( A * cos(mu * t) + B * sin(mu * t) );

figure('Name', 'Analitical solution'); 
surface(t, x, Wa, 'edgecolor', 'none'); 
colormap(jet(256)); 
colorbar; 
xlabel('t'); 
ylabel('x'); 
title('Wa(x, t) - analitical solution');

解析解的曲线图如here所示。
最后,我定义了初始空间条件,执行有限差分法算法并绘制了解:

%% Numerical solution

Wn = zeros(number_of_discrete_space_steps, number_of_discrete_time_steps);

Wn(1, :) = Wa(1, :); 
Wn(2, :) = Wa(2, :); 

for j = 2 : (number_of_discrete_time_steps - 1)  

    for i = 2 : (number_of_discrete_space_steps - 1) 

        Wn(i + 1, j) = dx^2 / a^2 ...                        
                     * ( ( Wn(i, j + 1) - 2 * Wn(i, j) + Wn(i, j - 1) ) / dt^2 + b * Wn(i - 1, j - 1) ) ...
                     + 2 * Wn(i, j) - Wn(i - 1, j); 
    end

end

figure('Name', 'Numerical solution'); 
surface(t, x, Wn, 'edgecolor', 'none'); 
colormap(jet(256)); 
colorbar; 
xlabel('t'); 
ylabel('x'); 
title('Wn(x, t) - numerical solution');

数值解的曲线图如here所示。
绘制的两个曲线图不一样,这证明我在算法中做错了什么。问题是,我找不到错误。请帮我找到他们。
总而言之,请帮助我更改代码,以便两个绘制的图形变得大致相同。谢谢您抽时间见我。

tcomlyy6

tcomlyy61#

w_tt = a^2 * w_xx - b*w的有限差分离散是

( w(i,j+1) - 2*w(i,j) + w(i,j-1) ) / dt^2
  = a^2 * ( w(i+1,j) - 2*w(i,j) + w(i-1,j) ) / dx^2 - b*w(i,j)

按照您的顺序,这将给出递归公式

w(i,j+1) = dt^2 * ( (a/dx)^2 * ( w(i+1,j) - 2*w(i,j) + w(i-1,j) ) - b*w(i,j) )
            +2*w(i,j) - w(i,j-1)

稳定的条件是至少a*dt/dx < 1。对于目前的参数,这是不满足的,他们给出了这个比率为2.6。将时间离散化增加到1000点就足够了。
接下来是边界条件。除了时间0dt的两个前导列外,还需要设置x=0x=1的边界上的值。也从精确的解中复制它们。

Wn(:,1:2) = Wa(:,1:2); 
Wn(1,:)=Wa(1,:);
Wn(end,:)=Wa(end,:);

然后将b的定义(和用法)更正为源代码中的定义

b      = - (lambda^2 * a^2) + mu^2;

所得到的数字图像看起来与颜色图中的分析图像相同。不同的情节证实了亲密性

相关问题