绘制波动方程的二维数值解的问题
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,:,:)
匹配 X
和 Y
的 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
我正在尝试在 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,:,:)
匹配 X
和 Y
的 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