In [1]:
from hypore import *

In [2]:
# create state vector with 4 components and derivatives up to order 2
# and make available in global namespace
xx = gen_state(2,2)
xx.T


Out[2]:
$$\left[\begin{matrix}x_{1} & x_{2} & \dot{x}_{1} & \dot{x}_{2} & \ddot{x}_{1} & \ddot{x}_{2}\end{matrix}\right]$$

In [3]:
# A_(d/dt) = A0_ + A1_*d/dt + A2_*(d/dt)**2
A0_ = sp.Matrix([
    [1],
    [x2]])
A1_ = sp.Matrix([
    [1],
    [x2]])
A2_ = sp.Matrix([
    [1],
    [0]])

# convert to A(d/dt) = A0 + (d/dt)*A1 + (d/dt)**2*A2
A0, A1, A2 = left(A0_, A1_, A2_)
A0, A1, A2 # A(d/dt) = A0 + d/dt*A1 + (d/dt)**2*A2


Out[3]:
$$\left ( \left[\begin{matrix}1.0\\1.0 x_{2} - 1.0 \dot{x}_{2}\end{matrix}\right], \quad \left[\begin{matrix}1.0\\1.0 x_{2}\end{matrix}\right], \quad \left[\begin{matrix}1.0\\0\end{matrix}\right]\right )$$

In [4]:
# manually
# st.rnd_number_rank(Hleft(A0,A1,A2,beta=0)) == st.rnd_number_rank(Hleft_aug(A0,A1,A2,beta=0))

In [5]:
# st.rnd_number_rank(Hleft(A0,A1,A2,beta=1)) == st.rnd_number_rank(Hleft_aug(A0,A1,A2,beta=1))

In [6]:
beta_ = is_lefttinvertible(A0,A1,A2)
if (beta_ != -1):
    print("A is left invertible")


A is left invertible

In [7]:
beta_


Out[7]:
$$1$$

In [8]:
HlA1 = Hleft(A0,A1,A2,beta=beta_)
HlA1


Out[8]:
$$\left[\begin{matrix}1.0 & 1.0 & 1.0 & 0\\1.0 x_{2} & 1.0 x_{2} & 0 & 0\\0 & 1.0 & 1.0 & 1.0\\1.0 \dot{x}_{2} & 1.0 x_{2} + 1.0 \dot{x}_{2} & 1.0 x_{2} & 0\end{matrix}\right]$$

In [9]:
st.rnd_number_rank(HlA1)


Out[9]:
$$4$$

In [10]:
HlA1inv = sp.simplify(HlA1.inv())
HlA1inv


Out[10]:
$$\left[\begin{matrix}1.0 & \frac{1.0 \dot{x}_{2}}{x_{2}^{2}} & 0 & - \frac{1.0}{x_{2}}\\-1.0 & \frac{1.0}{x_{2}^{2}} \left(x_{2} - \dot{x}_{2}\right) & 0 & \frac{1.0}{x_{2}}\\1.0 & - \frac{1.0}{x_{2}} & 0 & 0\\0 & \frac{1.0 \dot{x}_{2}}{x_{2}^{2}} & 1.0 & - \frac{1.0}{x_{2}}\end{matrix}\right]$$

In [11]:
IO = sp.Matrix([1,0,0,0]).T
B_ = IO*HlA1inv
B_


Out[11]:
$$\left[\begin{matrix}1.0 & \frac{1.0 \dot{x}_{2}}{x_{2}^{2}} & 0 & - \frac{1.0}{x_{2}}\end{matrix}\right]$$

In [12]:
B0 = st.col_select(B_, 0,1)
B1 = st.col_select(B_, 2,3)
# hyper-regular left inverse of A(d/dt):
B0, B1 # B(d/dt) = B0 + B1*d/dt


Out[12]:
$$\left ( \left[\begin{matrix}1.0 & \frac{1.0 \dot{x}_{2}}{x_{2}^{2}}\end{matrix}\right], \quad \left[\begin{matrix}0 & - \frac{1.0}{x_{2}}\end{matrix}\right]\right )$$