[英]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 結構,因為它不再是矩形。
所以你必須找到一個解決方法來計算你的球形網格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.