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)