matlab重构流场,前面没问题 到了figure的时候出问题 显示
%这一节程序的目的:重构某一个原始的瞬态流场,_**并且将速度场数据拟合到规整的网格中。然后做平面云图**_。
n_recon = input('重构的流场是第几个:');%程序运行至此,需要人为在命令行窗口输入重构的流场是第几个
at=zeros(r,1);% 时间系数矩阵, r * 1
for j = 1:r
at(j,1)=dot(X_fluc(:,n_recon),POD_vector(:,n_snapshots-j+1));%计算时间系数,r*1的矩阵
end
X_reconstruct=zeros(6028500,1);
for j=1:3 %用前50个能量贡献较大的POD模态重构瞬态速度场,这里的50可以改成100,200,500等任意数
X_reconstruct = X_reconstruct+at(j,1)*POD_vector(:,n_snapshots-j+1);%308400*1
end
recon_u = X_reconstruct(1:2009500,1);%重构以后的速度U
recon_v = X_reconstruct((2009500+1):(2*2009500),1);%重构以后的速度V
recon_w = X_reconstruct((2009500*2+1):(3*2009500),1);%重构以后的速度W
xx = linspace( -0.0787 , 0.0787 , 100 );%对X坐标进行线性插值,形成1*100的行向量
yy = linspace( -0.0787 , 0.0787 , 100 );%对Y坐标进行线性插值,形成1*100的行向量
zz = linspace( -0.001 , 0.818 , 100 );%对Z坐标进行线性插值,形成1*100的行向量
nx = length(xx);
ny = length(yy);
nz = length(zz);
[x,y,z] = meshgrid(xx,yy,zz);% 100*100*100
u_new=griddata(fluent_data(:,1),fluent_data(:,2),fluent_data(:,3),recon_u,x,y,z);%将重构的速度U拟合到新的坐标系,100*100*100
v_new=griddata(fluent_data(:,1),fluent_data(:,2),fluent_data(:,3),recon_v,x,y,z);%将重构的速度V拟合到新的坐标系,100*100*100
w_new=griddata(fluent_data(:,1),fluent_data(:,2),fluent_data(:,3),recon_w,x,y,z);%将重构的速度W拟合到新的坐标系,100*100*100
u_new(isinf(u_new)) = 0;%如果值为无穷大,则赋值为0
u_new(isnan(u_new)) = 0;%如果非数值,则赋值为0
v_new(isinf(v_new)) = 0;
v_new(isnan(v_new)) = 0;
w_new(isinf(w_new)) = 0;
w_new(isnan(w_new)) = 0;
figure;
contourf(x,y,u_new,v_new);
figure;
contourf(y,z,v_new,w_new);
figure;
contourf(x,z,u_new,w_new);
但是总会报错 不知道怎么办了 目的是 将速度场数据拟合到规整的网格中。然后做平面云图
我发现你的问题可能是因为你的输入参数 x,y,u_new,v_new 等都是三维矩阵,而 contourf 函数只能接受二维矩阵作为输入。你需要将三维矩阵切片成二维矩阵,然后再用 contourf 函数绘制等高线图。
例如,如果你想在 x-y 平面上绘制 u_new 和 v_new 的等高线图,你可以用以下代码:
% 假设 z 是一个 1001 的向量,表示 z 轴上的坐标
% 选择一个 z 坐标作为切片平面,比如 z(50)
% 找到对应的 u_new 和 v_new 的切片矩阵
u_slice = squeeze(u_new(:,:,50)); % 100100 的二维矩阵
v_slice = squeeze(v_new(:,:,50)); % 100*100 的二维矩阵
% 绘制等高线图
figure;
contourf(x,y,u_slice,v_slice);
类似地,如果你想在 y-z 平面或 x-z 平面上绘制等高线图,你也可以用相同的方法切片。
希望这些信息能帮助你解决问题,祝你编程愉快!
您在使用MATLAB对三维流场进行重构时遇到了“contour3”函数的错误。这个错误通常是由于输入的向量维度不匹配导致的。您可以检查输入向量的维度是否正确,或者尝试使用其他绘图函数来绘制三维流场。
以下是一些可能有用的解决方案:
检查输入向量的维度是否正确。在使用“contour3”函数之前,请确保您的x,y和u_new、v_new向量的维度是正确的。您可以使用MATLAB的“size”函数来检查向量的维度是否匹配。
尝试使用其他绘图函数。如果您仍然无法解决问题,请尝试使用其他绘图函数来绘制三维流场。例如,您可以使用“quiver3”函数来绘制三维向量场。示例代码如下:
% 创建一些示例数据
x = linspace(-1,1,10);
y = linspace(-1,1,10);
z = linspace(-1,1,10);
[u,v,w] = meshgrid(x,y,z);
% 计算示例数据的矢量大小
mag = sqrt(u.^2 + v.^2 + w.^2);
% 绘制三维向量场
quiver3(u,v,w,u./mag,v./mag,w./mag);
将u_new、v_new向量重新排列。如果您的u_new、v_new向量维度是正确的,但仍然出现错误,请尝试重新排列这些向量以匹配x、y向量的维度。您可以使用MATLAB的“reshape”函数来重新排列向量。例如,如果x向量的维度为[10,10],您可以使用以下代码将u_new向量重新排列:
u_new = reshape(u_new, [10,10]);
以下答案基于GPT3.5大模型与博主波罗歌编写:
根据错误提示,可能是在调用contourf函数时,输入的参数超过了2个维度。根据你的代码,你应该使用slice函数来绘制三维流场的立体图像,而不是使用contourf函数来作平面云图。
下面是一个简单的代码示例,展示如何使用slice函数来绘制三维立体流场:
% 生成三维绘图所需的网格
[x,y,z] = meshgrid(xx,yy,zz);
% 绘制三维立体流场
hf = figure;
slice(x,y,z,u_new,0,0,0) % 在x=0处切割流场
shading interp % 设置描绘流线的质量
xlabel('x')
ylabel('y')
zlabel('z')
colorbar % 显示颜色标尺
你可以根据需要调整slice函数的参数来更改切割平面的位置和方向。同时,你也可以使用patch函数来添加额外的绘图元素,以丰富图像的内容。
参考GPT和自己的思路,在使用 contour3 函数绘制三维等值线图时,输入参数应该是包含 x、y 和 z 三个维度的矩阵。但是,在你的代码中,第 42 行调用了 contour3 函数时,只包含了 x 和 y 两个维度的矩阵,而没有包含 z 维度的矩阵。这导致了报错信息:输入参数最多只能包含 2 个维度。为了解决这个问题,你需要在调用 contour3 函数时,同时将 x、y 和 z 三个维度的矩阵作为输入参数。下面是修改后的代码:
figure;
contour3(x,y,z,u_new);
figure;
contour3(x,y,z,v_new);
figure;
contour3(x,y,z,w_new);
这样,你就可以绘制出包含三个维度的三维等值线图了。
该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据 MATLAB 的错误提示,输入参数最多只能包含 2 个维度,而 contour3 函数需要的输入参数应该包含 3 个维度。这说明在 contour3 函数的输入参数中,可能存在维度不匹配的问题。
-
在这段代码中,contour3 函数的输入参数应该是 x、y、z 和 u_new、v_new、w_new,其中 x、y、z 是网格的坐标,u_new、v_new、w_new 是网格上对应的速度分量。在这里,使用 contour3 函数进行可视化时,应该使用 meshgrid 函数生成三维网格坐标,而不是使用 linspace 函数生成一维坐标向量。
-
因此,下面是修改后的代码:
[x,y,z] = meshgrid(xx,yy,zz);
figure;
contour3(x,y,z,u_new);
figure;
contour3(x,y,z,v_new);
figure;
contour3(x,y,z,w_new);
这样修改后,就可以得到正确的三维等值线图了。