Решение системы уравнений методом Гаусса, исправить код - C#
Формулировка задачи:
Здравсвуйте! Пишу код, который решает системы уравнений методом Гаусса, но на последнем этапе произошла загвостка.
В последнем кусочке кода долно происходить следующее (цифры взяты другие):
x3 =5/8
x2 = -6 + 10 * 5/ 8 = 1/4
x1 = -1 + 2*1/4 + 2*5/ 8 = 3/4
Но в массиве, куда записываются конечные результаты, выводятся нули. Помогите пожалуйста найти ошибку и исправить код.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
int stolb = 4;
int stroka = 3;
double[,] matrix = new double[stroka, stolb]; // заданная матрица
double[,] matrix2 = new double[stroka, stolb]; // промежуточная
double[,] matrixBuf = new double[stroka, stolb]; // конечная матрица
matrix[0, 0] = 2;
matrix[0, 1] = 1;
matrix[0, 2] = 4;
matrix[0, 3] = 16;
matrix[1, 0] = 3;
matrix[1, 1] = 2;
matrix[1, 2] = 1;
matrix[1, 3] = 10;
matrix[2, 0] = 1;
matrix[2, 1] = 3;
matrix[2, 2] = 3;
matrix[2, 3] = 16;
for (int i = 0; i < stroka; i++)
{
for (int q = 0; q < stolb; q++)
{
matrix2[i,q] = matrix[i, q];
}
}
for (int i = 0; i < stroka; i++)
{
for (int q = 0; q < stolb; q++)
{
Console.Write(matrix[i, q] + "\t");
}
Console.WriteLine();
}
Console.WriteLine(" ");
Console.ReadLine();
int count = 0;
int countElem = 0;
int countElem2 = 0;
for (int i = 0; i < stroka; i++)
{
count++;
double[] matrixStroka = new double[stolb - count];
for (int q = 0; q < stolb - count; q++)
{
if (count == 1)
{
countElem++;
matrixStroka[q] = -(matrix2[i, q + count] / matrix2[i, i]);
if (countElem == stolb - count)
{
matrixStroka[q] = -(matrixStroka[q]);
}
}
else
{
countElem2++;
if (countElem2 != stolb - count)
matrixStroka[q] = -(matrix2[i, q + count] / matrix2[i, i]);
else
matrixStroka[q] = (matrix2[i, q + count] / matrix2[i, i]);
}
}
for (int q = 0; q < stolb - count; q++)
{
matrixBuf[count - 1, q] = matrixStroka[q];
}
if (count == stroka)
{
matrixBuf[count - 1, 0] = -(matrixBuf[count - 1, 0]);
break;
}
for (int q = 0; q < stolb - count; q++)
{
Console.WriteLine("dfd[{0}] = {1}", q, matrixStroka[q]);
}
Console.ReadLine();
double[,] matrixProiz = new double[stroka - count, stolb - count];
for (int t = 0; t < stroka-count; t++)
{
for (int q = 0; q < stolb - count; q++)
{
matrixProiz[t, q] = matrixStroka[q] * matrix2[t+count, count-1];
Console.Write(matrixProiz[t, q] + "\t");
}
Console.WriteLine();
}
Console.ReadLine();
int countSt = 0;
for (int t = 0; t < stroka - count; t++)
{
for (int q = 0; q < stolb - count; q++)
{
countSt++;
if (countSt != stolb - count)
matrix2[t + count, q + count] = matrixProiz[t, q] + matrix2[t + count, q + count];
else
{
matrix2[t + count, q + count] = -(matrixProiz[t, q]) + matrix2[t + count, q + count];
countSt = 0;
}
}
}
for (int u = 0; u < stroka; u++)
{
for (int q = 0; q < stolb; q++)
{
Console.Write(matrix2[u, q] + "\t");
}
Console.WriteLine();
}
Console.WriteLine(" ");
Console.ReadLine();
}
//Console.ReadLine();
for (int u = 0; u < stroka; u++)
{
for (int q = 0; q < stolb; q++)
{
Console.Write(matrixBuf[u, q] + "\t");
}
Console.WriteLine();
}
Console.WriteLine(" ");
Console.ReadLine();
double[] result = new double[stroka];
double resultat = matrixBuf[stroka - 1, 0];
result[stroka-1] = matrixBuf[stroka - 1, 0];
int a = stroka - 2;
int countRez = 0;
int countEl = 0;
for (int u = a; u < a; --u) // перемножение и сложение элементов
{
for (int q = 0; q < stolb; q++)
{
countEl++;
if (countEl == 1)
resultat = resultat * matrixBuf[u, 0]; //перемножение эл-ов
else
{
resultat = resultat + matrixBuf[u, q]; // сложение эл-ов
}
}
}
for (int r = 0; r < result.Length; r++)
{
Console.WriteLine("Result[{0}] = {1}", r, result[r]);
}
Console.ReadLine();
}
}
}Решение задачи: «Решение системы уравнений методом Гаусса, исправить код»
textual
Листинг программы
int countEl = 0;
int countStr = 0;
int countS = 0;
result[0] = matrixBuf[stroka - 1, 0];
double[] buffer = new double[stroka];
double a = 0;
for (int u = 0; u < stroka - 1; u++) // перемножение и сложение элементов
{
countStr++;
for (int q = 0; q < 2; q++)
{
countEl++;
if (countEl == 1)
{
for (int t = 0; t < stroka; t++)
{
buffer[t] = result[t] * matrixBuf[stroka - u - 2, t];
}
}
else
{
for (int t = 0; t < buffer.Length; t++)
{
countS++;
a = a + buffer[t];
if(countS == stroka)
{
result[u + 1] = a;
countStr = 0;
}
}
}
}
if (countEl == 2)
{
countEl = 0;
}
}