如何解决绘制波动方程二维数值解的问题
我正在尝试在 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,Y) + InitialV(t(1),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,k) = 2*u(i-1,k) - u(i-2,k) + (CFX)*(u(i-1,j+1,k) - 2*u(i-1,k) + u(i-1,j-1,k)) + (CFY)*(u(i-1,k+1) - 2*u(i-1,k-1));
end
end
end
end
函数:Initial 和 initialV 分别是 u(0,x,y) 和 ut(0,y)。 我相信此代码可用于查找 u 的函数值,但是当我尝试按如下方式绘制结果时:
for i=1:Nt
figure
clf
hold on
surf(X,Y,u(i,:))
end
我收到一个错误,说 Z 必须是一个矩阵...在我看来,这看起来很奇怪,将 3d 数组切片会产生一个 2d 矩阵。 如何制作一个动画,将 u 显示为 x 和 y 的函数? 提前致谢!非常感谢任何帮助
附言我是这个页面的新手,所以如果我在分享代码时忽略了某些准则,请告诉我,我会调整它。
解决方法
另一种删除 u
数组的单例维度的方法是使用 squeeze()
,因为它不需要关于数组剩余大小的任何信息。
for i = 1:Nt
figure
clf
hold on
surf(X,Y,squeeze(u(i,:,:)))
end
,
要强制 u(i,:)
匹配 X
和 Y
的 100 x 100 维度,请尝试使用 reshape()
函数。
for i=1:Nt
figure
clf
hold on
surf(X,reshape(u(i,:),[100 100]));
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。