A simulation modelling language
Project description
Overview
Solverz is an open-source python-based simulation modelling language that provides symbolic interfaces for you to model your equations and can then generate functions or numba-jitted python modules for numerical solutions.
Solverz supports three types of abstract equation types, that are
- Algebraic Equations (AEs) $0=F(y,p)$
- Finite Difference Algebraic Equations (FDAEs) $0=F(y,p,y_0)$
- Differential Algebraic Equations (DAEs) $M\dot{y}=F(t,y,p)$
where $p$ is the parameter set of your models, $y_0$ is the previous time node value of $y$.
Say, we want to know how long it will take for an apple, launched from the ground into the air, to fall back to the ground. We have the differential equations
$$ \begin{aligned} &v'=-9.8\ &h'=v \end{aligned} $$
with $v(0)=20$ and $h(0)=0$, we can just type the codes
import matplotlib.pyplot as plt
import numpy as np
from Solverz import Model, Var, Ode, Opt, made_numerical, Rodas
# Declare a simulation model
m = Model()
# Declare variables and equations
m.h = Var('h', 0)
m.v = Var('v', 20)
m.f1 = Ode('f1', f=m.v, diff_var=m.h)
m.f2 = Ode('f2', f=-9.8, diff_var=m.v)
# Create the symbolic equation instance and the variable combination
bball, y0 = m.create_instance()
# Transform symbolic equations to python numerical functions.
nbball = made_numerical(bball, y0, sparse=True)
# Define events, that is, if the apple hits the ground then the simulation will cease.
def events(t, y):
value = np.array([y[0]])
isterminal = np.array([1])
direction = np.array([-1])
return value, isterminal, direction
# Solve the DAE
sol = Rodas(nbball,
np.linspace(0, 30, 100),
y0,
Opt(event=events))
# Visualize
plt.plot(sol.T, sol.Y['h'][:, 0])
plt.xlabel('Time/s')
plt.ylabel('h/m')
plt.show()
Then we have
The model is solved with the stiffly accurate Rosenbrock type method, but you can also write your own solvers by the generated numerical interfaces since, for example, the Newton-Raphson solver implememtation for AEs is as simple as below.
@ae_io_parser
def nr_method(eqn: nAE,
y: np.ndarray,
opt: Opt = None):
if opt is None:
opt = Opt(ite_tol=1e-8)
tol = opt.ite_tol
p = eqn.p
df = eqn.F(y, p)
ite = 0
# main loop
while max(abs(df)) > tol:
ite = ite + 1
y = y - solve(eqn.J(y, p), df)
df = eqn.F(y, p)
if ite >= 100:
print(f"Cannot converge within 100 iterations. Deviation: {max(abs(df))}!")
break
return aesol(y, ite)
The implementation of the NR solver just resembles the formulae you read in any numerical analysis book. This is because the numerical AE object eqn provides the $F(t,y,p)$ interface and its Jacobian $J(t,y,p)$, which is derived by symbolic differentiation.
Sometimes you have very complex models and you dont want to re-derive them everytime. With Solverz, you can just use
from Solverz import module_printer
pyprinter = module_printer(bball,
y0,
'bounceball',
jit=True)
pyprinter.render()
to generate an independent python module of your simulation models. You can import them to your .py file by
from bounceball import mdl as nbball, y as y0
Installation
Solverz requires python>=3.10, and can be installed locally with
pip install Solverz
Useful Resources
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file solverz-0.5.2.tar.gz.
File metadata
- Download URL: solverz-0.5.2.tar.gz
- Upload date:
- Size: 583.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0044c4539623e7345f9553264c6af5f7b493276104e3a7f4d9df1dc455defc68
|
|
| MD5 |
01cbd08b58c70f3f31b1886588002dcb
|
|
| BLAKE2b-256 |
a916381c24c289a3c51654964ee76e4b1ff7ad2f95751e054bc524f84f1ab687
|
Provenance
The following attestation bundles were made for solverz-0.5.2.tar.gz:
Publisher:
publish-to-pypi.yml on smallbunnies/Solverz
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
solverz-0.5.2.tar.gz -
Subject digest:
0044c4539623e7345f9553264c6af5f7b493276104e3a7f4d9df1dc455defc68 - Sigstore transparency entry: 217724519
- Sigstore integration time:
-
Permalink:
smallbunnies/Solverz@b2efd6c35ed5eb06818a0da6b284fa250f23f12b -
Branch / Tag:
refs/tags/0.5.2 - Owner: https://github.com/smallbunnies
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@b2efd6c35ed5eb06818a0da6b284fa250f23f12b -
Trigger Event:
push
-
Statement type:
File details
Details for the file solverz-0.5.2-py3-none-any.whl.
File metadata
- Download URL: solverz-0.5.2-py3-none-any.whl
- Upload date:
- Size: 117.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16b0236cdbd8ec338d41f9b998ac765ea07b4b2f521199c76890fdef3166f159
|
|
| MD5 |
075e75b171aa96bdc84d4b5345d19bd9
|
|
| BLAKE2b-256 |
c62ec4bdf0d90cda4e20596079c015058687553b0e3bf24838bdefaf826c9506
|
Provenance
The following attestation bundles were made for solverz-0.5.2-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on smallbunnies/Solverz
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
solverz-0.5.2-py3-none-any.whl -
Subject digest:
16b0236cdbd8ec338d41f9b998ac765ea07b4b2f521199c76890fdef3166f159 - Sigstore transparency entry: 217724525
- Sigstore integration time:
-
Permalink:
smallbunnies/Solverz@b2efd6c35ed5eb06818a0da6b284fa250f23f12b -
Branch / Tag:
refs/tags/0.5.2 - Owner: https://github.com/smallbunnies
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@b2efd6c35ed5eb06818a0da6b284fa250f23f12b -
Trigger Event:
push
-
Statement type: