public static Vector GetCoef_2h(int degree)
        {
            double[] ksi = GetCardinalValue(degree, 1d);
            Matrix   A   = new Matrix(degree + 1);
            Vector   y   = new Vector(degree + 1);

            for (int i = 0; i < y.Length; i++)
            {
                y[i] = CardinalSpline.Cardinal(degree, i + 1, 0d, 2d);
            }

            for (int i = 0; i < degree + 1; i++)
            {
                for (int j = 0; j < ksi.Length; j++)
                {
                    if (i - j >= 0)
                    {
                        A[i, i - j] = ksi[ksi.Length - 1 - j];
                    }
                }
            }
            Matrix A_t = Matrix.Transpose(A);

            Console.WriteLine("y = " + y);
            Console.WriteLine("A_T*A = " + A);

            Vector c = new Vector();

            c = Solver.BCGSTAB(A, y, 0.0000001d);
            Console.WriteLine("SUM c  = " + MyMath.Basic.SumArray(c.ToArray));
            return(c);
        }
 private static double[] GetCardinalValue(int degree)
 {
     double[] mas = new double[degree - 1];
     for (int i = 0; i < degree - 1; i++)
     {
         mas[i] = CardinalSpline.Cardinal(degree, (i + 1), 0d, 1d);
     }
     return(mas);
 }
 public static double[] GetCardinalValue(int degree, double h)
 {
     double[] mas = new double[degree - 1];
     for (int i = 0; i < degree - 1; i++)
     {
         mas[i] = CardinalSpline.Cardinal(degree, (i + 1) * h, 0, h);
     }
     return(mas);
 }
Esempio n. 4
0
        public static Matrix Create_Ah(int degree, int Size)
        {
            Matrix Ah = new Matrix(Size);
            int    p  = degree;

            for (int i = 0; i < Size; i++)
            {
                for (int j = 0; j < Size; j++)
                {
                    Ah[i, j] = 2.0 * CardinalSpline.Cardinal(2 * (p - 1), (i - j) + p - 1, 0, 1);
                    //if(i - j + 1 < Size)
                    Ah[i, j] -= CardinalSpline.Cardinal(2 * (p - 1), (i - j) + p - 1 + 1, 0, 1);
                    //if (i - j - 1 >= 0)
                    Ah[i, j] -= CardinalSpline.Cardinal(2 * (p - 1), (i - j) + p - 1 - 1, 0, 1);
                }
            }

            return(Ah);
        }
Esempio n. 5
0
        public static Matrix Create_D2_Ah(int degree, int Size)
        {
            Matrix Ah = new Matrix(Size);
            int    p  = degree;
            int    q  = p - 2;

            for (int k = 0; k < Size; k++)
            {
                for (int j = 0; j < Size; j++)
                {
                    Ah[k, j] = 6d * CardinalSpline.Cardinal(2 * q, (k - j) + q, 0, 1);
                    //if (j + 1 < Size)
                    Ah[k, j] -= 4d * CardinalSpline.Cardinal(2 * q, (k - j) + q + 1, 0, 1);
                    //if (j - 1 >= 0)
                    Ah[k, j] -= 4d * CardinalSpline.Cardinal(2 * q, (k - j) + q - 1, 0, 1);
                    //if ( j + 2 < Size)
                    Ah[k, j] += CardinalSpline.Cardinal(2 * q, (k - j) + q + 2, 0, 1);
                    //if (j - 2 >= 0)
                    Ah[k, j] += CardinalSpline.Cardinal(2 * q, (k - j) + q - 2, 0, 1);
                }
            }

            return(Ah);
        }
Esempio n. 6
0
        public void Test()
        {
            int    N = 10;
            int    degree = 2;
            double h = 1;
            double a_border = 0, b_border = 1;
            double u0  = 1;
            Matrix D   = CardinalDifferentialEquation.FirstDirevetive(N);
            Matrix KSI = CardinalDifferentialEquation.CreateKSIMatrix(degree, h, N + 1);
            Matrix DD  = D * Matrix.Transpose(D);

            //KSI[0, 0] -= KSI[0, 1];
            //KSI[N, N] -= KSI[0, 1];
            //DD[0, 0] = DD[N, N] = 2d;
            Console.WriteLine(DD);
            Console.WriteLine(KSI);
            Matrix A = KSI * DD;

            //KSI[0, 0] += KSI[0, 1];
            //KSI[N, N] += KSI[0, 1];
            for (int i = 0; i < N + 1; i++)
            {
                A[i, i] *= 1d;
            }
            A = 2d * A;
            //A[0, 0] = 1.5;
            // A[N, N] = 1.5;
            Console.WriteLine(A);
            Vector y = Vector.GetConstVector(1d, N);

            for (int i = 0; i < N; i++)
            {
                y[i] = i * h;
            }
            Console.WriteLine(D * y);
            Vector Dy = (KSI * D) * y;
            Vector b  = new Vector(N + 2);

            for (int i = 0; i < N + 1; i++)
            {
                b[i] = 2d * Dy[i];
            }
            b[N + 1] = u0;
            Console.WriteLine("b = " + b);
            Matrix B = new Matrix(N + 2);

            for (int i = 0; i < N + 1; i++)
            {
                for (int j = 0; j < N + 1; j++)
                {
                    B[i, j] = A[i, j];
                }
            }
            for (int i = 0; i < N; i++)
            {
                B[N + 1, i] = CardinalSpline.Cardinal(degree + 1, a_border, a_border + (i - (degree + 1) + 1) * h, h);

                B[i, N + 1] = -B[N + 1, i];
            }

            Console.WriteLine(B);
            Vector x = Vector.GetConstVector(2d, N + 2);

            x[N + 1] = 0;
            for (int i = 0; i < N + 1; i++)
            {
                x[i] = i + 1;
            }
            Console.WriteLine("x = " + x);
            Console.WriteLine("B*x = " + B * x);
            Console.WriteLine("b = " + b);
            Vector c = Solver.BCG(B, b, 0.00000001d);

            Console.WriteLine("anser = " + c);
            Console.WriteLine(B * c);
        }
