Source code for ceem.systems.maglev
from collections import OrderedDict
import torch
from torch import nn
from ceem.dynamics import *
[docs]class MagLev(C2DSystem, nn.Module, AnalyticObsJacMixin, DynJacMixin):
    """Simple pendulum, where y = [cos th, sin th]
    """
    def __init__(self, mg, k, dt, method='midpoint'):
        """
           Args:
              mu (torch.tensor): (1,) scalar
        """
        C2DSystem.__init__(self, dt=dt, method=method)
        nn.Module.__init__(self)
        self._mg = nn.Parameter(mg)
        self._k = nn.Parameter(k)
        self._xdim = 2
        self._ydim = 2
        self._udim = 1
[docs]    def step_derivs(self, t, x, u):
        q = x[:,:,:1]
        qdot = x[:,:,1:]
        qddot = self._mg - self._k * (u + self._k/self._mg) / q**2
        xdot = torch.cat([qdot,qddot], dim=2)
        return xdot 
[docs]    def observe(self, t, x, u=None):
        return x 
[docs]    def jac_obs_x(self, t, x, u=None):
        B,T,n = x.shape
        return torch.eye(n).expand(B,T,n,n)