Beispiel #1
0
        public void AddTest_ValidInput_ValidResult_3()
        {
            var first  = new DiagMatrix <int>(Enumerable.Range(1, 4), 4);
            var second = new DiagMatrix <int>(Enumerable.Repeat(7, 4), 4);

            var expected = new DiagMatrix <int>(Enumerable.Range(8, 4), 4);

            var actual = first.Add(second);

            Assert.IsTrue(expected.Equals(actual));
        }
Beispiel #2
0
        private void build()
        {
            double l, r, c;

            double next_h = points[2].X - points[1].X; // h1
            double prev_h = points[1].X - points[0].X; // h2

            // f'0
            l = -1.0 * (3.0 * prev_h + 2.0 * next_h) /
                (prev_h * (prev_h + next_h));
            c = (2.0 * next_h + prev_h) /
                (prev_h * next_h);
            r = -1.0 * prev_h /
                (next_h * (prev_h + next_h));
            coeffs[0] = 0.5 * (points[0].Y * l + points[1].Y * c + points[2].Y * r);

            // f'n
            next_h           = points[size - 1].X - points[size - 2].X;
            prev_h           = points[size - 2].X - points[size - 3].X;
            l                = next_h / (prev_h * (prev_h + next_h));
            c                = -1.0 * (next_h + 2.0 * prev_h) / (prev_h * next_h);
            r                = (3.0 * next_h + 2.0 * prev_h) / (next_h * (prev_h + next_h));
            coeffs[size - 1] = 0.5 * (points[size - 3].Y * l + points[size - 2].Y * c + points[size - 1].Y * r);

            diagonals[1, 0]        = 1;
            diagonals[1, size - 1] = 1;

            for (int i = 1; i < size - 1; i++)
            {
                next_h = points[i + 1].X - points[i].X;
                prev_h = points[i].X - points[i - 1].X;

                diagonals[0, i] = 2.0 / prev_h;
                diagonals[1, i] = 4.0 * (1.0 / prev_h + 1.0 / next_h);
                diagonals[2, i] = 2.0 / next_h;

                coeffs[i] = -6.0 * points[i - 1].Y / (prev_h * prev_h) +
                            6.0 * points[i].Y * (1.0 / (prev_h * prev_h) - 1.0 / (next_h * next_h)) +
                            6.0 * points[i + 1].Y / (next_h * next_h);
            }

            DiagMatrix matrix = new DiagMatrix(size, offsets, diagonals);
            Vector     vec    = new Vector(coeffs);
            Vector     x      = new Vector(coeffs.Length);

            SoLESolver.Epsilon = 1E-12;
            SoLESolver.SolveSeidel(matrix, vec, x, 1.5);

            coeffs = x.values;
        }
Beispiel #3
0
    public static void Test()
    {
        int blocks = 4, order = 3;

        //solve linear system using C# classes
        {
            try
            {
                BlockMatrix   b     = new BlockMatrix(blocks, order);
                List <double> diag1 = new List <double> {
                    1, 2, 3
                };
                List <double> diag2 = new List <double> {
                    3, 4, 5
                };
                List <double> diag3 = new List <double> {
                    2, 5, 11
                };
                List <double> diag4 = new List <double> {
                    6, 2, 8
                };

                DiagMatrix        d1       = new DiagMatrix(order, diag1);
                DiagMatrix        d2       = new DiagMatrix(order, diag2);
                DiagMatrix        d3       = new DiagMatrix(order, diag3);
                DiagMatrix        d4       = new DiagMatrix(order, diag4);
                List <DiagMatrix> mainDiag = new List <DiagMatrix> {
                    d1, d2, d1, d2
                };
                List <DiagMatrix> upDiag = new List <DiagMatrix> {
                    d3, d4, d3
                };
                List <DiagMatrix> downDiag = new List <DiagMatrix> {
                    null, d4, d3, d4
                };

                b.setMainDiag(mainDiag);
                b.setUpDiag(upDiag);
                b.setDownDiag(downDiag);

                List <double> f1 = new List <double> {
                    5, 6, 7
                };
                List <List <double> > f = new List <List <double> > {
                    f1, f1, f1, f1
                };

                StreamWriter          sw       = new StreamWriter("outSharp.txt");
                List <List <double> > solution = b.solveAndSave(f, sw);

                sw.WriteLine("BlockMatrix * solution: \n");
                List <List <double> > f_new = b * solution;
                foreach (List <double> list in f_new)
                {
                    foreach (double elem in list)
                    {
                        sw.Write(elem + " ");
                    }
                }
                sw.WriteLine();
                sw.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка в тесте на C#: " + ex);
            }
        }

        //using C++ function from DLL
        {
            try
            {
                double[] mainDiag = new double[] { 1, 2, 3, 3, 4, 5, 1, 2, 3, 3, 4, 5 };
                double[] upDiag   = new double[] { 2, 5, 11, 6, 2, 8, 2, 5, 11 };
                double[] downDiag = new double[] { 6, 2, 8, 2, 5, 11, 6, 2, 8 };
                double[] f        = new double[] { 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7 };
                double[] solution = new double[12];
                double   time     = 0;
                GlobalExportFunction(mainDiag, upDiag, downDiag, f, solution, blocks, order, ref time, "OutPlus.txt", true);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка в тесте на C++: " + ex);
            }
        }
    }
