static void Main(string[] args) { uint SIZE_OF_VARIABLES = 0; uint SIZE_OF_LINE = 0; ConsoleColor pref = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Gauss Method"); Console.ForegroundColor = pref; Console.Write("\nWrite Size Of Variables = "); string ss = Console.ReadLine(); SIZE_OF_VARIABLES = uint.Parse(ss); Console.Write("Write Size Of Lines = "); ss = Console.ReadLine(); SIZE_OF_LINE = uint.Parse(ss); Console.WriteLine(); GausMethod ob = new GausMethod(SIZE_OF_LINE, SIZE_OF_VARIABLES); for (int i = 0; i < ob.Matrix.Count(); i++) { Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Cyan; for (int j = 0; j < ob.Matrix.Count(); j++) { Console.Write("A[{0}][{1}] = ", i + 1, j + 1); ss = Console.ReadLine(); ob.Matrix[i][j] = double.Parse(ss); } Console.ForegroundColor = ConsoleColor.Green; Console.Write("\nB[{0}] = ", i + 1); ss = Console.ReadLine(); ob.RightPart[i] = double.Parse(ss); } ob.SolveMatrix(); var s = ob.ToString(); Console.WriteLine(s); Console.ReadKey(); }
static void Main(string[] args) { // TM - коэффициент теплопроводности double TM = 100; double r = 1; //радиус сечения double h = 10; //быстрота теплообмена (конвекция) double q = 5; // плотность теплового потока double tOut = 40; //температура окружающей среды int kEls = 5; //количество кон. элементов int Ui = 5; // количество строк double dt = 1; //шаг по времени // kNodes - количество узлов int kNodes = kEls + 1; // lEl - длина одного элемента double lEl = 10; // sCut - размер сечения (площадь поперечного сечения) double sCut = Math.PI * Math.Pow(r, 2); double CPM = 15; //теплоемк * плотн double[,] T = new double[Ui, kNodes]; //вектор узловых значений температуры (решение) double[,] F = new double[Ui, kNodes]; //вектор нагрузки double[] midF = new double[kNodes]; //вектор Fcp double[,] B = new double[kNodes, kNodes]; double[,] P = new double[kNodes, kNodes]; double[,] K = new double[kNodes, kNodes]; // матрица теплопроводности(глобальная) double[,] C = new double[kNodes, kNodes]; // матрица демпфирования(глобальная) int left = 100; //левые граничные условия int right = 500; //правые граничные условия T[0, 0] = left; T[0, kNodes - 1] = right; double b = left; double a = (right - b) / ((kNodes - 1) * lEl); //Шаг по х double xx = lEl; // Начальные условия for (int i = 1; i < kNodes - 1; i++) { if (i == 1) { T[0, i] = a * xx + b; } else { xx = xx + lEl; T[0, i] = a * xx + b; } } // Вектор нагрузки для нулевого момента времени F[0, 0] = F[0, 1] = -(h * (left - tOut) * sCut) / 2; F[0, F.GetLength(1) - 1] = F[0, F.GetLength(1) - 2] = q * sCut / 2; // Локальные матрицы K и C double[,] kTTmp = new double[2, 2]; double[,] kATmp = new double[2, 2]; double[,] cTTmp = new double[2, 2]; double[,] cATmp = new double[2, 2]; kTTmp[0, 0] = sCut * TM / lEl; kTTmp[0, 1] = -kTTmp[0, 0]; kTTmp[1, 0] = -kTTmp[0, 0]; kTTmp[1, 1] = kTTmp[0, 0]; cTTmp[0, 0] = CPM * sCut * lEl / 3; cTTmp[0, 1] = cTTmp[0, 0] / 2; cTTmp[1, 0] = cTTmp[0, 0] / 2; cTTmp[1, 1] = cTTmp[0, 0]; // Заполнение глобальных матриц for (int i = 0; i < kNodes - 1; i++) { K[i, i] += kTTmp[0, 0]; K[i, i + 1] += kTTmp[0, 1]; K[i + 1, i] += kTTmp[1, 0]; K[i + 1, i + 1] += kTTmp[1, 1]; C[i, i] += cTTmp[0, 0]; C[i, i + 1] += cTTmp[0, 1]; C[i + 1, i] += cTTmp[1, 0]; C[i + 1, i + 1] += cTTmp[1, 1]; } for (int i = 0; i < kNodes; i++) { for (int j = 0; j < kNodes; j++) { C[i, j] *= 2 / dt; } } // Формирование матриц для уравнения for (int i = 0; i < kNodes; i++) { for (int j = 0; j < kNodes; j++) { B[i, j] = K[i, j] + C[i, j]; P[i, j] = C[i, j] - K[i, j]; } } // Заполнение матрицы температур for (int tNumb = 1; tNumb < T.GetLength(0); tNumb++) { // Вектор нагрузки F[tNumb, 0] = -(h * (T[tNumb - 1, 0] - tOut) * sCut) / 2; F[tNumb, 1] = -(h * (T[tNumb - 1, 1] - tOut) * sCut) / 2; F[tNumb, F.GetLength(1) - 1] = F[tNumb, F.GetLength(1) - 2] = q * sCut / 2; for (int j = 0; j < kNodes; j++) { midF[j] = F[tNumb - 1, j] + F[tNumb, j]; } //Матрица результат умеожения матрицы Р на вектор Т double[,] tmpBVect = new double[kNodes, 1]; //Вектор, содержащий температуры на предыдущем слое double[,] tmpT = new double[kNodes, 1]; //Вектор решние СЛАУ double[] solve = new double[kNodes]; //Столбец свободных членов для системы double[] bVect = new double[kNodes]; for (int i = 0; i < kNodes; i++) { tmpT[i, 0] = T[tNumb - 1, i]; } tmpBVect = mult_matrix(P, tmpT); for (int i = 0; i < kNodes; i++) { bVect[i] = tmpBVect[i, 0] - midF[i]; } // Решение СЛАУ GausMethod method = new GausMethod((uint)kNodes, (uint)kNodes); //заполняем правую часть method.RightPart = bVect; //заполняем матрицу for (int i = 0; i < kNodes; i++) { for (int j = 0; j < kNodes; j++) { method.Matrix[i][j] = B[i, j]; } } //решаем матрицу method.SolveMatrix(); //сохраняем ответ for (int i = 0; i < kNodes; i++) { solve[i] = method.Answer[i]; } // Заносим значения для найденного момента времени в соответствующую строку матрицы for (int j = 0; j < kNodes; j++) { T[tNumb, j] = solve[j]; } } // Вывод результатов for (int i = 0; i < T.GetLength(0); i++) { for (int j = 0; j < T.GetLength(1); j++) { Console.Write("{0:f2} ", T[i, j]); } Console.WriteLine(); } Console.ReadKey(); }