Added the ability to select a method at runtime if so desired
This commit is contained in:
1 parent
2ce5028529
commit
8894de37d6
12 files changed
+622
-54
No files matched your search
@@ -29,6 +29,7 @@ See [benchmark report](VERN7_BENCHMARK_REPORT.md) for detailed performance analy
|
||||
- **Lazy computation** of extra interpolation stages (Vern7)
|
||||
- **PID step size control** as an alternative to the PI controller
|
||||
- **Automatic Differentiation**, the same problem can be solved with floats or also differentiated with dual numbers
|
||||
- **Runtime integrator selection**, the method can be a value, named in a configuration file rather than fixed as a type
|
||||
|
||||
### Future Improvements
|
||||
|
||||
@@ -83,6 +84,36 @@ let solution = problem.solve();
|
||||
let _interpolated_answer = solution.interpolate(4.4);
|
||||
```
|
||||
|
||||
## Choosing the integrator at runtime
|
||||
|
||||
The integrator is normally a type parameter, fixed when the code is compiled. `Method` is an enum
|
||||
over the integrators here that itself implements `Integrator`, so the choice can be a value instead:
|
||||
|
||||
```rust
|
||||
use nalgebra::Vector1;
|
||||
use ordinary_diffeq::prelude::*;
|
||||
|
||||
fn derivative(_t: f64, y: Vector1<f64>, _p: &()) -> Vector1<f64> {
|
||||
-y
|
||||
}
|
||||
|
||||
// `MethodName` derives `Serialize`/`Deserialize`, so this can come out of a
|
||||
// configuration file instead of being written here.
|
||||
let name: MethodName = serde_json::from_str(r#""Vern7""#).unwrap();
|
||||
let method: Method<1> = name.instantiate().a_tol(1e-12).r_tol(1e-12);
|
||||
|
||||
let ode = ODE::new(&derivative, 0.0, 2.0, Vector1::new(1.0), ());
|
||||
let mut problem = Problem::new(ode, method, PIController::default());
|
||||
let solution = problem.solve();
|
||||
|
||||
// And the method that ran can be recorded in a form that selects it again
|
||||
assert_eq!(method.name(), MethodName::Vern7);
|
||||
```
|
||||
|
||||
Dispatch is a `match` on the variant, not a trait object, so nothing is erased: the same `Method`
|
||||
works at a dual scalar and differentiates exactly as the integrator it wraps does. A `Vec<Method<D>>`
|
||||
holds several methods for comparison over the same problem.
|
||||
|
||||
## Automatic differentiation
|
||||
|
||||
State, time and step size are generic over the `Scalar` trait. `f64` implements it by default,
|
||||
|
||||
Reference in new issue
Block a user