Veamos cómo resolver un sistema de ecuaciones lineales en MATLAB. Estos son los diversos operadores que implementaremos para ejecutar nuestra tarea:
- \ operator :
A \ B
es la división matricial de A en B, que es aproximadamente lo mismo queINV(A) * B
. Si A es una array NXN y B es un vector columna con N componentes o una array con varias columnas, entoncesX = A \ B
es la solución a la ecuaciónA * X = B
. Se imprime un mensaje de advertencia si A está mal escalado o es casi singular. produce la inversa de A.A\EYE(SIZE(A))
- Operador linsolve:
X = LINSOLVE(A, B)
resuelve el sistema lineal A * X = B usando factorización LU con pivote parcial cuando A es cuadrado, y factorización QR con pivote de columna. Se da una advertencia si A está mal condicionado para arrays cuadradas y tiene un rango deficiente para arrays rectangulares.
Ejemplo 1: Sistema no homogéneo Ax = b, donde A es un cuadrado y es invertible. En nuestro ejemplo consideraremos las siguientes ecuaciones:
2x + y - z = 7 x -2y + 5z = -13 3x + 5y - 4z = 18
Convertiremos estas ecuaciones en arrays A y b :
% declaring the matrices based on the equations A = [2 1 -1; 1 -2 5; 3 5 -4] b = [7; -13; 18]
Producción :
A = 2 1 -1 1 -2 5 3 5 -4 b = 7 -13 18
Ahora crearemos una array Ab aumentada. Compararemos los rangos de Ab y A, si los rangos son iguales entonces existe una solución única.
% creating augmented matrix Ab = [A b] % checking the ranks if rank(A) == rank(Ab) display("Unique solution exists") else display("Unique solution does not exist") end
Producción :
Ab = 2 1 -1 7 1 -2 5 -13 3 5 -4 18 Unique solution exists
Ahora podemos encontrar la solución a este sistema de ecuaciones usando 3 métodos:
- forma convencional:
inv(A) * b
- usando la rutina de división media:
A \ b
- usando la rutina linsolve:
linsolve(A, b)
% conventional way of finding solution x_inv = inv(A) * b % using mid-divide routine of MATLAB x_bslash = A \ b % using linsolve routine of MATLAB x_linsolve = linsolve(A, b)
Producción :
x_inv = 2.0000e+00 8.8818e-16 -3.0000e+00 x_bslash = 2.0000e+00 9.6892e-16 -3.0000e+00 x_linsolve = 2.0000e+00 9.6892e-16 -3.0000e+00
Podemos verificar la corrección de la solución encontrando el error usando A * x - b
. El error debe ser 0.
% check for errors Er1 = A * x_inv - b Er2 = A * x_bslash - b Er3 = A * x_linsolve - b
Producción :
Er1 = -8.8818e-16 -3.5527e-15 0.0000e+00 Er2 = -1.7764e-15 -1.7764e-15 0.0000e+00 Er3 = -1.7764e-15 -1.7764e-15 0.0000e+00
Como todos los errores son cercanos a 0, podemos decir que la solución es correcta.
Ejemplo 2: Sistema no homogéneo Ax = b, donde A es un cuadrado y no es invertible. En nuestro ejemplo consideraremos las siguientes ecuaciones:
2x + 4y + 6z = 7 3x -2y + 1z = 2 1x + 2y + 3z = 5
% declaring the matrices based on the equations A = [2 4 6; 3 -2 1; 1 2 3] b = [7; 2; 5] % creating augmented matrix Ab = [A b] % checking the ranks if rank(A) == rank(Ab) display("Unique solution exists") else display("Unique solution does not exist") end % conventional way of finding solution % gives warning and wrong answer. x_inv = inv(A) * b % using mid-divide routine of MATLAB % this too gives warning and wrong answer. x_bslash = A \ b % check for errors Er1 = A * x_inv - b Er2 = A * x_bslash - b
Producción :
A = 2 4 6 3 -2 1 1 2 3 b = 7 2 5 Ab = 2 4 6 7 3 -2 1 2 1 2 3 5 Unique solution does not exist warning: matrix singular to machine precision warning: called from testing at line 17 column 7 x_inv = Inf Inf Inf warning: matrix singular to machine precision warning: called from testing at line 21 column 10 x_bslash = -Inf -Inf Inf Er1 = Inf NaN Inf Er2 = NaN NaN NaN
Ejemplo 3: Sistema no homogéneo Ax = b donde A no es un cuadrado. En nuestro ejemplo consideraremos las siguientes ecuaciones:
2a + c - d + e = 2 a + c - d + e = 1 12a + 2b + 8c + 2e = 12
% declaring the matrices based on the equations A = [2 0 1 -1 1; 1 0 1 -1 1; 12 2 8 0 2] b = [2; 1; 12] % creating augmented matrix Ab = [A b] % checking the ranks if rank(A) == rank(Ab) display("Solution exists") else display("Solution does not exist") end % checking for unique solution if rank(A) == 5 display("Unique solution exists") else display("Unique solution does not exist") end
Producción :
A = 2 0 1 -1 1 1 0 1 -1 1 12 2 8 0 2 b = 2 1 12 Ab = 2 0 1 -1 1 2 1 0 1 -1 1 1 12 2 8 0 2 12 Solution exists Unique solution does not exist
Ejemplo 4: Sistema homogéneo Ax = 0 donde A es un cuadrado y es invertible. En nuestro ejemplo consideraremos las siguientes ecuaciones:
6x + 2y + 3z = 0 4x - y + 2z = 0 2x + y + 5z = 0
% declaring the matrices based on the equations A = [6 2 3; 4 -1 2; 2 1 5] b = [0; 0; 0] % checking for unique solution if rank(A) == 3 display("Unique solution exists") else display("Unique solution does not exist") endif % trivial solution x = A \ b % getting a null set. % this is obvious as A is invertible. % so its null space contains only zero vector x = null(A)
Producción :
A = 6 2 3 4 -1 2 2 1 5 b = 0 0 0 Unique solution exists x = 0 0 0 x = [](3x0)
Ejemplo 5: Sistema homogéneo Ax = 0 donde A es un cuadrado y no es invertible. En nuestro ejemplo consideraremos las siguientes ecuaciones:
1x + 2y + 3z = 0 4x + 5y + 6z = 0 7x + 8y + 9z = 0
% declaring the matrices based on the equations A = [1 2 3; 4 5 6; 7 8 9] b = [0; 0; 0] % checking for unique solution if rank(A) == 3 display("Unique solution exists") else display("Unique solution does not exist") endif % trivial solution with warning x = A \ b % this will return a set containing % only one basis vector of null space of A % the null space of A is spanned by this vector % hence this vector or its scalar multiple % is the solution of the given homogeneous system x = null(A) % finding the errors Err = A*x - b
Producción :
A = 1 2 3 4 5 6 7 8 9 b = 0 0 0 Unique solution does not exist warning: matrix singular to machine precision, rcond = 1.54198e-18 warning: called from testing at line 13 column 3 x = 0 0 0 x = 0.40825 -0.81650 0.40825 Err = -1.3323e-15 -4.4409e-16 4.4409e-16
Publicación traducida automáticamente
Artículo escrito por rutujakawade24 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA