Exemple #1
0
        public ParabolicExplicitFiniteDifference(
            ParabolicBoundaryConditions conditions,
            ParabolicEquationParams equation,
            ParabolicFiniteDifferenceParams @params)
        {
            _params     = @params;
            _conditions = conditions;
            _equation   = equation;

            _grid = new double[_params.SpaceStepCount + 1, _params.TimeStepCount + 1];
            InitializeGrid();
        }
        public CrankNikolsonMethod(
            ParabolicBoundaryConditions conditions,
            ParabolicEquationParams equation,
            FiniteDifferenceParams @params,
            double weight = 0.5d)
        {
            _conditions = conditions;
            _params     = @params;
            _equation   = equation;
            _weight     = weight;

            _grid = new double[_params.SpaceStepCount + 1, _params.TimeStepCount + 1];
            InitializeGrid();
        }
Exemple #3
0
        static void Main(string[] args)
        {
            var conditions = new ParabolicBoundaryConditions()
            {
                FirstConditionParameters  = new[] { 1.0d, 1.0d },
                SecondConditionParameters = new[] { 1.0d, 1.0d },
                InitialCondition          = (x, t) => Math.Sin(x),
                FirstCondition            = (x, t) => Math.Exp(-2 * t) * (Math.Sin(t) + Math.Cos(t)),
                SecondCondition           = (x, t) => - Math.Exp(-2 * t) * (Math.Sin(t) + Math.Cos(t))
            };
            var equation = new ParabolicEquationParams()
            {
                a = 1.0d,
                b = 1.0d,
                c = -1.0d,
                f = (x, t) => 0
            };
            var @params = new ParabolicFiniteDifferenceParams()
            {
                SpaceBoundLeft        = 0,
                SpaceBoundRight       = Math.PI,
                TimeLimit             = 1d,
                SpaceStepCount        = 20,
                TimeStepCount         = 400,
                BoundaryApproximation = BoundaryApproximationType.SecondDegreeTwoPoints
            };


            var exp     = new Expression();
            var varList = new List <Variable>()
            {
                new Variable("x", 2),
                new Variable("y", Math.E)
            };

            exp.FromString("(x^2 + 6 * e^y) / (3 - 8 / (2* y))", varList);
            Console.WriteLine(exp.GetValue());
            var method = new CrankNikolsonMethod(conditions, equation, @params);

            var result = method.Solve();

            var errors = method.FindError((x, t) => Math.Exp(-2 * t) * Math.Sin(x + t));

            var maxError = FindMax(errors);
            var median   = FindMedian(errors);

            Console.WriteLine($"Max error: {maxError}; median error: {median}");
            Console.ReadKey();
        }