Tutorial de Matlab (6) - solución de ecuaciones lineales

        Uno de los problemas más importantes de la computación científica es la solución de ecuaciones lineales simultáneas. En notación matricial, las preguntas comunes toman la forma: Dadas dos matrices A y b, ¿existe una única matriz x tal que Ax = b o xA = b?
        Es instructivo considerar un ejemplo unidimensional. Por ejemplo, la ecuación
        7x = 21
        ¿Tiene una solución única?
        La respuesta es, por supuesto, sí. La ecuación tiene una única solución x = 3. La solución se encuentra fácilmente por división:
        x = 21/7 = 3。
        La solución normalmente no se encuentra calculando el recíproco de 7, es decir, calculando 7 –1 = 0,142857... y luego multiplicando 7 –1 por 21. Esto requerirá más trabajo y será menos preciso si 7 –1 se representa en un número limitado de dígitos. Se aplican consideraciones similares a los sistemas de ecuaciones lineales con múltiples incógnitas; MATLAB no calcula matrices inversas al resolver dichas ecuaciones.
        Aunque esta no es una notación matemática estándar, MATLAB usa términos de división comunes en ejemplos escalares para describir soluciones a sistemas generales de ecuaciones simultáneas. Los dos signos de división, slash / y backslash \, corresponden a las funciones de MATLAB mrdivide y mldivide respectivamente . Se utilizan dos operadores cuando la matriz desconocida aparece a la izquierda o a la derecha de la matriz de coeficientes, respectivamente:
x = b/A
representa la solución de la ecuación matricial xA = b obtenida         usando mrdivide .
x = A\b
        representa la solución de la ecuación matricial Ax = b obtenida usando mldivide .
        Considere "dividir" ambos lados de la ecuación Ax = b o xA = b por A. La matriz de coeficientes A siempre está en el "denominador".
La condición de compatibilidad de dimensionalidad de         x = A\b requiere que las dos matrices A y b tengan el mismo número de filas. Por lo tanto, la solución x tiene el mismo número de columnas que b y su dimensión de fila es igual a la dimensión de columna de A. Para x = b/A , los roles de filas y columnas se invierten.
        De hecho, los sistemas de ecuaciones lineales de la forma Ax=b son más comunes que los sistemas de ecuaciones lineales de la forma xA=b. Por lo tanto, las barras diagonales inversas se usan con mucha más frecuencia que las barras diagonales. El resto de esta sección se centra en el operador de barra diagonal inversa; las propiedades correspondientes del operador de barra diagonal se pueden deducir de la siguiente identidad:
(b/A)' = (A'\b').
        La matriz de coeficientes A no necesita ser una matriz cuadrada. Si el tamaño de A es m × n, hay tres casos:
        metro = norte
        Ecuaciones de matriz cuadrada. Encuentre una solución exacta.
        metro > norte
        Un sistema de ecuaciones sobredeterminado significa que el número de ecuaciones es mayor que el número de incógnitas. Encuentre la solución de mínimos cuadrados.
        metro < norte
        Un sistema de ecuaciones subdeterminado, es decir, el número de ecuaciones es menor que el número de incógnitas. Encuentre la solución fundamental utilizando como máximo m componentes distintos de cero.

Algoritmo de división de 1ml

        El operador mldivide utiliza diferentes solucionadores para diferentes tipos de matrices de coeficientes. Varias condiciones se diagnostican automáticamente al examinar la matriz de coeficientes.
        La solución general del sistema de ecuaciones lineales Ax = b describe todas las soluciones posibles. La solución general se puede encontrar por:
        1 Encuentra la solución del sistema de ecuaciones homogéneo correspondiente Ax = 0. Use el comando null para hacer esto escribiendo null (A) . Esto restaura los vectores base del espacio de soluciones a Ax=0. Cualquier solución es una combinación lineal de vectores base.
        2 Encuentra una solución específica al sistema no homogéneo de ecuaciones Ax = b. Cualquier solución para Ax = b se puede escribir como la suma de la solución particular para Ax = b del paso 2 más la combinación lineal de los vectores base del paso 1. El resto de esta sección describe cómo usar MATLAB para encontrar la solución específica para Ax = b, como se describe en el Paso 2.

