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