GNU/Linux >> Tutoriales Linux >  >> Linux

Álgebra vectorial en Scientific Linux 7.1 con Python Script:Parte 1

En este tutorial, discutiremos el álgebra vectorial y los cálculos correspondientes en Scientific Linux. Para nuestro propósito, he elegido Python como lenguaje de programación por su simplicidad y poder de cálculo. Cualquier distribución de Linux tiene por defecto un editor/compilador de Python que se invoca a través de una ventana de terminal. Repasemos algunos conceptos de álgebra vectorial.

Nota:solo vamos a trabajar en el espacio real de dos o tres dimensiones.

Álgebra vectorial

El Elemento de un espacio vectorial, desde un punto de vista matemático, se puede representar como el arreglo de un número de elementos que pertenecen a ese espacio vectorial. Más específicamente, y en un enfoque de computación numérica, se puede representar como una lista de números reales, que tiene tres características básicas:

Magnitud

El tamaño del vector y se representa con  ;esta es la parte escalar de un vector. Para calcular la magnitud de un vector tenemos que realizar la siguiente fórmula:

X, Y y Z son las coordenadas vectoriales.

Dirección

La dirección de un vector está dada por una línea directriz que tiene un ángulo específico para cada eje del sistema de coordenadas llamado ángulo director.

Donde alfa, beta y gamma son los ángulos directores del vector y sus cosenos son los cosenos directores, también se pueden calcular dividiendo cada coordenada vectorial por su magnitud.

Orientación

Una de las dos orientaciones posibles entre la misma dirección.

Suma algebraica vectorial

Para realizar una suma algebraica de vectores, debemos sumar las coordenadas homólogas de dos vectores, atendiendo a las mismas propiedades de la suma algebraica de números reales. Solo como sigue:


Como podemos ver, el resultado es otro vector, perteneciente al mismo espacio vectorial.

Producto de un vector por un escalar

Dado un vector y un escalar, el producto vectorial por un escalar se define como el producto escalar de cada coordenada del vector:

Dónde

Vector Unidad

Una aplicación directa para el vector Producto por un escalar es el vector unitario, a vector unitario es un vector normado de longitud 1.

Combinación lineal

Cuando mezclamos las operaciones pasadas, suma algebraica y producto vector-escalar, obtenemos una combinación lineal, en la que el resultado es también un vector perteneciente al mismo espacio vectorial, como es:

Donde el vector A es una combinación lineal de los vectores B y C.

Python en Scientific Linux 7.1

Para implementar el álgebra vectorial elegimos Python como lenguaje de cálculo. El editor de texto que elegimos es gedit y viene por defecto con la distro Scientific Linux 7.1.

Magnitud de un vector

Llamemos a gedit usando una terminal o simplemente haga clic en el ícono en la pestaña de aplicaciones:



Primero debemos trabajar con listas, ya que representan vectores y deben declararse como es: 

V=[2, 2, 1]

Declaremos una variable para almacenar la magnitud y dar un valor, usamos 0.

modV=0

Ahora usamos la clase math para operar la raíz cuadrada:

import math

El cálculo de la magnitud:

modV=math.sqrt(V[0]**2+V[1]**2+V[2]**2)

Como podemos ver, tenemos que usar subíndice para indicar el elemento de la lista que vamos a operar, comenzando desde 0.

El script completo es el siguiente:

V=[2, 2, 1]
modV=0
import math
modV=math.sqrt(V[0]**2+V[1]**2+V[2]**2)
print (modV)

Una vez terminado, tenemos que guardar el archivo con la extensión .py y ubicar la ruta del archivo y abrir una ventana de terminal allí con el botón derecho y luego "abrir en ventana de terminal". Después tenemos que llamar al intérprete de python escribiendo:

$ python [path]/yourfilename.py

esto abrirá una ventana como esta y dará el resultado:



Otra forma de hacerlo es usando un bucle for como estos:

for x in range (0,3):
    modV+=V[x]**2
modV=math.sqrt(modV)

Aquí tenemos que usar técnicas de sangría ya que el intérprete de python funciona de esa manera.

Dirección de un vector

Usa las matemáticas de la clase

V=[2, 1, 2]
modV=0
import math
for x in range (0,3): #loop for calculating the magnitude
    modV+=V[x]**2
