Update README.md

Signed-off-by: David Rotermund <54365609+davrot@users.noreply.github.com>
This commit is contained in:
David Rotermund 2024-01-16 19:12:29 +01:00 committed by GitHub
parent b9ba338d14
commit 2be6546926
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -450,3 +450,87 @@ Calling the solver and the graphical representation of the solution can than be
plot(t,y(:,1)/pi*180);
```
### Python version
```python
import numpy as np
import scipy
import matplotlib.pyplot as plt
def derive_pendulum(t, s):
return [s[1], -np.sin(s[0])]
# set initial conditions and constants
try:
theta0: float = float(input("initial angle = "))
except ValueError:
theta0 = 90
print(f"theta0 = {theta0}°")
x: np.ndarray = np.array([theta0 * np.pi / 180, 0])
tmin: float = 0.0
try:
tmax: float = float(input("time = "))
except ValueError:
tmax = 100
print(f"tmax = {tmax}")
try:
tau: float = float(input("step width = "))
except ValueError:
tau = 0.1
print(f"tau = {tau}")
time: np.ndarray = np.linspace(
start=tmin,
stop=tmax,
num=int(np.ceil((tmax - tmin) / tau)),
endpoint=True,
)
t_eval = np.linspace(tmin, tmax, 1000)
sol = scipy.integrate.solve_ivp(
fun=derive_pendulum, t_span=[tmin, tmax], y0=x, t_eval=time, method="RK45"
)
plt.plot(sol.t, sol.y[0] / np.pi * 180)
plt.xlabel("time")
plt.ylabel("theta")
plt.show()
```
[scipy.integrate.solve_ivp](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html#scipy.integrate.solve_ivp)
```python
scipy.integrate.solve_ivp(fun, t_span, y0, method='RK45', t_eval=None, dense_output=False, events=None, vectorized=False, args=None, **options)
```
> Solve an initial value problem for a system of ODEs.
>
> This function numerically integrates a system of ordinary differential equations given an initial value:
>
$$dy / dt = f(t, y)$$
$$y(t0) = y0$$
> Here t is a 1-D independent variable (time), y(t) is an N-D vector-valued function (state), and an N-D vector-valued function f(t, y) determines the differential equations. The goal is to find y(t) approximately satisfying the differential equations, given an initial value y(t0)=y0.
>
> Some of the solvers support integration in the complex domain, but note that for stiff ODE solvers, the right-hand side must be complex-differentiable (satisfy Cauchy-Riemann equations). To solve a problem in the complex domain, pass y0 with a complex data type. Another option always available is to rewrite your problem for real and imaginary parts separately.
**method**:
|||
|---|---|
|**RK45** (default)| Explicit Runge-Kutta method of order 5(4). The error is controlled assuming accuracy of the fourth-order method, but steps are taken using the fifth-order accurate formula (local extrapolation is done). A quartic interpolation polynomial is used for the dense output. Can be applied in the complex domain.|
|**RK23**| Explicit Runge-Kutta method of order 3(2). The error is controlled assuming accuracy of the second-order method, but steps are taken using the third-order accurate formula (local extrapolation is done). A cubic Hermite polynomial is used for the dense output. Can be applied in the complex domain.|
|**DOP853**| Explicit Runge-Kutta method of order 8. Python implementation of the “DOP853” algorithm originally written in Fortran. A 7-th order interpolation polynomial accurate to 7-th order is used for the dense output. Can be applied in the complex domain.|
|**Radau**| Implicit Runge-Kutta method of the Radau IIA family of order 5. The error is controlled with a third-order accurate embedded formula. A cubic polynomial which satisfies the collocation conditions is used for the dense output.|
|**BDF**| Implicit multi-step variable-order (1 to 5) method based on a backward differentiation formula for the derivative approximation. A quasi-constant step scheme is used and accuracy is enhanced using the NDF modification. Can be applied in the complex domain.|
|**LSODA**| Adams/BDF method with automatic stiffness detection and switching. This is a wrapper of the Fortran solver from ODEPACK.|