我正在尝试计算一个向量场的散度:
Fx = np.cos(xx + 2*yy)
Fy = np.sin(xx - 2*yy)
F = np.array([Fx, Fy])
分析解
这是通过分析计算得出的散度(div(F) = dF/dx + dF/dy)应该是什么样子的(请参见Wolfram Alpha here):
- dFx/dx = d/dx cos(x+2y) = -sin(x+2y)
- dFy/dy = d/dy sin(x-2y) = -2*cos(x-2y)
散度:
div_analy = -np.sin(xx + 2*yy) - 2*np.cos(xx - 2*yy)
代码如下:import numpy as np
import matplotlib.pyplot as plt
# Number of points (NxN)
N = 50
# Boundaries
ymin = -2.; ymax = 2.
xmin = -2.; xmax = 2.
# Create Meshgrid
x = np.linspace(xmin,xmax, N)
y = np.linspace(ymin,ymax, N)
xx, yy = np.meshgrid(x, y)
# Analytic computation of the divergence (EXACT)
div_analy = -np.sin(xx + 2*yy) - 2*np.cos(xx - 2*yy)
# PLOT
plt.imshow(div_analy , extent=[xmin,xmax,ymin,ymax], origin="lower", cmap="jet")
数值解
现在,我正在尝试通过数值计算来得到相同的结果,因此我使用这个函数来计算散度。
def divergence(f,sp):
""" Computes divergence of vector field
f: array -> vector field components [Fx,Fy,Fz,...]
sp: array -> spacing between points in respecitve directions [spx, spy,spz,...]
"""
num_dims = len(f)
return np.ufunc.reduce(np.add, [np.gradient(f[i], sp[i], axis=i) for i in range(num_dims)])
当我使用这个函数绘制发散图时:
# Compute Divergence
points = [x,y]
sp = [np.diff(p)[0] for p in points]
div_num = divergence(F, sp)
# PLOT
plt.imshow(div_num, extent=[xmin,xmax,ymin,ymax], origin="lower", cmap="jet")
我得到:
问题
数值解与解析解不同!我做错了什么?