modV=math.sqrt(modV)
for y in range (0,3): #loop for calculating the director cosines
    V[y]=V[y]/modV
print (V)

El resultado es el siguiente:



Otra forma de hacerlo es usando las funciones trigonométricas de la clase de matemáticas, simplemente así:

Primero calculemos los ángulos directores:

V=[2, 1, 2]
angles=[0,0,0]
modV=0
import math
for y in range (0,3): #loop for calculating the director angles in degrees
    angles[y]=math.degrees(math.acos(V[y]/modV))

Y luego calculemos los cosenos directores y los imprimamos

for z in range(0,3):    #loop for calculating the director cosines
    V[z]=math.cos(math.radians(angles[z]))
print (angles)
print (V)


Y el resultado:



Podemos observar que los cosenos directores tienen el mismo valor

Orientación de un vector

Si cambiamos el signo de todas las coordenadas de un vector, inherentemente estamos cambiando la orientación del vector, como es:

V=[-2, -1, -2]
angles=[0,0,0]
modV=0
import math
for y in range (0,3): #loop for calculating the director angles in degrees
    angles[y]=math.degrees(math.acos(V[y]/modV))for z in range(0,3):    #loop for calculating the director cosines
    V[z]=math.cos(math.radians(angles[z]))
print (angles)
print (V)



En la siguiente imagen podemos ver que los ángulos del director son diferentes en 180 grados de los originales

Suma algebraica vectorial

Primero tenemos que declarar todos los vectores involucrados en la suma algebraica, como es:

A=[1,2,4]
B=[2,1,4]
S=[0,0,0]

donde vamos a sumar A más B y el resultado se almacenará en S

Agregar dos vectores (listas) en Python es equivalente a ejecutar un bucle 'for' para cada coordenada del vector resultante, por lo que tenemos que hacer lo siguiente:

for x in range(0,3):
    S[x]=A[x]+B[x]

Aquí tenemos el script completo para la suma vectorial algebraica:

A=[1,2,4]
B=[2,1,4]
S=[0,0,0]

for x in range(0,3): #For loop for adding the homologue coordinate of each vector
    S[x]=A[x]+B[x]
print 'S=',A, '+', B, '=', S

Y el resultado es:

Producto de un vector por un escalar

Dado un vector: 

A=[1,-2,3]

y un escalar:

scalar=-2

producto vectorial por un escalar se define como el producto escalar de cada una de las coordenadas del vector:

for x in range(0,3):
    R[x]=scalar*A[x]

y el resultado es:

Vector Unidad

Usando el script 'Magnitud de un vector' tenemos:

V=[2, 2, 1]
U=[0,0,0]
modV=0
invmodV=0
import math
modV=math.sqrt(V[0]**2+V[1]**2+V[2]**2)
invmodV=1/modV
for x in range(0,3):
    U[x]=invmodV*V[x]
print 'U=',V,'/',modV,'=',U 

y el resultado es:

Combinación lineal

Dados tres vectores, A, B y C, podemos calcular los valores escalares que, multiplicados por B y C, respectivamente, dan como resultado el vector A. En otras palabras, colocar el vector A como una combinación lineal de los vectores B y C :

A=[7, 9, -8]
B=[1, 3, -2]
C=[-2, 0, 1]

Una combinación lineal da como resultado un sistema de ecuaciones, 3 ecuaciones con 2 variables (escalares) si son tres vectores en r3, o 2 ecuaciones con 2 variables si son dos vectores en R3, que se pueden resolver aplicando un determinante de una matriz. Aquí debemos hacer un punto debido a los tipos de datos que maneja Python. En muchos casos, al calcular los escalares involucrados en una combinación lineal, el resultado tendrá lugares decimales, lo que da como resultado operaciones de punto flotante. Los tipos de datos numéricos, manejados por Python, son:Integer, Real, Long. Entonces, tenemos que insertar las coordenadas de los vectores como datos de tipo Real, para que estos representen números reales (coma flotante). Debemos conocer y comprender algunas características del tipo de datos en Python:

  • Entero ocupa menos espacio de memoria que el tipo Real.
  • Las operaciones con Real son más lentas que con Integer.

Aquí tenemos los mismos vectores, pero declarados como de tipo Real:

