Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/soypat/godesim
ODE system solver made simple. For IVPs (initial value problems).
https://github.com/soypat/godesim
differential-equations dormand-prince golang initial-value-problem ivp newton-raphson-multivariable ode ode-solver runge-kutta runge-kutta-fehlberg simulation
Last synced: about 2 months ago
JSON representation
ODE system solver made simple. For IVPs (initial value problems).
- Host: GitHub
- URL: https://github.com/soypat/godesim
- Owner: soypat
- License: bsd-3-clause
- Created: 2020-12-16T01:02:26.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2022-06-04T04:01:34.000Z (over 2 years ago)
- Last Synced: 2024-10-12T09:11:26.674Z (2 months ago)
- Topics: differential-equations, dormand-prince, golang, initial-value-problem, ivp, newton-raphson-multivariable, ode, ode-solver, runge-kutta, runge-kutta-fehlberg, simulation
- Language: Go
- Homepage:
- Size: 290 KB
- Stars: 23
- Watchers: 2
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-go - godesim - Extended/multivariable ODE solver framework for event-based simulations with simple API. (Science and Data Analysis / HTTP Clients)
- zero-alloc-awesome-go - godesim - Extended/multivariable ODE solver framework for event-based simulations with simple API. (Science and Data Analysis / HTTP Clients)
- awesome-go-extra - godesim - 12-16T01:02:26Z|2022-06-04T04:01:34Z| (Science and Data Analysis / HTTP Clients)
README
[![Go Report Card](https://goreportcard.com/badge/github.com/soypat/godesim)](https://goreportcard.com/report/github.com/soypat/godesim)
[![go.dev reference](https://pkg.go.dev/badge/github.com/soypat/godesim)](https://pkg.go.dev/github.com/soypat/godesim)
[![codecov](https://codecov.io/gh/soypat/godesim/branch/main/graph/badge.svg)](https://codecov.io/gh/soypat/godesim/branch/main)
[![Awesome](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go/blob/master/README.md#science-and-data-analysis)# godesim
Simulate complex systems with a simple API.
---Wrangle non-linear differential equations while writing maintainable, simple code.
Note: [gonum/exp](https://github.com/gonum/exp) is still in early development but offers a more flexible and lightweight alternative to `godesim`'s full fledged simulator.
## Why Godesim?
ODE solvers seem to fill the niche of simple system solvers in
your numerical packages such as scipy's odeint/solve_ivp.Among these integrators there seems to be room for a solver that offers simulation interactivity such as modifying
the differential equations during simulation based on events such as a rocket stage separation.## Installation
Requires Go.
```console
go get github.com/soypat/godesim
```## Progress
Godesim is in early development and will naturally change as it is used more.
The chart below shows some features that are planned or already part of godesim.| Status legend | Planned | Started | Prototype | Stable | Mature |
| ------------- |:-------:|:-------:|:---------:|:------:|:------:|
| Legend symbol | ✖️ | 🏗️ | 🐞️ | 🚦️ | ✅️ || Features | Status | Notes |
| -------- |:------:| ----- |
| Non-linear solvers | 🚦️ | Suite of ODE solvers available. |
| Non-autonomous support | 🚦️ | `U` vector which need not a defined differential equation like `X` does.|
| Event driver | 🚦️ | Eventer interface implemented. |
| Stiff solver | 🚦️ | Newton-Raphson algorithm implemented and tested. |Algorithms available and benchmarks
| Algorithm | Time/Operation| Memory/Op | Allocations/Op |
|-------------------|-----------------|---------------|-------------------|
|RK4 | 1575 ns/op | 516 B/op | 12 allocs/op |
|RK5 | 2351 ns/op | 692 B/op | 21 allocs/op |
|RKF45 | 3229 ns/op | 780 B/op | 25 allocs/op |
|Newton-Raphson | 8616 ns/op | 4292 B/op | 92 allocs/op |
|Dormand-Prince | 4365 ns/op | 926 B/op | 32 allocs/op |## [Examples](./_examples)
### Quadratic Solution
```go
// Declare your rate-of-change functions using state-space symbols
Dtheta := func(s state.State) float64 {
return s.X("theta-dot")
}DDtheta := func(s state.State) float64 {
return 1
}
// Set the Simulation's differential equations and initial values and hit Begin!
sim := godesim.New() // Configurable with Simulation.SetConfig(godesim.Config{...})
sim.SetDiffFromMap(map[state.Symbol]state.Diff {
"theta": Dtheta,
"theta-dot": DDtheta,
})
sim.SetX0FromMap(map[state.Symbol]float64{
"theta": 0,
"theta-dot": 0,
})
sim.SetTimespan(0.0, 1.0, 10) // One second simulated
sim.Begin()
```The above code solves the following system:
![](_assets/quadratic_eq.png)
for the domain `t=0` to `t=1.0` in 10 steps where `theta` and `theta-dot` are the `X` variables. The resulting curve is quadratic as the solution for this equation (for theta and theta-dot equal to zero) is
![](_assets/quadratic_eq_sol.png)
### How to obtain results
```go
// one can then obtain simulation results as float slices
t := sim.Results("time")
theta := sim.Results("theta")
```### Other examples
To run an example, navigate to it's directory (under [`examples`](./_examples)) then type `go run .` in console.
There are three simple examples which have been cooked up and left in `_examples` directory.
I've been having problems running Pixel on my machine so the simulation animations are still under work.* [Simple pendulum](./_examples/simplePendulum)
* [Double pendulum exhibiting chaotic motion](./_examples/doublePendulum)
* [N-Body simulation](./_examples/n-body)### Final notes
Future versions of gonum will have an ODE solver too. Ideally godesim would base it's algorithms on `gonum`'s implementation. See https://github.com/gonum/exp `ode` package.## Contributing
Pull requests welcome!
This is my first library written for any programming language ever. I'll try to be fast on replying to pull-requests and issues.