tudoumama2018 2023-03-03 15:21 采纳率: 45.5%
浏览 84
已结题

matlab重构三维流场

matlab重构流场,前面没问题 到了figure的时候出问题 显示

img

%这一节程序的目的:重构某一个原始的瞬态流场,_**并且将速度场数据拟合到规整的网格中。然后做平面云图**_。
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);

但是总会报错 不知道怎么办了 目的是 将速度场数据拟合到规整的网格中。然后做平面云图

  • 写回答

6条回答 默认 最新

  • 实相实相 2023-03-03 17:54
    关注

    我发现你的问题可能是因为你的输入参数 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)); % 100
    100 的二维矩阵
    v_slice = squeeze(v_new(:,:,50)); % 100*100 的二维矩阵
    % 绘制等高线图
    figure;
    contourf(x,y,u_slice,v_slice);
    类似地,如果你想在 y-z 平面或 x-z 平面上绘制等高线图,你也可以用相同的方法切片。

    希望这些信息能帮助你解决问题,祝你编程愉快!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 马马马花花 2023-03-03 16:13
    关注

    您在使用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]);
    
    评论
  • 蓝白、波罗歌 2023-03-03 18:03
    关注

    以下答案基于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函数来添加额外的绘图元素,以丰富图像的内容。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-03 20:10
    关注
    评论
  • 「已注销」 2023-03-03 15:34
    关注

    参考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);
    

    这样,你就可以绘制出包含三个维度的三维等值线图了。

    评论 编辑记录
  • MarkHan_ 2023-03-03 15:35
    关注

    该回答引用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);
    
    
    

    这样修改后,就可以得到正确的三维等值线图了。

    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月18日
  • 已采纳回答 3月10日
  • 修改了问题 3月3日
  • 创建了问题 3月3日

悬赏问题

  • ¥60 PCDN如何使用宽带的电视业务通道拨号叠加带宽?
  • ¥15 遇到这种校园宽带网络应该怎么样解决?
  • ¥30 AXI VIP验证多余打印问题
  • ¥15 利用加权最小二乘法求某品牌手机价格指标,已按照总销量计算出权重,各类型号手机价格已知,如何求得价格指标?
  • ¥15 如何自制一个硬件钱包,有兴趣的朋友一起交流
  • ¥15 (关键词-聊天软件)
  • ¥15 求大家看看这个编程的编法没有思路啊
  • ¥20 WSL打开图形化程序子窗口无法点击
  • ¥15 Jupyter Notebook 数学公式不渲染
  • ¥20 ERR_CACHE_MISS 确认重新提交表单