2 ecuaciones de matriz cuadrada

        El caso más común implica una matriz de coeficientes cuadrados A y un vector b de una sola columna de la derecha .

2.1 Matriz de coeficientes no singulares

        Si la matriz A no es singular, entonces la solución x = A\b tiene el mismo tamaño que b . Por ejemplo:
A = pascal(3);
u = [3; 1; 4];
x = A\u
x =
10
-12
5
        Se puede confirmar que A*x es exactamente igual a u . Si A y b son matrices cuadradas y tienen el mismo tamaño, entonces x = A\b también tiene el mismo tamaño:
b = magic(3);
X = A\b
X =
19 -3 -1
-17 4 13
6 0 -6
        Se puede confirmar que A*x es exactamente igual a b . Los dos ejemplos anteriores tienen soluciones enteras exactas. Esto se debe a que la matriz de coeficientes se elige pascal(3) , que es de rango completo (no singular).

2.2 Matriz de coeficientes singulares

        Una matriz cuadrada A es singular si no contiene columnas linealmente independientes. Si A es singular, entonces la solución Ax = b no existirá o será única. El operador de barra invertida A\b advierte si A está cerca de la singularidad o si se detecta una singularidad completa . Si A es singular y Ax = b tiene una solución, se puede encontrar una solución específica que no sea única escribiendo
P = pinv(A)*b
        pinv(A) es la pseudo-inversa de A. Si no hay una solución exacta para Ax = b, pinv(A) devolverá la solución de mínimos cuadrados. Por ejemplo:
A = [ 1 3 7 ; -1 4 4 ; 1 10 18 ] es una matriz singular, que se puede verificar escribiendo:
rank(A)
respuesta =
2
        Como A no es de rango completo, tiene algunos valores singulares iguales a cero. Para b =[5;2;12] , la ecuación Ax = b tiene una solución exacta:
pinv(A)*b
respuesta =
0.3850
-0.1103
0.7066
Verifique que pinv(A)*b sea una solución exacta         escribiendo
A*pinv(A)*b
respuesta =
5.0000
2.0000
12.0000
        Sin embargo, si b = [3;6;0] , entonces Ax = b no tiene solución exacta. En este caso, pinv(A)*b devuelve el mínimo cuadrado
solución de multiplicación. tipo
A*pinv(A)*b
respuesta =
-1.0000
4.0000
2.0000
        entonces no se devuelve el vector b original . Al obtener la forma escalonada por filas reducida de la matriz aumentada [A b] , se puede determinar si Ax = b tiene una solución exacta. Para hacer esto, para este ejemplo ingrese
rref([A b])
respuesta =
1.0000 0 2.2857 0
0 1.0000 1.5714 0
0 0 0 1.0000
        Dado que la fila inferior es todo ceros (excepto el último término), la ecuación no tiene solución. En este caso, pinv(A) devuelve la solución de mínimos cuadrados.

3 ecuaciones sobredeterminadas

        Este ejemplo muestra cómo los sistemas de ecuaciones sobredeterminados se encuentran comúnmente en varios ajustes de curvas a datos experimentales. La cantidad y se mide en varios valores diferentes de tiempo t para generar las siguientes observaciones. Los datos se pueden ingresar y ver en una tabla usando las siguientes declaraciones.
t = [0 .3 .8 1.1 1.6 2.3]';
y = [.82 .72 .63 .60 .55 .50]';
B = table(t,y)
B=mesa 6×2
ty
___ ____
0 0.82
0,3 0,72
0,8 0,63
1.1 0.6
1,6 0,55
2,3 0,5
        Trate de modelar sus datos con una función de decaimiento exponencial
 
        La ecuación anterior establece que el vector y debe aproximarse mediante una combinación lineal de otros dos vectores. Uno es un vector constante con todos unos, y el otro es un vector con un componente exp(-t) . Los coeficientes desconocidos c 1 yc 2 se pueden calcular realizando un ajuste de mínimos cuadrados, que minimiza la suma de los cuadrados de la desviación de los datos del modelo. En el caso de dos coeficientes desconocidos, hay seis ecuaciones, representadas por una matriz de 6×2.
