Taylor

Taylor integration step

ndmap.taylor.taylor(degree: int, length: torch.Tensor, hamiltonian: Callable, state: torch.Tensor, *args: tuple) torch.Tensor[source]

Perform Taylor intergation step.

Parameters:
  • degree (int, non-negative) – integration degree

  • length (Tensor) – integration step length

  • hamiltonian (Hamiltonian) – (autonomous) Hamiltonian function

  • state (State) – intial state

  • *args (tuple) – additional arguments passed to (autonomous) Hamiltonian function

Return type:

State

Examples

>>> from math import pi
>>> import torch
>>> t = torch.tensor(0.1)
>>> f = torch.tensor(2.0*pi*0.1234)
>>> q, p = torch.tensor([0.1, 0.1])
>>> torch.stack([q*(f*t).cos() + p*(f*t).sin(), p*(f*t).cos() - q*(f*t).sin()])
tensor([0.1074, 0.0920])
>>> state = torch.stack([q, p])
>>> knobs = torch.stack([f])
>>> def h(state, knobs):
...    (q, p), (omega, ) = state, knobs
...    return omega*(q**2 + p**2)/2
>>> [taylor(i, t, h, state, knobs) for i in range(4)]
[tensor([0.1000, 0.1000]),
 tensor([0.1078, 0.0922]),
 tensor([0.1075, 0.0919]),
 tensor([0.1074, 0.0920])]
>>> import torch
>>> from ndmap.derivative import derivative
>>> x = torch.tensor([1.0, 1.0])
>>> l = torch.tensor(0.1)
>>> def h(x):
...    q, p = x
...    return p**2/2
>>> derivative(1, lambda l: taylor(1, l, h, x), l)
[tensor([1.1000, 1.0000]), tensor([1., 0.])]
>>> derivative(1, lambda x: taylor(1, l, h, x), x)
[tensor([1.1000, 1.0000]),
 tensor([[1.0000, 0.1000],
         [0.0000, 1.0000]])]
derivative((1, 1), lambda l, x: taylor(1, l, h, x), l, x)
[[tensor([1.1000, 1.0000]),
  tensor([[1.0000, 0.1000],
          [0.0000, 1.0000]])],
 [tensor([1., 0.]),
  tensor([[-0., 1.],
          [-0., -0.]])]]