python - 在笛卡尔网格上计算的函数的数值径向导数
问题描述
我有一个在 3D 笛卡尔网格上评估的径向对称函数。如何数值计算函数的径向导数?
对于一个简单的例子(球面高斯),计算导数 df/dx、df/dy 和 df/dz:
# Parameters
start = 0
end = 5
n = 20
# Variables
x = np.linspace(start, end, num=n)
y = np.linspace(start, end, num=n)
z = np.linspace(start, end, num=n)
dx = (end - start) / n
dy = (end - start) / n
dz = (end - start) / n
x_grid, y_grid, z_grid = np.meshgrid(x, y, z)
eval_xyz = np.exp(-(x_grid ** 2 + y_grid ** 2 + z_grid ** 2))
# Allocate
df_dx = np.zeros((n, n, n))
df_dy = np.zeros((n, n, n))
df_dz = np.zeros((n, n, n))
# Calculate Cartesian gradient numerically
for x in range(eval_xyz.shape[0] - 1):
for y in range(eval_xyz.shape[1] - 1):
for z in range(eval_xyz.shape[2] - 1):
df_dx[x, y, z] = (eval_xyz[x + 1, y, z] - eval_xyz[x, y, z]) / dx
df_dy[x, y, z] = (eval_xyz[x, y + 1, z] - eval_xyz[x, y, z]) / dy
df_dz[x, y, z] = (eval_xyz[x, y, z + 1] - eval_xyz[x, y, z]) / dz
那么是否可以从笛卡尔导数轻松计算径向导数 df/dr?
解决方案
诀窍是将径向导数表示为笛卡尔导数的总和,同时考虑每个点的 theta 和 phi,这可以用笛卡尔坐标表示为:
因此代码变为:
theta_val = theta(i * dx, j * dy, k * dz)
phi_val = phi(i * dx, j * dy)
df_dr[i, j, k] = df_dx[i, j, k] * np.sin(theta_val) * np.cos(phi_val) \
+ df_dy[i, j, k] * np.sin(theta_val) * np.sin(phi_val) \
+ df_dz[i, j, k] * np.cos(theta_val)
仔细计算 theta 和 phi 以处理除以零
def theta(x, y, z):
if x == 0 and y == 0 and z == 0:
return 0
elif z == 0:
return np.pi / 2
elif x == 0 and y == 0:
return 0
else:
return np.arctan(np.sqrt(x ** 2 + y ** 2) / z)
def phi(x, y):
if x == 0 and y == 0:
return 0
elif x == 0:
return np.pi / 2
elif y == 0:
return 0
else:
return math.atan2(y, x)
推荐阅读
- python - 无法从 CSV 文件中获取特定列
- electron - 如何将子电子 BrowserWindow 显示为单独的任务栏图标?
- python - 如何减少 C API 和 Python 可执行文件之间的执行时间差异?
- azure-devops - Azure DevOps dotnet ef 迁移脚本命令运行缓慢
- reactjs - IconButton 适用于第二次点击
- jquery - select2 在 data-toggle="table" 的表中不起作用
- vba - 通过 Outlook 向 Access 报告的特定页面发送电子邮件
- python-3.x - 如何使用 Sanic 提供上传的图片?
- javascript - 在 document_end 填写表单时,我的脚本会单击一个按钮,该按钮会重新加载页面,以便再次运行。如何停止它运行?
- javascript - 如何优化我的代码以尽量减少调用工作表的次数?