6 votos

Rama de conocimiento corta seleccionando manualmente que la rama corta de una función

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:

enter image description here

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:

enter image description here

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:

enter image description here

Para el radio del círculo 1.1, vemos que my_func ha saltos en $\theta = \pi$ $\theta = 2\pi$ como se esperaba:

enter image description here

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?

3voto

gabr Puntos 20458

Cortes de ramas puede ser un poco difícil con Python ya que una vez que usted escoge una rama, se olvida usted está trazando el camino.

En este tema se parece un poco en el borde de procesamiento numérico. Mira esta incompleta iPython notebook él básicamente se da por vencido.

Similar frustraciones fueron encontrados en el siglo 19 con funciones como $\sqrt{z^2-1}$, y ellos no tienen computadoras disponibles para ellos... sin embargo, ellos fueron capaces de visualizar y dejarlo profunda de las matemáticas en el tiempo.

Esta es la forma en que se condujo a la teoría de superficies de Riemann, cómo Poincaré descubrió homotopy de la teoría y de la teoría de la homología. Entonces era conocido como análisis situs que ver! Fue considerada una rama de análisis en el tiempo.

El problema es su "números" es necesario recordar la ruta de donde vinieron.


Yo propongo que en lugar de pensar en la función de $w = \sqrt{1-z^2}$ que considerar el conjunto de puntos de satisfacciones $\{(z,w): z^2 + w^2 = 1\}$. Aunque sabemos que es sólo una cuestión de un simple signo, $(z, \pm w)$, lo que ahorra el equipo se desordenó acerca de que su rama está trabajando.

Entonces usted tiene que modificar lo que sea algoritmo que se está trabajando con ser ella integración numérica o algún algoritmo de aproximación, para trabajar en su superficie de Riemann.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X