示例#1
0
        public Vector computeSolutionVectorWithMultipleSteps(Vector initial, OrdinaryDifferentialEquation ode, double startTime, double endTime, double step)
        {
            double tempTime = startTime;
            int N = Convert.ToInt32((endTime - startTime) / step) + 1;
            Vector tempSolution = initial;

            Vector solution = new Vector(N);
            solution[0] = initial[0];

            Vector temp = new Vector(1);

            for (int i = 1; i < N; i++)
            {

                temp[0] = solution[i - 1];
                solution[i] = computeSolutionForNextStep(temp, ode, tempTime, tempTime + step)[0];
                tempTime += step;
            }

            if (!GeneralHelper.isXAlmostEqualToY(startTime + (N-1) * step, endTime))
            {
                tempTime = startTime + N * step;
                tempSolution = computeSolutionForNextStep(tempSolution, ode, tempTime, endTime);
            }

            return solution;
        }
示例#2
0
        public Vector computeSolutionForNextStep(Vector initial,OrdinaryDifferentialEquation ode, double startTime, double endTime)
        {
            Vector tempSolution = initial;
            Vector evaluatedODE = ode.evaluateOrdinaryDifferentialEquation(tempSolution, startTime);
            double deltaTime = endTime - startTime;

            for(int i = 0; i < 5; i++)
            {
                double nextTimeStep = startTime + B[i] * deltaTime;
                evaluatedODE = (Vector) (A[i] * evaluatedODE) + ode.evaluateOrdinaryDifferentialEquation(tempSolution, nextTimeStep);
                tempSolution = tempSolution + (Vector)(C[i] * deltaTime * evaluatedODE);
            }

            return tempSolution;
        }
示例#3
0
        public Vector computeSolutionWithMultipleSteps(Vector initial, OrdinaryDifferentialEquation ode, double startTime, double endTime, double step)
        {
            double tempTime = startTime;
            int N =  Convert.ToInt32((endTime - startTime)/ step);
            Vector tempSolution = initial;

            for(int i = 1; i <= N; i++)
            {
                tempSolution = computeSolutionForNextStep(tempSolution, ode, tempTime, tempTime + step);
                tempTime += step;
            }

            if (!GeneralHelper.isXAlmostEqualToY(startTime + N * step, endTime))
            {
                tempTime = startTime + N * step;
                tempSolution = computeSolutionForNextStep(tempSolution, ode, tempTime, endTime);
            }

            return tempSolution;
        }
示例#4
0
        public void evaluate()
        {
            //Anfangsbedingung
            Vector initial = new Vector(1);
            initial[0] = -1.0;
            List<Func<double, double, double>> mySystem = new List<Func<double, double, double>>();
            mySystem.Add(derivativeFunction);
            OrdinaryDifferentialEquation testEquation = new OrdinaryDifferentialEquation(mySystem);
            IODESolver odeSolver = new RungeKuttaSolver();

            double[] errorList = new double[10];

            for (int i = 1; i <= 10; i++)
            {
                double timeStep = Math.Pow(2.0, -i);
                Vector res = odeSolver.computeSolutionVectorWithMultipleSteps(initial, testEquation, 1.0, 2.0, timeStep);
                //Vector exact = null; //hier die exacte auswertung
                //double error = (res - exact) * (res - exact);
            }
        }