code: def impulse_response_numerical_data(
      system, prec=8, lower_limit=0, upper_limit=10, **kwargs
  ):
      """
      Returns the numerical values of the points in the impulse response plot
      of a SISO continuous-time system. By default, adaptive sampling
      is used. If the user wants to instead get an uniformly
      sampled response, then ``adaptive`` kwarg should be passed ``False``
      and ``n`` must be passed as additional kwargs.
      Refer to the parameters of class :class:`sympy.plotting.series.LineOver1DRangeSeries`
      for more details.
  
      Parameters
      ==========
  
      system : SISOLinearTimeInvariant
          The system for which the impulse response data is to be computed.
      prec : int, optional
          The decimal point precision for the point coordinate values.
          Defaults to 8.
      lower_limit : Number, optional
          The lower limit of the plot range. Defaults to 0.
      upper_limit : Number, optional
          The upper limit of the plot range. Defaults to 10.
      kwargs :
          Additional keyword arguments are passed to the underlying
          :class:`sympy.plotting.series.LineOver1DRangeSeries` class.
  
      Returns
      =======
  
      tuple : (x, y)
          x = Time-axis values of the points in the impulse response. NumPy array.
          y = Amplitude-axis values of the points in the impulse response. NumPy array.
  
      Raises
      ======
  
      NotImplementedError
          When a SISO LTI system is not passed.
  
          When time delay terms are present in the system.
  
      ValueError
          When more than one free symbol is present in the system.
          The only variable in the transfer function should be
          the variable of the Laplace transform.
  
          When ``lower_limit`` parameter is less than 0.
  
      Examples
      ========
  
      >>> from sympy.abc import s
      >>> from sympy.physics.control.lti import TransferFunction
      >>> from sympy.physics.control.control_plots import impulse_response_numerical_data
      >>> tf1 = TransferFunction(s, s**2 + 5*s + 8, s)
      >>> impulse_response_numerical_data(tf1)   # doctest: +SKIP
      ([0.0, 0.06616480200395854,... , 9.854500743565858, 10.0],
      [0.9999999799999999, 0.7042848373025861,...,7.170748906965121e-13, -5.1901263495547205e-12])
  
      See Also
      ========
  
      impulse_response_plot
  
      """
      if lower_limit < 0:
          raise ValueError(
              "Lower limit of time must be greater "
              "than or equal to zero."
          )
      _check_system(system)
      _x = Dummy("x")
      expr = system.to_expr()
      expr = apart(expr, system.var, full=True)
      _y = _fast_inverse_laplace(expr, system.var, _x).evalf(prec)
      return LineOver1DRangeSeries(
          _y, (_x, lower_limit, upper_limit), **kwargs
      ).get_points()
  
imports: from sympy.core.numbers import I, pi
  from sympy.functions.elementary.exponential import exp, log
  from sympy.polys.partfrac import apart
  from sympy.core.symbol import Dummy
  from sympy.external import import_module
  from sympy.functions import arg, Abs
  from sympy.integrals.laplace import _fast_inverse_laplace
  from sympy.physics.control.lti import SISOLinearTimeInvariant
  from sympy.plotting.series import LineOver1DRangeSeries
  from sympy.polys.polytools import Poly
  from sympy.printing.latex import latex
label_desc: Use image node_id 6 for calling a global function with example usage: impulse_response_numerical_data(system, prec, lower_limit, upper_limit) and returns: LineOver1DRangeSeries