/// <summary> /// Resets distributons of tree /// </summary> /// <param name="tree">The tree</param> static public void Reset(ObjectFormulaTree tree) { IObjectOperation op = tree.Operation; if (op is IDistribution) { IDistribution d = op as IDistribution; d.Reset(); return; } for (int i = 0; i < tree.Count; i++) { Reset(tree[i]); } }
void ResetDistr() { UpdateChildrenData(); foreach (IMeasurement m in measures) { if (m is IDerivation) { IDerivation der = m as IDerivation; IMeasurement md = der.Derivation; if (md is IDistribution) { IDistribution distr = md as IDistribution; distr.Reset(); } } } reset = () => { }; }
/// <summary> /// Performs step of integration /// </summary> /// <param name="t0">Step start</param> /// <param name="t1">Step finish</param> public override void Step(double t0, double t1) { isBusy = true; if (Dim == 0) { return; } double dt = t1 - t0; int i = 0; foreach (IMeasurements m in equations) { IDifferentialEquationSolver s = m as IDifferentialEquationSolver; m.UpdateMeasurements(true); int n = s.GetVariablesCount(); for (int j = 0; j < n; j++) { w[i] = (double)m[j].Parameter(); f[i] = w[i]; ++i; } s.CopyVariablesToSolver(i - s.GetVariablesCount(), w); } double t = t0; timeProvider.Time = t; i = 0; foreach (IMeasurements m in equations) { IDifferentialEquationSolver s = m as IDifferentialEquationSolver; s.CalculateDerivations(); for (int j = 0; j < s.GetVariablesCount(); j++) { IDerivation der = m[j] as IDerivation; z[i] = Measurement.GetDouble(der.Derivation); k[0, i] = z[i] * dt; w[i] = f[i] + 0.5 * k[0, i]; ++i; } s.CopyVariablesToSolver(i - s.GetVariablesCount(), w); } t = t0 + 0.5 * dt; timeProvider.Time = t; i = 0; foreach (IMeasurements m in equations) { IDifferentialEquationSolver s = m as IDifferentialEquationSolver; s.CalculateDerivations(); for (int j = 0; j < s.GetVariablesCount(); j++) { IDerivation der = m[j] as IDerivation; z[i] = Measurement.GetDouble(der.Derivation); k[1, i] = z[i] * dt; w[i] = f[i] + 0.5 * k[1, i]; ++i; } s.CopyVariablesToSolver(i - s.GetVariablesCount(), w); } t = t0 + 0.5 * dt; timeProvider.Time = t; i = 0; foreach (IMeasurements m in equations) { IDifferentialEquationSolver s = m as IDifferentialEquationSolver; s.CalculateDerivations(); for (int j = 0; j < s.GetVariablesCount(); j++) { IDerivation der = m[j] as IDerivation; z[i] = Measurement.GetDouble(der.Derivation); k[2, i] = z[i] * dt; w[i] = f[i] + k[2, i]; ++i; } s.CopyVariablesToSolver(i - s.GetVariablesCount(), w); } t = t0 + dt; timeProvider.Time = t; i = 0; foreach (IMeasurements m in equations) { IDifferentialEquationSolver s = m as IDifferentialEquationSolver; s.CalculateDerivations(); for (int j = 0; j < s.GetVariablesCount(); j++) { IDerivation der = m[j] as IDerivation; z[i] = Measurement.GetDouble(der.Derivation); k[3, i] = z[i] * dt; ++i; } } i = 0; foreach (IMeasurements m in equations) { IDifferentialEquationSolver s = m as IDifferentialEquationSolver; for (int j = 0; j < s.GetVariablesCount(); j++) { f[i] += (k[0, i] + 2 * k[1, i] + 2 * k[2, i] + k[3, i]) / 6; ++i; } s.CopyVariablesToSolver(i - s.GetVariablesCount(), f); } i = 0; foreach (IMeasurements m in equations) { IDifferentialEquationSolver s = m as IDifferentialEquationSolver; for (int j = 0; j < s.GetVariablesCount(); j++) { IMeasurement measure = m[j]; IDerivation d = m[j] as IDerivation; IMeasurement der = d.Derivation; if (!(der is IDistribution)) { ++i; continue; } IDistribution distr = der as IDistribution; f[i] += distr.Integral; distr.Reset(); ++i; } s.CopyVariablesToSolver(i - s.GetVariablesCount(), f); } isBusy = false; }
void IDistribution.Reset() { distribution.Reset(); }