A=[7.0,9.0,-8.0]
B=[1.0,3.0,-2.0]
C=[-2.0,0.0,1.0]

Entonces, con esto podemos intercambiar los vectores y así tener siempre la solución del sistema.

La primera verificación que tenemos que hacer es si hay o no coplanaridad entre los vectores, para así saber si hay o no es una combinación lineal. Para eso, vamos a implementar una matriz determinante:




Código:
det0=A[0]*(B[1]*C[2]-B[2]*C[1])-A[1]*(B[0]*C[2]-B[2]*C[0])+A[2]*(B[0]*C[1]-B[1]*C[0]) #Main Determinant involving all vectors

Si este determinante es igual a cero (0) entonces hay una dependencia lineal entre los vectores y podemos seguir calculando los escalares. Como se mencionó anteriormente, el sistema de ecuaciones tiene tres ecuaciones con dos variables, dando un determinado sistema compatible, para lo cual debemos tomar dos de las tres ecuaciones y resolver valores escalares, luego verificar con la tercera ecuación, no tomada antes, si la anterior los valores escalares lo resuelven. Si no resuelven esto, entonces no hay Combinación Lineal.


Aquí tenemos el código completo:

A=[7.0,9.0,-8.0]
B=[1.0,3.0,-2.0]
C=[-2.0,0.0,1.0]
det0=A[0]*(B[1]*C[2]-B[2]*C[1])-A[1]*(B[0]*C[2]-B[2]*C[0])+A[2]*(B[0]*C[1]-B[1]*C[0]) #Main Determinant involving all vectors
if det0==0:
    det1=B[0]*C[1]-B[1]*C[0] #First Determinant involving the first and second lines of the equations system
    if det1==0:
        det2=B[1]*C[2]-B[2]*C[1] #Second Determinant involving the second and third lines of the equations system
        if det2==0:
            print 'Linear Combination Unexistent'
        else:
            det3=A[1]*C[2]-A[2]*C[1]
            det4=B[1]*A[2]-B[2]*A[1]
            sc1=det3/det2
            sc2=det4/det2
            if sc1*B[0]+sc2*C[0]==A[0]:
                print 'Scalar 1 =', sc1, 'Scalar 2 =', sc2
                print A,'=',sc1,'*',B,'+',sc2,'*',C
            else:
                print 'Linear Combination Unexistent'
    else:
        det3=A[0]*C[1]-A[1]*C[0]
        det4=B[0]*A[1]-B[1]*A[0]
        sc1=det3/det1
        sc2=det4/det1
       
        if sc1*B[2]+sc2*C[2]==A[2]:
            print 'Scalar 1 =', sc1, 'Scalar 2 =', sc2
            print A,'=',sc1,'*',B,'+',sc2,'*',C
        else:
            print 'Linear Combination Unexistent'
else:
    print 'Linear Combination Unexistent'


Y el resultado:

[[email protected] ejemplos python]# python lincomb.py
Scalar 1 = 3.0 Scalar 2 = -2.0
[7.0, 9.0, -8.0] = 3.0 * [1.0, 3.0, -2.0] + -2.0 * [-2.0, 0.0, 1.0]
[[email protected] ejemplos python]#


En conclusión, el álgebra vectorial básica da como resultado una serie de operaciones que involucran sistemas lineales de ecuaciones y/o aritmética simple con números reales. En otro tutorial veremos cómo podemos desarrollar productos con vectores, como producto punto, producto cruzado o producto mixto.


Linux
  1. Cómo administrar múltiples versiones de Python con Pyenv en Linux

  2. Cambie el directorio de trabajo en Shell con un script de python

  3. Simular pulsaciones de teclas en Linux con Python

  4. No se puede matar el script de Python con Ctrl-C

  5. Cómo agregar shebang #! con script php en linux?

Aprenda los comandos de Git con ejemplos prácticos en Linux - Parte 1

Shell Scripting Parte I:Primeros pasos con bash scripting

Aprenda a detectar equipos de red con Scientific Linux 7.1 y Python

Comenzando con VirtualBox en Linux – Parte 1

¿Depuración en pyCharm con privilegios de sudo?

Haga que el script de Python combinado con paquetes de Linux sea fácil de instalar para el usuario final