public TwoDImplicitParabolicSolver(TwoDParabolicProblem parabolicProblem)
 {
     problem = parabolicProblem;
     h = problem.H;
     L = problem.L;
     M = problem.M;
     I = (int)(L / h);
     J = (int)(M / h);
     tau = (h * h) / 4.0;
 }
예제 #2
0
        public static void Rotate()
        {
            do
            {
                Console.Write("h = ");
                var h = double.Parse(Console.ReadLine());

                Console.Write("L = ");
                var L = double.Parse(Console.ReadLine());

                Console.Write("M = ");
                var M = double.Parse(Console.ReadLine());

                Console.Write("J = ");
                var J = int.Parse(Console.ReadLine());

                var parabolicProblem = new TwoDParabolicProblem()
                {
                    H = h,
                    L = L,
                    M = M,
                    Fi = (x, y) => (2 * L) + y,
                    Psi1 = (y, t) => y + t + (2 * L),
                    Psi2 = (y, t) => (2 * L) + t + y,
                    Psi3 = (x, t) => 2 * L,
                    Psi4 = (x, t) => (2 * L) + M
                };
                var parabolicSolver = new TwoDSplitParabolicRotateSolver(parabolicProblem, Math.PI / 4.0);
                var parabolicSolver1 = new TwoDExplicitParabolicRotateSolver(parabolicProblem, Math.PI / 4.0);
                //var parabolicSolver2 = new TwoDImplicitParabolicSolver(parabolicProblem);
                var ans = parabolicSolver.Solve(J);
                var ans1 = parabolicSolver1.Solve(J);
                //var ans2 = parabolicSolver2.Solve(J);

                if (ans == null)
                {
                    Console.WriteLine("Условия согласования не выполнены");
                }
                else
                {
                    var maxFail = 0.00;
                    Console.WriteLine("Layer # {0}", ans.Number);
                    Console.WriteLine("Explicit:        Split:       Failure(Splitting and Explicit):");
                    for (int i = 0; i < ans.Xy.GetLength(0); i++)
                    {
                        for (int j = 0; j < ans.Xy.GetLength(1); j++)
                        {
                            Console.WriteLine("{0:F6}   |   {1:F6}      |   {2:F6}  |", ans1[i, j], ans[i, j], Math.Abs(ans1[i, j] - ans[i, j]));
                            maxFail = Math.Max(maxFail, Math.Abs(ans1[i, j] - ans[i, j]));
                        }
                    }

                    Console.WriteLine("Max Fail = {0:F6}", maxFail);
                }
            }
            while (true);
        }