text: # -*- coding: utf-8 -*-
  """Header here."""
  import numpy as np
  
  
  def balldropmodel_linear(x, theta):
      """Place description here."""
      f = np.zeros((theta.shape[0], x.shape[0]))
      for k in range(0, theta.shape[0]):
          t = x[:, 0]
          h0 = x[:, 1] + theta[k, 0]
          vter = theta[k, 1]
          # g = theta[k, 2]
          f[k, :] = h0 - vter * t
      return f.T
  
  
  def balldropmodel_grav(x, theta):
      """Place description here."""
      f = np.zeros((theta.shape[0], x.shape[0]))
      for k in range(0, theta.shape[0]):
          t = x[:, 0]
          h0 = x[:, 1]
          # vter = theta[k, 1]
          g = theta[k]
          f[k, :] = h0 - (g / 2) * (t ** 2)
      return f.T
  
  def balldroptrue(x):
      """Place description here."""
      def logcosh(x):
          # preventing crashing
          s = np.sign(x) * x
          p = np.exp(-2 * s)
          return s + np.log1p(p) - np.log(2)
      t = x[:, 0]
      h0 = x[:, 1]
      vter = 20
      g = 9.81
      y = h0 - (vter ** 2) / g * logcosh(g * t / vter)
      return y