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