private static void TestMatrix()
        {
            NumericMatrix matrix = new NumericMatrix(2, 4);

            matrix.Fill(9);
            Console.WriteLine(matrix.ToString());


            NumericMatrix matrix2 = new NumericMatrix(3);

            matrix2.ConsoleInput();
            Console.WriteLine("Определитель:" + NumericMatrix.GetDeterminant(matrix2));
            Console.WriteLine("Обратная матрица:");
            Console.WriteLine(NumericMatrix.GetInverseMatrix(matrix2).ToString());



            Console.ReadLine();
        }
Ejemplo n.º 2
0
        //Решение поставленной краевой задачи методом конечных разностей
        public NumericMatrix FiniteDifferencesMethod()
        {
            solutionsField = new NumericMatrix(stepsT, stepsX);
            solutionsField.Fill(0);
            NumericMatrix slaeCoeffs      = new NumericMatrix(stepsT * stepsX, stepsT * stepsX + 1);
            int           currentEquasion = 0;

            //Получить известные u (заданные начальными и граничными условиями)
            //и заполнить их коэффициенты un : 0,0,...,1([n]),0...=sigma(n*h) в итоговой
            //СЛАУ
            //Начальное условие u=phi1(x) - левая вертикаль сетки
            for (int k = 1; k < stepsT; k++)
            {
                solutionsField.SetElement(k, 0, phi1Fun((double)k * tau));

                currentEquasion = k * stepsX;
                slaeCoeffs.SetElement(currentEquasion, currentEquasion,
                                      1);
                slaeCoeffs.SetElement(currentEquasion + stepsX - 1, stepsT * stepsX,
                                      solutionsField.GetElement(k, 0));
            }

            //Начальное условие u=phi2(x) - правая вертикаль сетки
            for (int k = 1; k < stepsT; k++)
            {
                solutionsField.SetElement(k, stepsT - 1, phi2Fun((double)k * h));
                currentEquasion = k * stepsX;
                slaeCoeffs.SetElement(currentEquasion + stepsX - 1, currentEquasion + stepsX - 1,
                                      1);
                slaeCoeffs.SetElement(currentEquasion + stepsX - 1, stepsT * stepsX,
                                      solutionsField.GetElement(k, stepsT - 1));
            }

            //Начальное условие u=sigma1(x) - нижняя горизонталь сетки
            for (int k = 0; k < stepsX; k++)
            {
                solutionsField.SetElement(0, k, sigma1Fun((double)k * h));
                currentEquasion = k % stepsX;
                slaeCoeffs.SetElement(currentEquasion, currentEquasion,
                                      1);
                slaeCoeffs.SetElement(currentEquasion, stepsT * stepsX,
                                      solutionsField.GetElement(0, k));
            }
            //Console.WriteLine(solutionsField.ToString());
            //Явная схема - преобразована в линейное уравнение с известными коэффициентами
            //(2a^2/h^2-2/tau^2) * u[k,j]+
            //+ (1/tau^2) * u[k-1,j]+
            //+ (1/tau^2) * u[k+1,j]-
            //- (a^2/h^2) * u[k,j+1]-
            //- (a^2/h^2) * u[k,j-1]=0
            // 0 + 0
            // + + +
            // 0 + 0
            //Заполнить коэффициенты для внутренней сетки (t = tDistance не трогаем) по явной схеме
            for (int k = 1; k < stepsT - 1; k++)
            {
                for (int j = 1; j < stepsX - 1; j++)
                {
                    currentEquasion = k * stepsX + j;
                    slaeCoeffs.SetElement(currentEquasion, stepsX * (k) + j, 2 * Math.Pow(paramA, 2) / Math.Pow(h, 2)
                                          - 2 / Math.Pow(tau, 2));
                    slaeCoeffs.SetElement(currentEquasion, stepsX * (k - 1) + j, 1 / Math.Pow(tau, 2));
                    slaeCoeffs.SetElement(currentEquasion, stepsX * (k + 1) + j, 1 / Math.Pow(tau, 2));
                    slaeCoeffs.SetElement(currentEquasion, stepsX * (k) + (j + 1), -1 * Math.Pow(paramA, 2)
                                          / Math.Pow(h, 2));
                    slaeCoeffs.SetElement(currentEquasion, stepsX * (k) + (j - 1), -1 * Math.Pow(paramA, 2)
                                          / Math.Pow(h, 2));
                }
            }

            //Console.WriteLine(solutionsField.ToString());
            //Неявная схема - преобразована в линейное уравнение с известными коэффициентами
            //(1/tau^2 + 2a^2/h^2)*u[k+1,j] -
            //- (2/tau^2) * u[k,j] +
            //+ (1/tau^2) * u[k-1,j] -
            //- (a^2/h^2) * u[k+1, j+1] -
            //- (a^2/h^2) * u[k+1, j-1] = 0
            // + + +
            // 0 + 0
            // 0 + 0
            //Заполнить коэффициенты на stepsT*t по неявной схеме
            int kT = stepsT - 1;

            for (int j = 1; j < stepsX - 1; j++)
            {
                currentEquasion = kT * stepsX + j;
                slaeCoeffs.SetElement(currentEquasion, stepsX * (kT) + j, 1 / Math.Pow(tau, 2)
                                      + 2 * Math.Pow(paramA, 2) / Math.Pow(h, 2));
                slaeCoeffs.SetElement(currentEquasion, stepsX * (kT - 1) + j, (-2) / Math.Pow(tau, 2));
                slaeCoeffs.SetElement(currentEquasion, stepsX * (kT - 2) + j, 1 / Math.Pow(tau, 2));
                slaeCoeffs.SetElement(currentEquasion, stepsX * (kT - 1) + (j + 1), -1 * Math.Pow(paramA, 2)
                                      / Math.Pow(h, 2));
                slaeCoeffs.SetElement(currentEquasion, stepsX * (kT) + (j - 1), -1 * Math.Pow(paramA, 2)
                                      / Math.Pow(h, 2));
            }


            solution = new SLAE(slaeCoeffs);
            //Console.WriteLine(solution.ToString());
            solution.BuildSolution();
            if (!solution.isGeneralSolutionExists())
            {
                List <double> tempList = solution.GetSingleSolution();
                //Printer.PrintList(tempList, "TEMP_LIST");
                int i = 0;
                foreach (double sol in tempList)
                {
                    //Console.WriteLine((i / stepsX) + " : " + (i % stepsX));
                    solutionsField.SetElement(i / stepsX, i % stepsX, sol);
                    i++;
                }
                return(solutionsField);
            }
            else
            {
                return(solutionsField);
            }
        }