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