E = [ones(size(t)) exp(-t)]
mi = 6 × 2
1.0000 1.0000
1.0000 0.7408
1.0000 0.4493
1,0000 0,3329
1.0000 0.2019
1,0000 0,1003
        Utilice el operador de barra invertida para obtener la solución de mínimos cuadrados.
c = E\y
do = 2 × 1
0.4760
0.3413
        Es decir, el ajuste de mínimos cuadrados a los datos es
 
La siguiente declaración evalúa el modelo         a intervalos regulares de incrementos de t y luego traza los resultados junto con los datos originales:
T = (0:0.1:2.5)';
Y = [ones(size(T)) exp(-T)]*c;
plot(T,Y,'-',t,y,'o')

        E*c no es exactamente igual a y , pero la diferencia puede ser mucho menor que el error de medición en los datos sin procesar. Una matriz rectangular A es de rango deficiente si no tiene columnas linealmente independientes. Si A tiene un rango deficiente, entonces la solución de mínimos cuadrados de AX = B no es única. Si A tiene un rango deficiente, A\B emite una advertencia y produce una solución de mínimos cuadrados. Puede usar lsqminnorm para encontrar la solución X que tiene la norma más pequeña entre todas las soluciones .

4 Ecuaciones indeterminadas

        Este ejemplo demuestra que la solución de un sistema de ecuaciones indeterminado no es única. Un sistema subdeterminado de ecuaciones lineales contiene más incógnitas que ecuaciones. La operación de división izquierda de la matriz MATLAB encuentra la solución básica de mínimos cuadrados.Para una matriz de coeficientes m × n , tiene como máximo m componentes distintos de cero.
Aquí hay un ejemplo aleatorio simple:
R = [6 8 7 3; 3 5 4 1]
rng(0);
b = randi(8,2,1)
R =
6 8 7 3
3 5 4 1
segundo =
7
8
El sistema de ecuaciones lineales Rp = b tiene dos ecuaciones y cuatro incógnitas. Dado que la matriz de coeficientes contiene números enteros pequeños, es apropiado usar el comando de formato para mostrar la solución en formato racional. Se puede obtener una solución específica con el siguiente comando
format rat
p = R\b
p =
0
17/7
0
-29/7
        Uno de los componentes distintos de cero es p(2) porque R(:,2) es la columna de R con la norma más grande . El otro componente distinto de cero es p(4) porque R(:,4) controla después de eliminar R(:,2) . La solución general completa de un sistema de ecuaciones indeterminado se puede representar mediante p más una combinación lineal de cualquier vector espacial nulo, que se puede calcular mediante la función nula (con la opción de solicitar una base racional).
Z = null(R,'r')
Z =
-1/2 -7/6
-1/2 1/2
1 0
0 1
        Se puede confirmar que R*Z es cero, y el residuo R*x - b es mucho más pequeño que cualquier vector x (donde x = p + Z*q)  Dado que la columna de Z es un vector espacial cero, Z*q es la siguiente combinación lineal vectorial:
        Para ilustrar esto, elija cualquier q y construya x, y calcule la norma del residual.
q = [-2; 1];
x = p + Z*q;
format short
norm(R*x - b)
respuesta =
2.6645e-15
        La solución de norma mínima tiene un significado especial si hay infinitas soluciones. Puede usar lsqminnorm para calcular la solución de mínimos cuadrados de norma mínima. Esta solución tiene el menor valor posible de norm(p) .
p = lsqminnorm(R,b)
p =
-207/137
365/137
79/137
-424/137

5 Soluciones de ecuaciones lineales con múltiples lados derechos

