我试图在Python中重新映射某个字段,但不确定如何去做。主题是关于引力透镜。所以我现在所做的就是获得一个偏转场,它可以告诉你光是如何在质量周围弯曲的。Deflection Field Map
使用这个,我获得了一个称为放大图的东西,它可以显示产生最亮图像的区域。颜色越红,图像越亮。Magnification Map现在,我想从放大图中减去偏转场,以获得另一个平面中的另一个映射。
我不确定如何解决这个问题,因为我的偏转场是一个二维矢量,所以我将deflection_x和deflection_y设为2个阵列。同时我的放大率只是分配给2d X-Y网格中每个网格点的值。重新说明我尝试做的另一种方法如下。让放大倍数为I.
现在我有了我(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中的偏差轴。
从我尝试过的,只是做我 - alpha_x和我 - alpha_y并绘制这个没有帮助。它不是应该减去的放大倍数的值,而只是放大倍数的位置。
谢谢!我真的很感激任何建议。
答案 0 :(得分:1)
想出来,只需直接从np.meshgrid中减去,然后就新的坐标系重新绘制I。猜猜我因为所涉及的所有组件而感到困惑。谢谢你的帮助!