绘制波动方程的二维数值解的问题

Problem plotting 2d numerical solution of wave equation

我正在尝试在 MATLAB (R2020a) 中制作二维波动方程的动画。到目前为止,我相信有限差分法是正确实施的。然而;当我尝试在 matlab 中使用“surf”命令绘制这些值时,它不起作用。 到目前为止,这是我的脚本:

clear
clc
close all
VL = 2;

tMin = 0;
tMax = 30;

xMin = -10;
xMax = 10;

yMin = -10;
yMax = 10;

Nt = 100;
Nx = 100;
Ny = 100;

t = linspace(tMin,tMax,Nt);
x = linspace(xMin,xMax,Nx);
y = linspace(yMin,yMax,Ny);

DeltaT = t(2) - t(1);
DeltaX = x(2) - x(1);
DeltaY = y(2) - y(1);

CFX = ((VL)*(DeltaT/DeltaX))^2;
CFY = ((VL)*(DeltaT/DeltaY))^2;

u = zeros(Nt,Nx,Ny);

[X,Y] = meshgrid(x,y);

u(1,:,:) = Initial(t(1),X,Y);

u(2,:,:) = Initial(t(1),X,Y) + InitialV(t(1),X,Y);

for i=3:Nt
    for j=1:Nx
        for k=1:Ny
            if(j==1 || j==Nx || k==1 || k==Ny)
                u(i,j,k) = 0;
            else
                u(i,j,k) = 2*u(i-1,j,k) - u(i-2,j,k) + (CFX)*(u(i-1,j+1,k) - 2*u(i-1,j,k) + u(i-1,j-1,k)) + (CFY)*(u(i-1,j,k+1) - 2*u(i-1,j,k) + u(i-1,j,k-1));
            end           
        end        
    end            
end

函数:Initial 和 initialV 分别是 u(0,x,​​y) 和 ut(0,x,​​y)。 我相信此代码适用于查找 u 的函数值,但是当我尝试按如下方式绘制结果时:

for i=1:Nt
    figure
    clf
    hold on
    surf(X,Y,u(i,:,:))
end

我收到一条错误消息,提示 Z 必须是矩阵...在我看来这似乎很奇怪,将 3d 数组切片会得到 2d 矩阵。 我怎样才能制作一个动画,将 u 显示为 x 和 y 的函数? 提前致谢!非常感谢任何帮助

P.S。我是这个页面的新手,所以如果我在共享代码时忽略了某些准则,请告诉我,我会进行调整。

要强制 u(i,:,:) 匹配 XY 的 100 x 100 维度,请尝试使用 reshape() 函数。

for i=1:Nt
    figure
    clf
    hold on
    surf(X,Y,reshape(u(i,:,:),[100 100]));
end

另一种删除 u 数组的单一维度的方法是使用 squeeze(),因为它不需要有关数组剩余大小的任何信息。

for i = 1:Nt
    figure
    clf
    hold on
    surf(X, Y, squeeze(u(i, :, :)))
end