我试图重新映射Python中的某个字段,但不确定如何实现。这个话题是关于引力透镜。所以我现在做的是获得一个偏转场,它告诉你光是如何围绕质量弯曲的。偏转场图。
用这个,我得到了一个叫做放大图的东西,它显示了能产生最亮图像的区域。颜色越红,图像越亮。放大图现在,我想从放大图中减去偏转场,以获得另一个平面上的映射。
我不知道该怎么做,因为我的偏转场是一个2d矢量,所以我把deflection_x和deflection_y作为两个数组。同时,我的放大率只是分配给2d X-Y网格中每个网格点的值。另一种重新表述我想做的事情的方法是如下所示。让放大倍数是我。
所以现在我有我(x,y)。我想得到I(x - (deflection_x),y -(deflection_y))。基本上,它取橙色的曲线,使它在新的x和y位置上变成另一条曲线,但大小相同。我给出了下面的代码:
x = np.linspace(-50,50,100)
y = np.linspace(-50,50,100)
X, Y = np.meshgrid(x,y)
zeta_a = (-3,0)
zeta_b = (3,0)
def get_dist_squared(x_array, y_array):
return x_array**2 + y_array**2
M_a= 150
M_b= 150
G = 1
c = 1
zeta_min_zeta_a_x = X - zeta_a[0]
zeta_min_zeta_a_y = Y - zeta_a[1]
zeta_min_zeta_b_x = X - zeta_b[0]
zeta_min_zeta_b_y = Y - zeta_b[1]
dist_zeta_min_zeta_a = get_dist_squared(zeta_min_zeta_a_x,zeta_min_zeta_a_y)
dist_zeta_min_zeta_b = get_dist_squared(zeta_min_zeta_b_x,zeta_min_zeta_b_y)
alpha_x = M_a * zeta_min_zeta_a_x / dist_zeta_min_zeta_a
alpha_x += M_b * zeta_min_zeta_b_x / dist_zeta_min_zeta_b
alpha_x *= 4 * G / (c**2)
alpha_y = M_a * zeta_min_zeta_a_y / dist_zeta_min_zeta_a
alpha_y += M_b * zeta_min_zeta_b_y / dist_zeta_min_zeta_b
alpha_y *= 4 * G / (c**2)
alpha_x_y, alpha_x_x = np.gradient(alpha_x,edge_order=1)
alpha_y_y, alpha_y_x = np.gradient(alpha_y,edge_order=1)
det_A = 1 - alpha_y_y - alpha_x_x + (alpha_x_x)*(alpha_y_y) - (alpha_x_y)*(alpha_y_x)
abs = np.absolute(det_A)
I = abs**(-1.)放大是由I给出的。不要担心代码的计算部分,在这一步之后,我想要的是从I中减去alpha_x和alpha_y。alpha_x和alpha_y是x和y轴上的偏差。
从我已经尝试过的情况来看,简单地做I- alpha_x和I- alpha_y并绘制出来没有什么帮助。不应该减去放大率的值,而仅仅是放大的位置。
谢谢!我真的很感激你的任何建议。
发布于 2016-06-26 14:40:00
算出来了,只需直接从np.meshgrid中减去,然后重新绘制新的坐标系。我想我只是被所有的组件搞糊涂了。谢谢你的帮忙!
https://stackoverflow.com/questions/38037881
复制相似问题