A continuación voy a explicar lo que he hecho en el fin de ilustrar mi confusión con cortes de ramas de una función típica. Si digo algo malo, en cualquier momento, por favor no dude en corregirme!
Con el fin de entender cortes de ramas y para ir sobre la implementación de las versiones adaptadas de varios valores de funciones complejas en python (o cualquier otro idioma), he experimentado con algunas implementaciones, y el escrito en este post puede ser pensado de mí "pensando en voz alta." Voy a explicar todo el código por lo que no será necesario saber python en concreto, a su básicamente, en seudo código, de todos modos. Así que vamos a empezar, tengo el complejo de la función:
\begin{align} w = \sqrt{z^2-1}. \end{align}
Con $z=x+iy$. Esta función será utilizado en un programa de ordenador, y quiero asegurarme de que para todos los valores de $z$ puede tomar a lo largo de una ruta de acceso especificada, $w$ seguirá siendo continua. Además digamos que para este problema en particular que quiero asegurarme de que mi rama cortes +1 a $+\infty$ y -1$-\infty$, $w$ es continua en la mitad superior del plano. No confío en la forma estándar de funciones en python manejar cortes de ramas, así que empezar por mirar real y lo imaginario $w$ sobre el argand'plano. Aquí está la versión de python:
def python_func(z):
return np.sqrt(z**2-1) #pretty self explanatory: returns sqrt(z^2-1) for a given z
Entonces me tome esta función y trama de las partes real e imaginaria sobre la argand'avión:
Así que parece python introduce una discontinuidad a lo largo del eje imaginario! Esto no es lo que quiero así que me decido a definir mi propia versión de la función anterior. El código se compone principalmente de dos funciones, una "myatan", que asigna manual de la inversa de la tangente en el rango de $(0,2\pi)$ como un punto se mueve a lo largo de los cuadrantes en sentido anti-horario, y "my_func" que implementa mi versión requerida de $w$. En la construcción de esta función de la razón de la siguiente manera: Para los cortes de ramas de arriba, si $|z|<1$, entonces arg$(w)$ debe ser continua alrededor del origen. Pero si $|z|>1$, entonces tenemos que factorizar $ \sqrt{z^2-1}=\sqrt{z-1}\sqrt{z+1}$ y tener en cuenta cada factor en turno:
- $\sqrt{z-1}$: hacer arg$(\sqrt{z-1})$ saltar a través de la línea de +1 a $+\infty$
- $\sqrt{z+1}$: hacer arg$(\sqrt{z+1})$ saltar a través de la línea de -1 a $-\infty$
El python definición de las funciones son:
import numpy as np #a module needed for some of the math functions used.
import math #a module needed for some of the math functions used.
#(x,y) are the coordinates of a point on a 2D plane
# the math.atan function does what you expects, it returns the inverse tangent as in a triangle
def myatan(y,x):
if y == 0:
if x > 0:
return 0
if x < 0:
return np.pi
if x == 0:
return 0
if y > 0:
if x > 0:
return math.atan(y/x)
if x < 0:
return np.pi + math.atan(y/x)
if x == 0:
return np.pi/2
if y < 0:
if x > 0:
return 2*np.pi + math.atan(y/x)
if x < 0:
return np.pi + math.atan(y/x)
if x == 0:
return 1.5*np.pi
def my_func(z):
"""Calculate sqrt(z^2-1) for a complex number z. Manually choose branch cuts.
"""
#For reference all functions return what their name suggests: abs() returns the magnitude of a complex number,
#np.imag() the imaginary part, np.real() the real part of a number etc.
temp = z**2-1
if abs(z) < 1: #if condition is true execute the next few lines indented
theta = myatan(np.imag(temp),np.real(temp))
return np.sqrt(abs(temp))*np.exp(1j*theta/2)
elif abs(z) > 1: #else if condition is true execute the next few lines indented
q1, q2 = z-1, z+1
r1, theta1 = abs(q1), myatan(np.imag(q1),np.real(q1)) #should be a jump on the positive real axis
r2, theta2 = abs(q2), math.atan2(np.imag(q2),np.real(q2)) #should jump on the negative real axis
return np.sqrt(r1*r2)*np.exp(1j/2*(theta1+theta2))
Con esta nueva definición de la función se obtiene el siguiente gráfico:
y ahora hay claras cortes de ramas como la queremos. Sin embargo, las parcelas de los dos métodos tienen un aspecto muy diferente y comencé a pensar, realmente estoy obteniendo el valor se supone que debo de mi personalizados función? Para ver los valores devueltos por la función que he decidido parcela de lo real y lo imaginario valores de $w$ como puedo caminar a lo largo de un círculo de diferentes radios:
Para el radio del círculo 0.9, vemos que my_func no tiene ningún tipo de saltos como queremos:
Para el radio del círculo 1.1, vemos que my_func ha saltos en $\theta = \pi$ $\theta = 2\pi$ como se esperaba:
El único problema que tengo es esto: yo soy feliz con los cortes de ramas de mi función: parece que he conseguido que parte a la derecha porque my_func es continua en el intervalo quiero que sea. Pero, ¿cómo sabe que se toma a la derecha el valor en ese intervalo? Yo estoy usando esta función en una física basado en la simulación, por lo que se debe claramente a la cuestión de si el real o la parte imaginaria de $w$ toma en el negativo o positivo posibilidad, como puede verse a partir de los últimos gráficos de arriba. ¿Cómo sé que estoy calcular el número correcto de "versión" de mi función dada en la rama de los cortes que he elegido?