Estoy ejecutando un algoritmo de optimización que requiere el cálculo de la inversa de una matriz. El objetivo del algoritmo es eliminar los valores negativos de la matriz a y obtener la nueva matriz B. Básicamente, puedo empezar con la conocida plaza de las matrices B y C del mismo tamaño.

Empiezo por el cálculo de la matriz que es igual a:

A = B^-1 * C

O en Matlab:

A = B\C;

Yo uso este porque Matlab me dijo B\C es más preciso que inv(B)*C.

Los valores negativos en Una se divide por dos y luego se normalizan de modo que las filas de longitud de 1. El uso de este nuevo, tengo que calcular un nuevo B con:

(1/N) * A * C’ = B^-1

donde N es sólo un factor de escala (número de columnas). Este nuevo B podría entonces ser utilizado de nuevo en el primer paso y estas iteraciones continúan hasta que los negativos en Un son ido.

Mi problema es que tengo que calcular B de la segunda ecuación y, a continuación, la normalización de la misma.

invB = (1/N)*A*C';
B = inv(invB);

He sido el cálculo de B, utilizando inv(B^-1) pero después de un par de iteraciones que comience a recibir los mensajes que B^-1 es «cerca de singular o mal escala».

Este algoritmo funciona realmente para matrices más pequeñas (alrededor de 70×70) pero cuando se llega hasta alrededor de 500×500 que comience a recibir estos mensajes.

¿Hay alguna forma mejor para calcular inv(B^-1)?

  • Ayuda si usted calcular B como B = eye(N) \ invB?
  • Cuando yo uso B = eye(N) \ invB ya no tengo ese error de la ecuación, pero me da el error cada vez que el A = B\C se calcula…
InformationsquelleAutor user1259832 | 2012-03-09

2 Comentarios

  1. 3

    Definitivamente usted debería cabeza advertencias acerca de la singular matrices. Resultados en álgebra lineal numérica tienden a romperse como usted se mueve hacia matrices con alta condición números. La idea subyacente es que si

    A*b_1 = c

    y vamos a resolver el problema (ya que estamos usando números aproximados cuando hacemos uso de las computadoras)

    (A + matrix error)*b_2 = (c + vector error)

    cuán cerca están b_1 y b_2 como una función de la matriz y el vector de errores? Cuando Una tiene una pequeña condición de número b_1 y b_2 están cerca. Cuando Una tiene grandes condición de número b_1 y b_2 no están cerca.

    Hay una pieza informativa de análisis que usted podría hacer en su algoritmo. En cada iteración, después de que usted haya encontrado B, encontrar el uso de Matlab para encontrar la condición de número de la misma. Este es

    cond(B)

    Es probable que vea el número de subir rápidamente. Esto indica que cada vez que iterar el algoritmo, se debe confiar en sus resultados de B menos y menos.

    Problemas como este cultivo todo el tiempo numérica de las matemáticas. Si vas a trabajar con algoritmos numéricos frecuencia con la que usted debe tomar algún tiempo para familiarizarse con el papel de la condición de los números en el campo y técnicas de precondicionamiento como se mencionó anteriormente. Mi preferido de texto para este caso es «Álgebra Lineal Numérica» por Lloyd Trefethen, pero cualquier texto Numérico Álgebra debe abordar algunas de estas cuestiones.

    La mejor de las suertes,
    Andrew

  2. 1

    El principal problema es que la matriz tiene una alta condición de número (es decir, muy pequeño rcond(B) en su caso). Esto es debido a que el proceso iterativo de la estructura de su algoritmo, supongo. Como hacer cada iteración su singular pequeña valores se hacen más pequeños y más pequeños, por lo que su condición de número crece exponencialmente. Usted debe comprobar precondicionamiento para evitar este tipo de comportamiento.

Dejar respuesta

Please enter your comment!
Please enter your name here