Ciertos problemas implican resolver sistemas de ecuaciones lineales         con la misma matriz de coeficientes A pero diferentes lados derechos b . Si puede usar diferentes valores de b al mismo tiempo , puede construir b como una matriz de varias columnas y resolver todos los sistemas de ecuaciones con un solo comando de barra invertida: X = A\[b1 b2 b3 …] . Sin embargo, a veces los diferentes valores de b no están todos disponibles al mismo tiempo, es decir, necesitas resolver varios sistemas de ecuaciones en sucesión. Si uno de los sistemas de ecuaciones se resuelve usando una barra oblicua (/) o una barra invertida (\), el operador descompone la matriz de coeficientes A y usa esta descomposición matricial para resolver. Sin embargo, cada vez que se resuelve un sistema similar de ecuaciones con una b diferente , el operador realiza la misma factorización de A , que es un cálculo redundante. La solución a este problema es calcular previamente la descomposición de A y luego reutilizar los factores para resolver los diferentes valores de b . En la práctica, sin embargo, puede ser difícil calcular previamente las descomposiciones de esta manera, ya que se necesita saber qué descomposiciones calcular (LU, LDL, Cholesky, etc.) y cómo factorizarlas para resolver el problema. Por ejemplo, usando la descomposición LU, necesita resolver dos sistemas de ecuaciones lineales para resolver el sistema original de ecuaciones Ax = b:
[L,U] = lu(A);
x = U \ (L \ b);
        Para sistemas de ecuaciones lineales con varios lados derechos consecutivos, se recomienda resolverlos usando un objeto de descomposición . Estos objetos le permiten aprovechar los beneficios de rendimiento de la factorización de matriz precalculada sin tener que comprender cómo usar los factores de matriz. Puede reemplazar la descomposición LU anterior con:
dA = decomposition(A,'lu');
x = dA\b;
        Si no está seguro de qué descomposición usar, decomposition(A) elige el tipo correcto en función de las propiedades de A , similar a lo que hace la barra invertida.
        La siguiente prueba simple demuestra los posibles beneficios de rendimiento de este enfoque. Esta prueba resuelve el mismo sistema disperso de ecuaciones lineales 100 veces usando barras invertidas (\) y descomposición respectivamente.
n = 1e3;
A = sprand(n,n,0.2) + speye(n);
b = ones(n,1);
% Backslash solution
tic
for k = 1:100
x = A\b;
end
toc
El tiempo transcurrido es de 9,006156 segundos.
% decomposition solution
tic
dA = decomposition(A);
for k = 1:100
x = dA\b;
end
toc
El tiempo transcurrido es 0,374347 segundos.
        Para este problema, la descomposición resuelve mucho más rápido que usar solo barras invertidas, mientras que la sintaxis sigue siendo simple.

método de 6 iteraciones

        Si la matriz de coeficientes A es grande y escasa, el método de descomposición generalmente no será efectivo. Un enfoque iterativo produce una serie de soluciones aproximadas. MATLAB proporciona varios métodos iterativos para manejar matrices de entrada grandes y dispersas.

7 Informática de subprocesos múltiples

        El software MATLAB es compatible con el cálculo multiproceso para muchas funciones de álgebra lineal y funciones numéricas por elementos. Estas funciones se ejecutarán automáticamente en varios subprocesos. Para que una función o expresión se ejecute más rápido en múltiples CPU, se deben cumplir una serie de condiciones:
1 Las operaciones realizadas por una función se pueden dividir fácilmente en múltiples partes que se ejecutan simultáneamente. Estas partes deben poder ejecutarse con poca o ninguna comunicación entre procesos. Deberían requerir pocas operaciones de secuencia.
2 El tamaño de los datos es suficiente para que cualquier ventaja de la ejecución concurrente compense el tiempo requerido para particionar los datos y administrar subprocesos de ejecución individuales. Por ejemplo, la mayoría de las funciones se aceleran solo cuando la matriz contiene miles o más elementos.
3 Las operaciones no están vinculadas a la memoria; el tiempo de procesamiento no está controlado por el tiempo de acceso a la memoria. En general, las funciones complejas son más rápidas que las funciones simples. inv , lscov , linsolve y mldivide experimentarán aceleraciones sustanciales para arreglos grandes de doble precisión (alrededor de 10 000 elementos o más) si se habilitan subprocesos múltiples .

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44209907/article/details/132023229
Recomendado
Clasificación