Beispiel #4
0
    public static void GenerateAndSolve(int blocks, int smallOrder, ref double msSharp, ref double msPlus)
    {
        try
        {
            {
                BlockMatrix       b        = new BlockMatrix(blocks, smallOrder);
                List <DiagMatrix> mainDiag = new List <DiagMatrix>();
                List <DiagMatrix> upDiag   = new List <DiagMatrix>();
                List <DiagMatrix> downDiag = new List <DiagMatrix>();
                downDiag.Add(null);
                List <List <double> > f = new List <List <double> >();

                for (int i = 0; i < blocks; ++i)
                {
                    List <double> diag = new List <double>();
                    for (int j = 0; j < smallOrder; ++j)
                    {
                        diag.Add(j + 1);
                    }
                    DiagMatrix d = new DiagMatrix(smallOrder, diag);
                    mainDiag.Add(d);

                    diag = new List <double>();
                    for (int j = 0; j < smallOrder; ++j)
                    {
                        diag.Add(j * 0.5 + i + 1);
                    }
                    d = new DiagMatrix(smallOrder, diag);
                    upDiag.Add(d);

                    diag = new List <double>();
                    for (int j = 0; j < smallOrder; ++j)
                    {
                        diag.Add(-j * i * 0.5);
                    }
                    d = new DiagMatrix(smallOrder, diag);
                    downDiag.Add(d);

                    diag = new List <double>();
                    for (int j = 0; j < smallOrder; ++j)
                    {
                        double value = -i * 1.2 + j * 4 - 10;
                        if (value == 0)
                        {
                            diag.Add(1);
                        }
                        else
                        {
                            diag.Add(value);
                        }
                    }
                    f.Add(diag);
                }

                b.setMainDiag(mainDiag);
                b.setUpDiag(upDiag);
                b.setDownDiag(downDiag);

                Stopwatch sw = new Stopwatch();
                sw.Start();
                b.solve(f);
                sw.Stop();
                msSharp = sw.Elapsed.TotalMilliseconds;
            }

            {
                int      totalOrder = blocks * smallOrder;
                double[] mainDiag   = new double[totalOrder];
                double[] upDiag     = new double[totalOrder];
                double[] downDiag   = new double[totalOrder];
                double[] f          = new double[totalOrder];
                double[] solution   = new double[totalOrder];
                double   time       = 0.0;

                int k = 0;
                for (int i = 0; i < blocks; ++i)
                {
                    for (int j = 0; j < smallOrder; ++j)
                    {
                        mainDiag[k] = j + 1;
                        upDiag[k]   = j * 0.5 + i + 1;
                        downDiag[k] = -j * i * 0.5;
                        double value = -i * 1.2 + j * 4 - 10;
                        if (value == 0)
                        {
                            f[k] = 1.0;
                        }
                        else
                        {
                            f[k] = value;
                        }
                        k++;
                    }
                }
                GlobalExportFunction(mainDiag, upDiag, downDiag, f, solution, blocks, smallOrder, ref time, null, false);
                msPlus = (double)time;
            }
        }
        catch (Exception)
        {
            Console.WriteLine("Ошибка в вычислениях");
        }
    }