QR-алгоритм возвращает неверные значения при попытке найти матрицу Q - PullRequest
0 голосов
/ 11 октября 2019

У меня есть система линейных уравнений Ax = b. Я пишу это как A = QR, и моя цель состоит в том, чтобы написать алгоритм, который бы нашел матрицу Q (пока, по крайней мере).

Это мой код в настоящее время:

double[,] A0 = { { 1, 2, 1, 1 }, { 2, -5, 1, 2 }, { 4, -1, 3, 4 }, { 3, -3, 2, 3 } };
double[] b0 = { -7, 3, 0, 2 };
private void QRskaidaButton_Click(object sender, EventArgs e)
        {
            ClearForm();
            Matrix<double> A = Matrix<double>.Build.DenseOfArray(A0);
            Matrix<double> B = A.QR().Q;
            richTextBox1.AppendText("Expected result: \n");
            richTextBox1.AppendText(B.ToString() + "\n");
            Vector<double> b = Vector<double>.Build.DenseOfArray(b0);
            int n = A.ColumnCount;
            Matrix<double> Q = Matrix<double>.Build.DenseIdentity(n);
            for (int i = 0; i < n - 1; i++)
            {
                Matrix<double> z = Matrix<double>.Build.Dense(n-i, 1, (j,g) => A[i+j, g+i]);
                Matrix<double> zp = Matrix<double>.Build.Dense(n-i, 1);
                zp[0, 0] = Math.Sign(z[0, 0]) * z.L2Norm();
                Matrix<double> omega = z - zp;
                omega = omega / omega.L2Norm();
                Matrix<double> Qi = Matrix<double>.Build.DenseIdentity(n - i);
                Qi = Qi - 2 * omega * omega.Transpose();
                Matrix<double> temp = Matrix<double>.Build.Dense(n - i, n - i, (j, g) => A[j+i, g+i]);
                temp = Qi * temp;
                for (int j = i; j < n; j++)
                {
                    for (int g = i; g < n; g++)
                    {
                        A[j, g] = temp[j - i, g - i];
                    }
                }
                Matrix<double> Qm = Matrix<double>.Build.DenseIdentity(n);
                for (int j = i; j < n; j++)
                    for (int g = i; g < n; g++)
                    {
                        Qm[j, g] = Qi[j - i, g - i];
                    }
                Q = Q * Qm;
            }
            richTextBox1.AppendText("Result: \n");
            richTextBox1.AppendText(Q.ToString() + "\n");
        }

Вот результат, который я получаю:

Expected result: 
DenseMatrix 4x4-Double
-0.182574   0.547723   0.743227   0.338055
-0.365148  -0.730297   0.202586   0.540641
-0.730297   0.365148  -0.540641   0.202586
-0.547723  -0.182574   0.338055  -0.743227

Result: 
DenseMatrix 4x4-Double
0.182574  -0.547723  -0.807504  -0.120845
0.365148   0.730297  -0.464175    0.34333
0.730297  -0.365148    0.34333   0.464175
0.547723   0.182574   0.120845  -0.807504

Первые два столбца имеют неправильный знак по какой-то причине, а два других - полностью неверны. Похоже, я близко, но я не могу понять, что здесь происходит. Любая помощь приветствуется.

...