Не могу разобраться с системой - C#
Формулировка задачи:
Есть код, решающий СЛАУ методом Гаусса.
У меня есть две системы:
1)
13.25 y0 - 12 y1 = 0
80 yi-1 -205 yi + 120 yi+1 = 0
9.25 y10 - 8 y9 = 2e
2)
y0 = 1
80 yi-1 - 205 yi +120 yi+1 = 0
y10 = e-5
где i = 1, ... , 9
Первую систему решает, а вторую неправильно( В чём дело, подскажите?
Листинг программы
- class GausMethod
- {
- public uint RowCount;
- public uint ColumCount;
- public double[][] Matrix { get; set; }
- public double[] RightPart { get; set; }
- public double[] Answer { get; set; }
- public GausMethod(uint Row, uint Colum)
- {
- RightPart = new double[Row];
- Answer = new double[Row];
- Matrix = new double[Row][];
- for (int i = 0; i < Row; i++)
- Matrix[i] = new double[Colum];
- RowCount = Row;
- ColumCount = Colum;
- //обнулим массив
- for (int i = 0; i < Row; i++)
- {
- Answer[i] = 0;
- RightPart[i] = 0;
- for (int j = 0; j < Colum; j++)
- Matrix[i][j] = 0;
- }
- }
- private void SortRows(int SortIndex)
- {
- double MaxElement = Matrix[SortIndex][SortIndex];
- int MaxElementIndex = SortIndex;
- for (int i = SortIndex + 1; i < RowCount; i++)
- {
- if (Matrix[i][SortIndex] > MaxElement)
- {
- MaxElement = Matrix[i][SortIndex];
- MaxElementIndex = i;
- }
- }
- //теперь найден максимальный элемент ставим его на верхнее место
- if (MaxElementIndex > SortIndex)//если это не первый элемент
- {
- double Temp;
- Temp = RightPart[MaxElementIndex];
- RightPart[MaxElementIndex] = RightPart[SortIndex];
- RightPart[SortIndex] = Temp;
- for (int i = 0; i < ColumCount; i++)
- {
- Temp = Matrix[MaxElementIndex][i];
- Matrix[MaxElementIndex][i] = Matrix[SortIndex][i];
- Matrix[SortIndex][i] = Temp;
- }
- }
- }
- public int SolveMatrix()
- {
- if (RowCount != ColumCount)
- return 1; //нет решения
- for (int i = 0; i < RowCount - 1; i++)
- {
- SortRows(i);
- for (int j = i + 1; j < RowCount; j++)
- {
- if (Matrix[i][i] != 0) //если главный элемент не 0, то производим вычисления
- {
- double MultElement = Matrix[j][i] / Matrix[i][i];
- for (int k = i; k < ColumCount; k++)
- Matrix[j][k] -= Matrix[i][k] * MultElement;
- RightPart[j] -= RightPart[i] * MultElement;
- }
- //для нулевого главного элемента просто пропускаем данный шаг
- }
- }
- //ищем решение
- for (int i = (int)(RowCount - 1); i >= 0; i--)
- {
- Answer[i] = RightPart[i];
- for (int j = (int)(RowCount - 1); j > i; j--)
- Answer[i] -= Matrix[i][j] * Answer[j];
- if (Matrix[i][i] == 0)
- if (RightPart[i] == 0)
- return 2; //множество решений
- else
- return 1; //нет решения
- Answer[i] /= Matrix[i][i];
- }
- return 0;
- }
- public override String ToString()
- {
- String S = "";
- for (int i = 0; i < RowCount; i++)
- {
- S += "\r\n";
- for (int j = 0; j < ColumCount; j++)
- {
- S += Matrix[i][j].ToString("F04") + "\t";
- }
- S += "\t" + Answer[i].ToString("F08");
- S += "\t" + RightPart[i].ToString("F04");
- }
- return S;
- }
- }
Помогите разобраться (Код взял отсюда Решение СЛАУ(СЛАР) методом Гаусса
Вот такие матрицы(на картинке не решающаяся)
Решение задачи: «Не могу разобраться с системой»
textual
Листинг программы
- LinearEquationSolver.Solve(sistema);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д