//u'' = f; u(a) = u0 u(b) = u1 public static void SolveSecondDerevetivWhithBounderyCondition(int SIZE, double a_border, double b_border, ICardinalStratagy calculate, double u0, double u1, FunctionLib.Function function) { int degree = 4; int N = SIZE; int M = N + degree - 2; int m = degree - 2; Matrix U = new Matrix(m, M); double h = MyMath.Basic.GetStep(N, a_border, b_border); CardinalSpline spline = new CardinalSpline(calculate); Matrix D = (1d / Math.Pow(h, m)) * CardinalOperators.DerevetiveMatrix(degree, SIZE); //условие 1: (c,ksi(a)) = u0 Vector ksi_a = spline.SplineVector(a_border, a_border, b_border, N, degree); //условие 1: (c,ksi(b)) = u1 Vector ksi_b = spline.SplineVector(b_border, a_border, b_border, N, degree); for (int i = 0; i < M; i++) { U[0, i] = ksi_a[i]; U[1, i] = ksi_b[i]; } //------------- //Составляем линейную систему Matrix A = ConstructMatrix(D, U); //Составляем правую часть Vector b = MyMath.Basic.GetVectorFunction(N, a_border, b_border, function); Vector y = Matrix.Transpose(D) * b; Vector y_prime = new Vector(y.Length + m); y_prime[y.Length] = u0; y_prime[y.Length + 1] = u1; for (int i = 0; i < y.Length; i++) { y_prime[i] = y[i]; } Console.WriteLine("right part = " + y_prime); // Console.WriteLine(A); Vector x = Solver.BCG(A, y_prime, 0.0001d); Console.WriteLine("x = " + x); Vector c = x.SubVector(0, M); Vector f = spline.GetVectorFunction(N, a_border, b_border, c, h, degree); Console.WriteLine("f = " + f); f = spline.GetVectorFunction(10 * N, a_border, b_border, c, h, degree); b = MyMath.Basic.GetVectorFunction(10 * N, a_border, b_border, function); Console.WriteLine("||err|| = " + (f - b).Norm); }
public static Matrix D1_Matrix(int SIZE, double a_border, double b_border, ICardinalStratagy calculate) { int degree = 3; int N = SIZE; int M = N + degree - 2; int m = degree - 2; Matrix U = new Matrix(m, M); double h = MyMath.Basic.GetStep(N, a_border, b_border); CardinalSpline spline = new CardinalSpline(calculate); Matrix D = (1d / h) * CardinalOperators.DerevetiveMatrix(degree, SIZE); //условие 1: (c,ksi(a)) = u0 Vector ksi_a = spline.SplineVector(a_border, a_border, b_border, N, degree); for (int i = 0; i < M; i++) { U[0, i] = ksi_a[i]; } //------------- //Составляем линейную систему Matrix A = ConstructMatrix(D, U); return(A); }
public static Matrix D4_B_Matrix(int SIZE, double a_border, double b_border, ICardinalStratagy calculate) { int degree = 6; int N = SIZE; int M = N + degree - 2; int m = degree - 2; double alpha = 0.5d; Matrix U = new Matrix(m, M); double h = MyMath.Basic.GetStep(N, a_border, b_border); double h4 = Math.Pow(h, 4); CardinalSpline spline = new CardinalSpline(calculate); Matrix D = (1d / h4) * CardinalOperators.DerevetiveMatrix(degree, SIZE) + (-Math.Pow(alpha, 1)) * CardinalOperators.InterpolateConditionMatrix(degree, SIZE, calculate); //условие 1: (c,ksi(a)) = u0 Vector ksi_a = spline.SplineVector(a_border, a_border, b_border, N, degree); //условие 1: (c,ksi(b)) = u1 Vector ksi_b = spline.SplineVector(b_border, a_border, b_border, N, degree); //условие 2: (c,TD2*ksi(a,deg - 2)) = du0 Matrix D2 = Matrix.Transpose(((1d / Math.Pow(h, 2)) * CardinalOperators.DerevetiveMatrix(4, SIZE + 2))); Vector Dksi_a = D2 * spline.SplineVector(a_border, a_border, b_border, N, degree - 2); //условие 2: (c,TD2*ksi(a,deg - 2)) = du1 Vector Dksi_b = D2 * spline.SplineVector(b_border, a_border, b_border, N, degree - 2); for (int i = 0; i < M; i++) { U[0, i] = ksi_a[i]; U[1, i] = ksi_b[i]; U[2, i] = Dksi_a[i]; U[3, i] = Dksi_b[i]; } //------------- //Составляем линейную систему Matrix A = ConstructMatrix(D, U); return(A); }
public void CardinalSpline_SplineVector_Test1() { double a = 0, b = 1, x = 0.05; CardinalSpline spline = new CardinalSpline(); Vector ksi = spline.SplineVector(x, a, b, 5, 5); Console.WriteLine(ksi + " sum = " + MyMath.Basic.SumArray(ksi.ToArray)); }
//u'''' - alpha*u = f; u(a) = u0 u(b) = u1; u(a) = du0 u(b) = du1 public static void D4_B_bc(int SIZE, double a_border, double b_border, ICardinalStratagy calculate, double u0, double u1, double du0, double du1, FunctionLib.Function function) { int degree = 6; int N = SIZE; int M = N + degree - 2; int m = degree - 2; double alpha = 0.5d; Matrix U = new Matrix(m, M); double h = MyMath.Basic.GetStep(N, a_border, b_border); double h4 = Math.Pow(h, 4); CardinalSpline spline = new CardinalSpline(calculate); Matrix D = (1d / h4) * CardinalOperators.DerevetiveMatrix(degree, SIZE) + (-Math.Pow(alpha, 1)) * CardinalOperators.InterpolateConditionMatrix(degree, SIZE, calculate); //условие 1: (c,ksi(a)) = u0 Vector ksi_a = spline.SplineVector(a_border, a_border, b_border, N, degree); //условие 1: (c,ksi(b)) = u1 Vector ksi_b = spline.SplineVector(b_border, a_border, b_border, N, degree); //условие 2: (c,TD2*ksi(a,deg - 2)) = du0 Matrix D2 = Matrix.Transpose(((1d / Math.Pow(h, 2)) * CardinalOperators.DerevetiveMatrix(4, SIZE + 2))); Vector Dksi_a = D2 * spline.SplineVector(a_border, a_border, b_border, N, degree - 2); //условие 2: (c,TD2*ksi(a,deg - 2)) = du1 Vector Dksi_b = D2 * spline.SplineVector(b_border, a_border, b_border, N, degree - 2); for (int i = 0; i < M; i++) { U[0, i] = ksi_a[i]; U[1, i] = ksi_b[i]; U[2, i] = Dksi_a[i]; U[3, i] = Dksi_b[i]; } //------------- //Составляем линейную систему Matrix A = ConstructMatrix(D, U); //Составляем правую часть Vector b = MyMath.Basic.GetVectorFunction(N, a_border, b_border, function); Vector y = Matrix.Transpose(D) * b; Vector y_prime = new Vector(y.Length + m); y_prime[y.Length] = u0; y_prime[y.Length + 1] = u1; y_prime[y.Length + 2] = du0; y_prime[y.Length + 3] = du1; for (int i = 0; i < y.Length; i++) { y_prime[i] = y[i]; } Console.WriteLine("right part = " + y_prime); //Console.WriteLine(A); A.Save("D4.txt"); /* * Vector x = Solver.BCG(A, y_prime, 0.0001d); * Console.WriteLine("x = " + x); * Vector c = x.SubVector(0, M); * Vector f = spline.GetVectorFunction(N, a_border, b_border, c, h, degree); * Console.WriteLine("f = " + f); * f = spline.GetVectorFunction(10 * N, a_border, b_border, c, h, degree); * b = MyMath.Basic.GetVectorFunction(10 * N, a_border, b_border, Math.Sin); * Console.WriteLine("||err|| = " + (f - b).Norm);*/ }