首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反射4d对称数据

反射4d对称数据
EN

Stack Overflow用户
提问于 2021-07-16 11:14:11
回答 1查看 71关注 0票数 1

我发现没有关于如何反映对称4d数据的例子,当三维模拟需要使用对称平面来减少计算(例如ANSYS、COMSOL等)时,这种是非常有用的。此示例显示了与COMSOL模拟相对应的数据文件结构,其结构为: X、Y、Z、振幅

该模型沿Y面具有对称性,并在该平面上被切片,因此需要计算较少的网格单元。为了获得一个完整的Y平面视图(即Y从-0.5到0.5),数据必须沿Y平面反射。

此类问题的示例代码如下所示:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

### generate a SIMULATION type-file###
X = np.linspace(-0.5, 0.5, 50)
Y = np.linspace(-0.5, 0, 50)    #to be reflected/extended to 0.5
Z = np.linspace(-0.5, 0.5, 50)
Xq, Yq, Zq = np.meshgrid(X, Y, Z)
Amp = 1* np.exp(-((Xq - 0) ** 2 / (0.03) + ( Yq - 0) ** 2 / (0.03) + ( Zq - 0) ** 2 / (0.03)))

datafile = np.vstack([Xq.ravel(), Yq.ravel(), Zq.ravel(), Amp.ravel()]).T   #resemble the simulation data structur, in this case X, Y, Z, Amp

### PYTHON POST-PROCESSING ###
X = datafile[:, 0]
Y = datafile[:, 1]
Z = datafile[:, 2]
Amp = datafile[:, 3]    #Amplitude could be a Pressure, Force, Magnetic field, etc

xq = 0.0    #choose an arbitrary plane to show amplitude distribution over this plane
yq = np.linspace(min(Y), max(Y), 50)  
zq = np.linspace(min(Z), max(Z), 50)
Xq, Yq, Zq = np.meshgrid(xq, yq, zq)
int_plane = griddata((X, Y, Z), Amp, (Xq, Yq, Zq), method='linear')
int_plane = np.squeeze(int_plane)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(Zq, Yq, zs=int_plane)
ax.set_title('3D view');
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()

需要考虑的一个重要细节是,不能重复平面Y=0。

这里的目的是重建数据集的另一半(即整个其他三维半空间+相应的振幅)。对三维空间的正确反射将输出一个完整的三维高斯。如何有效地完成这一任务?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-21 10:35:48

沿y轴反射,省略最后一个元素,并将反射的数据附加到数据本身。

代码语言:javascript
复制
amp = np.vstack((amp, amp[-2::-1]))

示例:

代码语言:javascript
复制
In [37]: x, y, z = (-1, 0, 1), (-50, 0), (-5, 0, 5)
    ...: X, Y, X = np.meshgrid(x, y, z)
    ...: data = X+Y+Z
    ...: print("----------------", data, sep='\n')
    ...: data = np.vstack((data, data[-2::-1]))
    ...: print("----------------", data, sep='\n')
----------------
[[[-56 -50 -44]
  [-56 -50 -44]
  [-56 -50 -44]]

 [[ -6   0   6]
  [ -6   0   6]
  [ -6   0   6]]]
----------------
[[[-56 -50 -44]
  [-56 -50 -44]
  [-56 -50 -44]]

 [[ -6   0   6]
  [ -6   0   6]
  [ -6   0   6]]

 [[-56 -50 -44]
  [-56 -50 -44]
  [-56 -50 -44]]]

In [38]: 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68408063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档