[Archivo] Matemáticas puras, física, química, etc.: problemas de entrenamiento cerebral no relacionados con el comercio de ninguna manera - página 557

 

Parece que funciona para la imagen plana. Me parece que también funcionará para el caso de N dimensiones. ¿Alguna objeción?

Me parece que es hora de escribir un guión y comprobarlo... :)

 

Pues bien, el vector normal a la unidad dada puede construirse más fácilmente: basta con sustituir cualquiera de sus coordenadas xi por -sqrt(1-xi^2). En realidad, esto equivale a una rotación de 90 grados en el plano del vector alejándose del eje i-ésimo (es decir, sustituimos el coseno por el -seno, obtenemos el coseno del ángulo+pi/2). Después sólo queda normalizar el resultado.

Pero no es un hecho que se pueda obtener un vector normal a todos los demás del conjunto de esta manera en absoluto. Así como cualquier otra forma que seleccione un vector normal de todas las variantes...

 
alsu:

Pues bien, el vector normal a la unidad dada puede construirse más fácilmente: basta con sustituir cualquiera de sus coordenadas xi por -sqrt(1-xi^2). En realidad, esto equivale a girar 90 grados en los polos del vector alejándose del eje i-ésimo (es decir, sustituimos el coseno por el -seno, obtenemos el coseno del ángulo+pi/2). Después sólo queda normalizar el resultado.

Pero no es un hecho que se pueda obtener un vector normal a todos los demás del conjunto de esta manera en absoluto. Así como cualquier otra forma que seleccione un vector normal de todas las variantes...

Exactamente. No en el caso general.

--

Parece que he encontrado una solución rápida. Cuando me senté a escribir y me relajé sobre el algoritmo, simplemente apareció.

Así, del vector generado x1r, sólo hay que restar su proyección sobre x0 (es decir, x0*sp(x0,x1r), donde sp() es producto escalar).

En resumen la fórmula está en una línea: x1 = x1r - x0*sp(x0,x1r);

:))

 
En resumen la fórmula en una línea: x1 = x1r - x0*sp(x0,x1r);

:))

Sí, pero hay que aproximarse después.

Bueno, de todos modos en una línea: x1 = norm(x1r - x0*sp(x0,x1r))

 
MetaDriver:

Parece que funciona para la imagen plana. Me parece que también funcionará para el caso de N dimensiones. ¿Alguna objeción?

Parece que es hora de escribir un guión y comprobarlo... :)

No tienes que escribirlo. Prueba:

sX = (a1+b1,a2+b2); dX = (a1-b1,a2-b2);

Como los vectores a y b eran vectores unitarios, el paralelogramo correspondiente es un rombo y sus diagonales son perpendiculares, por lo que la suma y la diferencia son ortogonales entre sí. Por tanto, el intercambio de módulos equivale a girar uno de ellos 90 grados a la derecha y el otro a la izquierda. En coordenadas cartesianas podemos expresarlo simplemente reordenando las coordenadas primera y segunda:

sXtr = (a2-b2,a1-b1); dXtr = (a2+b2,a1+b1)

=>

sXtr+dXtr = (2*a2,2*a1) es un vector con módulo 2 y obviamente ortogonal al vector (a1,a2), es decir al vector a. H.t.c.

 
Sólo queda correr en un bucle. for(i=0; i<InpVectorCount; i++) {....}
 
MetaDriver:
Sólo queda correr en un bucle. for(i=0; i<InpVectorCount; i++) {....}
No, todavía se trata de seleccionar inicialmente el vector "arbitrario" correcto, que finalmente dará ortogonalidad a todo el conjunto. Es decir, lo arbitrario resulta no serlo en absoluto. De nuevo volvemos a la forma de calcular el vector inicial necesario.
 
alsu:
No, sigue siendo necesario elegir inicialmente el vector "arbitrario" correcto, que dará ortogonalidad a todo el conjunto. Es decir, lo arbitrario ni siquiera es arbitrario. De nuevo volvemos a la forma de calcular el vector inicial necesario.
Mentira. Sólo se comprueba a cada paso. Si en cualquier paso de la transformación un vector es contiguo al siguiente del conjunto, volvemos a generar un vector aleatorio inicial y repetimos el procedimiento. Como este caso es poco probable (con dimensión finita), es más fácil (más barato) que sospechar inmediatamente que es linealmente dependiente (buscando el rango de la matriz).
 
MetaDriver:
Mentira. Sólo se comprueba en cada paso. Si en cualquier paso de la transformación un vector resulta contradictorio con el siguiente vector del conjunto, volvemos a generar el vector aleatorio inicial y repetimos el procedimiento. Como este caso es poco probable (con dimensión finita), es más fácil (más barato) que sospechar inmediatamente que es linealmente dependiente (buscando el rango de la matriz).
Puede llegar a ser no codirigido, sino simplemente en un ángulo indirecto a todos o algunos vectores
 
MetaDriver:
Mentira. Sólo se comprueba en cada paso. Si en cualquier paso de la transformación un vector resulta contradictorio con el siguiente vector del conjunto, volvemos a generar el vector aleatorio inicial y repetimos el procedimiento. Como este caso es poco probable (con dimensión finita), es más fácil (más barato) que sospechar inmediatamente que es linealmente dependiente (buscando el rango de la matriz).
Y es más barato porque el producto escalar todavía tiene que ser calculado (por el algoritmo). Si resulta ser igual a uno, volvemos al principio y repetimos el proceso. Es decir, en cada paso, sólo hay que comprobar si (¡cp(a,b)! = 1.0) {}