Solución de sistema de ecuación lineal en MATLAB

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 que INV(A) * B. Si A es una array NXN y B es un vector columna con N componentes o una array con varias columnas, entonces X = A \ Bes la solución a la ecuación A * 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *