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); }
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); }
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); }
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); }
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); }
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); }