2016-06-26 23 views
1

Ich versuche, ein bestimmtes Feld in Python neu zuordnen, aber nicht sicher, wie es geht. Das Thema bezieht sich auf Gravitationslinsen. Also, was ich bisher gemacht habe, ist ein Ablenkungsfeld zu bekommen, das dir sagt, wie das Licht um Massen herum gebogen wird. Deflection Field MapMapping Felder auf Python

Mit diesem erhielt ich etwas namens eine Vergrößerungskarte, die Ihnen die Regionen zeigt, die die hellsten Bilder erzeugen würde. Je röter die Farbe, desto heller das Bild. Magnification Map Nun möchte ich das Ablenkfeld von der Vergrößerungskarte subtrahieren, um eine andere Abbildung in einer anderen Ebene zu erhalten.

Ich bin nicht sicher, wie das geht, da mein Ablenkfeld ein 2d Vektor ist, also habe ich die Ablenkung_x und Ablenkung_y als 2 Arrays. Meine Vergrößerung ist nur die Werte, die jedem Gitterpunkt in einem 2-D-X-Gitter zugewiesen sind. Eine andere Möglichkeit, um zu formulieren, was ich versuche, ist wie folgt. Lassen Sie die Vergrößerung I. bin.

Also gerade jetzt habe ich ich (x, y). Ich möchte I (x - (Ablenkung_x), y - (Ablenkung_y)) erhalten. Im Grunde nimmt es die Kurve in Orange und macht es in den neuen X- und Y-Positionen in eine andere Kurve, aber mit der gleichen Größe. Ich habe meine aktuellen Code unten angegeben:

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.) 

Die Vergrößerung von I. gegeben wird nicht über die Berechnung Teil des Codes kümmern, was ich will nach diesem Schritt alpha_x und alpha_y von I. abzuziehen ist alpha_x und alpha_y sind die Ablenkungen in der x- und y-Achse.

Von dem, was ich versucht habe, einfach I - Alpha_x und I - Alpha_y tun und dies plotten hilft nicht. Es ist nicht der Wert der Vergrößerung, der abgezogen werden sollte, sondern einfach die Positionen der Vergrößerungen.

Danke! Ich würde wirklich jeden Ratschlag schätzen.

+0

Ein Punkt, den ich nicht verstanden habe, ist, wenn Sie die Übersetzung Ihres Bildes wollen (So Punkt I (x, y) wird jetzt in I sein (x-alpha_x, y-alpha_y)) oder eine neue Berechnung von I für den Punkt x-alpha_x, y-alpha_y. Wenn es die erste Option ist, ist dies ein Plotproblem und es kann leicht mit einer beliebigen Anzahl von Plot-Engines durchgeführt werden. Wenn es Letzteres ist, müssen Sie angeben, wie Ihre neuen I-Werte "geschätzt" werden sollen (da sie nicht existieren). – armatita

+0

@ armatita, die I-Werte bleiben gleich, es sind einfach die Positionen, die in die neuen Koordinaten übersetzt werden müssen. Jedes I (x, y) muss jetzt I (x-alpha_x, y-alpha_y) sein, aber das "I" wäre dasselbe. Ich vermute also, dass dies der ersten Option entspricht, aber wie sollte man das machen? @Benjamin, ich habe bereits Meshgrid verwendet, was meinst du? – ThunderFlash

Antwort

1

Ermittelt, einfach nur direkt von der np.meshgrid subtrahieren und dann I in Bezug auf das neue Koordinatensystem neu zu plotten. Ich vermute, dass ich wegen all der Komponenten verwirrt war. Danke für Ihre Hilfe!