Esempio n. 7
0
        public void SecondDerevitiveSinTest()
        {
            int N      = 50;
            int degree = 2;

            double a_border = 0, b_border = 6.29;
            double h = MyMath.Basic.GetStep(N, a_border, b_border);
            double u0 = FunctionLib.cos(a_border), u1 = FunctionLib.cos(b_border);

            Vector f  = MyMath.Basic.GetVectorFunction(N, a_border, b_border, FunctionLib.cos);
            Matrix D  = CardinalDifferentialEquation.SecondDirevetive(N);
            Matrix DD = D * Matrix.Transpose(D);
            //   Console.WriteLine(DD);
            Matrix A = (1d / (h * h)) * DD;

            Console.WriteLine(D * f);
            Vector Dy = D * f;
            Vector b  = new Vector(N + 4);

            for (int i = 0; i < N + 2; i++)
            {
                b[i] = Dy[i];
            }
            b[N + 2] = u0;
            b[N + 3] = u1;
            Console.WriteLine("b = " + b);
            Matrix B = new Matrix(N + 4);

            for (int i = 0; i < N + 2; i++)
            {
                for (int j = 0; j < N + 2; j++)
                {
                    B[i, j] = A[i, j];
                }
            }
            for (int i = 0; i < N + 2; i++)
            {
                B[N + 2, i] = CardinalSpline.Cardinal(degree + 2, a_border, a_border + (i - (degree + 2) + 1) * h, h);
                B[N + 3, i] = CardinalSpline.Cardinal(degree + 2, b_border, a_border + (i - (degree + 2) + 1) * h, h);

                B[i, N + 2] = -B[N + 2, i];
                B[i, N + 3] = -B[N + 3, i];
            }

            // Console.WriteLine(B);
            //Console.WriteLine("b = " + b);
            Vector c = Solver.BCG(B, b, 0.00000001d);

            Console.WriteLine("anser = " + c);
            Console.WriteLine("Ax = " + B * c);

            Vector d = c.SubVector(0, N + 2);

            CardinalSpline spline = new CardinalSpline();

            Vector anser  = spline.GetVectorFunction(10, a_border, b_border, d, h, degree + 2);
            Vector expect = MyMath.Basic.GetVectorFunction(10, a_border, b_border, FunctionLib.cos);

            Console.WriteLine(anser); Console.WriteLine(expect);

            Console.WriteLine("||u - u_spl|| = " + (expect - anser).Norm);
        }
Esempio n. 8
0
        public void SinTest()
        {
            int N      = 50;
            int degree = 2;

            double a_border = 0, b_border = 6.29;
            double h  = MyMath.Basic.GetStep(N, a_border, b_border);
            double u0 = 0;
            Vector f  = MyMath.Basic.GetVectorFunction(N, a_border, b_border, FunctionLib.cos);
            Matrix D  = CardinalDifferentialEquation.FirstDirevetive(N);
            //Matrix KSI = CardinalDifferentialEquation.CreateKSIMatrix(degree, h, N + 1);
            Matrix DD = D * Matrix.Transpose(D);

            //KSI[0, 0] -= KSI[0, 1];
            //KSI[N, N] -= KSI[0, 1];
            //DD[0, 0] = DD[N, N] = 2d;
            Console.WriteLine(DD);
            //Console.WriteLine(KSI);
            Matrix A = (1d / h) * DD;

            // Console.WriteLine(A);

            Console.WriteLine(D * f);
            Vector Dy = D * f;
            Vector b  = new Vector(N + 2);

            for (int i = 0; i < N + 1; i++)
            {
                b[i] = Dy[i];
            }
            b[N + 1] = u0;
            Console.WriteLine("b = " + b);
            Matrix B = new Matrix(N + 2);

            for (int i = 0; i < N + 1; i++)
            {
                for (int j = 0; j < N + 1; j++)
                {
                    B[i, j] = A[i, j];
                }
            }
            for (int i = 0; i < N; i++)
            {
                B[N + 1, i] = CardinalSpline.Cardinal(degree + 1, a_border, a_border + (i - (degree + 1) + 1) * h, h);

                B[i, N + 1] = -B[N + 1, i];
            }

            //Console.WriteLine(B);
            Console.WriteLine("b = " + b);
            Vector c = Solver.BCG(B, b, 0.00000001d);

            Console.WriteLine("anser = " + c);
            Console.WriteLine("Ax = " + B * c);

            Vector         d      = c.SubVector(0, N + 1);
            CardinalSpline spline = new CardinalSpline();
            Vector         anser  = spline.GetVectorFunction(100, a_border, b_border, d, h, degree + 1);
            Vector         expect = MyMath.Basic.GetVectorFunction(100, a_border, b_border, FunctionLib.sin);

            Console.WriteLine("||u - u_spl|| = " + (expect - anser).Norm);
        }