簡體   English   中英

在 MATLAB 中繪制球諧函數時出錯:網格 arrays 必須具有 NDGRID 結構

[英]Error plotting spherical harmonics in MATLAB: Grid arrays must have NDGRID structure

我正在嘗試使用球諧函數來表示 3D 中聲學和流體流動中球面 object 的擾動。到目前為止,我已經能夠在 3D 球面 object 上使用二維擾動,但是,我想擴展那。

當前代碼表示具有 2D 擾動的 3D 球體,因此擾動僅在 x 和 y 中:

clearvars; clc; close all;
Nx = 128;
Ny = 128;
Nz = 128; 
Lx =128; 
Ly = 128; 
Lz = 128; 
xi  = (0:Nx-1)/Nx*2*pi;
xi_x =  2*pi/Lx;
x =  xi/xi_x;
yi  = (0:Ny-1)/Ny*2*pi;
yi_y =  2*pi/Ly;
y = yi/yi_y;
zi  = (0:Nz-1)/Nz*2*pi;
zi_z =  2*pi/Lz;
z = zi/zi_z;
[X,Y,Z] = meshgrid(x,y,z);
A = 2*pi / Lx;
B = 2*pi / Ly;
C = 2*pi / Lz;
x0 = 64; 
y0 = 64;
z0 = 64; 
rx0 = 20; 
ry0 =  20; 
rz0 =  20;
p = 3;
b = 0.1; % pert amplitude 
c = 12; 
d = 1;
a = 4;
theta = atan2(Y -y0,  X-x0) - (pi/c);
p0 = ((X-x0) .* (X-x0)) /(rx0 * rx0) + ((Y-y0) .* (Y-y0))/(ry0 * ry0) + ((Z-z0) .* (Z-z0))/(rz0 * rz0);
Test =d + a * exp((-1. * p0 .* (1 - b .* cos(c * theta))).^p) ;
figure
isosurface(X,Y,Z,Test);
shading flat;
grid on;

返回等值面:

在此處輸入圖像描述

但是,我想實現類似於這個 plot 的東西(z 中的擾動): 在此處輸入圖像描述

這是我嘗試使用球諧函數重現上圖:

clearvars; clc; close all;
%in spherical coord
%calculate r
Nx = 128;  
Ny = 128;  
Nz = 128;
Lx =128; 
Ly = 128; 
Lz = 128; 
xi  = (0:Nx-1)/Nx*2*pi;
xi_x =  2*pi/Lx;
x =  xi/xi_x;
yi  = (0:Ny-1)/Ny*2*pi;
yi_y =  2*pi/Ly;
y = yi/yi_y;
zi  = (0:Nz-1)/Nz*2*pi;
zi_z =  2*pi/Lz;
z = zi/zi_z;
r = sqrt(x.^2 + y.^2 + z.^2); 
% Create the grid
delta = pi/127; 
%Taking for instance l=1, m=-1 you can generate this harmonic on a (azimuth, elevation) grid like this:
azimuths = 0 : delta : pi; 
elevations = 0 : 2*delta : 2*pi; 
[R, A, E] = ndgrid(r, azimuths, elevations); %A is phi and E is theta
H = 0.25 * sqrt(3/(2*pi)) .* exp(-1j*A) .* sin(E) .* cos(E);
%transform the grid back to cartesian grid like this:
%can also add some radial distortion to make things look nicer:
%the radial part depends on your domain
X = r .* cos(A) .* sin(E); 
Y = r .* sin(A) .* sin(E); 
Z = r .* cos(E); 
%parameters
x0 = 64;  
y0 = 64; 
z0 = 64;  
rx0 = 20; 
ry0 =  20; 
rz0 =  20;
p = 3;
b = 0.1; % pert amplitude 
%c = 12; 
d = 1;
a = 4;
p0 = ((X-x0) .* (X-x0)) /(rx0 * rx0) + ((Y-y0) .* (Y-y0))/(ry0 * ry0) + ((Z-z0) .* (Z-z0))/(rz0 * rz0);
Test1 =d + a * exp((-1. * p0 .*H).^p) ;
figure
isosurface(X,Y,Z,real(Test1)); %ERROR

這給了我以下錯誤:

Error using griddedInterpolant
Grid arrays must have NDGRID structure.

我設置球諧函數的方式有問題嗎? Test1的函數形式?? 謝謝

我認為問題在於您在第二個代碼中創建了一個 NDGrid。 在第一個有效的代碼中,您創建了一個 meshgrid。

isosurface需要一個 meshgrid 格式的網格,稍后將其轉換為具有permute的 NDGrid 格式,僅用於griddedInterpolant function。通過輸入 NDGrid,此操作將失敗。

你為什么轉而創建 NDGrid? 使用meshgrid時是否遇到相同的錯誤?

編輯

好的,新理論:我認為問題出在網格本身。 閱讀有關ndgrid的文檔以獲取更多信息,但簡而言之:NDGrid 格式是一個完全矩形的網格,其中所有節點都被 90° 角完全包圍。 通過使用ndgrid(r, azimuths, elevations)meshgrid(r, azimuths, elevations) , elevations) 跨越網格,您將得到這個矩形網格,但當然這個網格是沒有意義的,因為 r,方位角和高程代表球坐標。 通過稍后將 R、A 和 E 轉換為笛卡爾坐標 X、Y 和 Z,您將獲得適當的球形網格,但該網格不再是 NDGrid 結構,因為它不再是矩形。

所以你必須找到一個解決方法來計算你的球形網格。

  • 也許您可以使用另一個 function 來可視化不采用任何網格格式作為輸入的數據
  • 或者,也許您可以通過將球體外部的所有值設置為 0 來嘗試使用矩形笛卡爾網格。(您必須相應地細化網格以實現對球體的良好估計)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM