In [1]:
import scipy.integrate
import scipy.sparse
import numpy as np
import collections
import matplotlib.pyplot as plt
%matplotlib inline
from copy import deepcopy
from pandas import DataFrame

class IVPResult:
    pass

def solve_ivp(f, ts, x0, p=None, integrator='dopri5', store_trajectory=False,
              sens=False, dfx=None, dfp=None):
    """
    Solve initial value problem
        d/dt x = f(t, x, p);  x(t0) = x0.

    Evaluate Solution at time points specified in ts, with ts[0] = t0.

    Compute sensitivity matrices evaluated at time points in ts if sens=True.
    """

    if sens:
        def f_vode(t, xGxGp, p):
            x     = xGxGp[:x0.shape[0]]
            Gx    = xGxGp[x0.shape[0]:x0.shape[0]+x0.shape[0]*x0.shape[0]]
            Gx    = Gx.reshape([x0.shape[0], x0.shape[0]])
            Gp    = xGxGp[x0.shape[0]+x0.shape[0]*x0.shape[0]:]
            Gp    = Gp.reshape([x0.shape[0], p.shape[0]])
            dx    = f(t, x, p)
            dfxev = dfx(t, x, p)
            dfpev = dfp(t, x, p)
            dGx   = dfxev.dot(Gx)
            dGp   = dfxev.dot(Gp) + dfpev
            return np.concatenate(
                [dx,
                 dGx.reshape(-1),
                 dGp.reshape(-1)])

        ivp = scipy.integrate.ode(f_vode)
    else:
        ivp = scipy.integrate.ode(f)

    ivp.set_integrator(integrator)

    if store_trajectory:
        times = []
        points = []
        def solout(t, x):
            if len(times) == 0 or t != times[-1]:
                times.append(t)
                points.append(np.copy(x[:x0.shape[0]]))
        ivp.set_solout(solout)

    if sens:
        ivp.set_initial_value(np.concatenate(
            [x0,
             np.eye(x0.shape[0]).reshape(-1),
             np.zeros([x0.shape[0], p.shape[0]]).reshape(-1)
            ]), ts[0])
    else:
        ivp.set_initial_value(x0, ts[0])
    ivp.set_f_params(p)

    result = IVPResult()
    result.ts = ts
    result.xs  = np.zeros([ts.shape[0], x0.shape[0]])
    if sens:
        result.Gxs = np.zeros([ts.shape[0], x0.shape[0], x0.shape[0]])
        result.Gps = np.zeros([ts.shape[0], x0.shape[0], p.shape[0]])
    result.success = True

    result.xs[0,:] = x0
    
    #meine Vermutung:
    if sens:
        result.Gxs[0,:,:] = np.eye(x0.shape[0])
        
    for ii in range(1,ts.shape[0]):
        ivp.integrate(ts[ii])
        result.xs[ii,:]    = ivp.y[:x0.shape[0]]
        if sens:
            result.Gxs[ii,:,:] = ivp.y[x0.shape[0]:x0.shape[0]+x0.shape[0]*x0.shape[0]].reshape([x0.shape[0], x0.shape[0]])
            result.Gps[ii,:,:] = ivp.y[x0.shape[0]+x0.shape[0]*x0.shape[0]:].reshape([x0.shape[0], p.shape[0]])
        if not ivp.successful():
            result.success = False
            break

    if store_trajectory:
        result.trajectory_t = np.array(times)
        result.trajectory_x = np.array(points)

    return result

In [2]:
def dX_dt(t, X, p): #predator-prey DEs
    R = X[0]
    F = X[1]
    alpha, beta, gamma, delta = p
    dRdt = alpha * R - beta * F * R
    dFdt = gamma * R * F - delta * F
    return np.array([dRdt,dFdt])

def dfx(t, X, p):

    R = X[0]
    F = X[1]
    alpha, beta, gamma, delta = p
    return np.array([alpha - beta * F, - beta * R, gamma * F,\
                            gamma * R -  delta]).reshape((2, 2))

def dfp(t, X, p):
    R = X[0]
    F = X[1]
    alpha, beta, gamma, delta = p

    return np.array([[R, - F * R, 0., 0.],[0., 0.,  R * F, -F]])

In [75]:
# delta x should be a vector of dimension equal to the number
# of variables, which is true only if we do not change the parameters.
def evaluate_multiple_shooting(f, dfx, dfp, meas_times, meas_values, s_guesses, p):
    F2 = deepcopy(s_guesses[1:])
    m, nx = s_guesses.shape
    J2 = -1 * np.eye((m-1)*nx, m*nx+len(p), k=nx)
    for i in range(m-1):
        meas_times_interval = meas_times[i:i+2]
        s0 = deepcopy(s_guesses[i])

        temp_result = solve_ivp(f, meas_times_interval, s0, p=p, sens=True, dfx=dfx, dfp=dfp)
        F2[i] -= temp_result.xs[1]
        '''print(F2[i].shape)'''
        J2[i*nx:(i+1)*nx,i*nx:(i+1)*nx] = temp_result.Gxs[1]
        J2[i*nx:(i+1)*nx,-len(p):] = temp_result.Gps[1]
        #print('m = ', i)
        #print(temp_result.Gxs[1])
    F1 = meas_values - s_guesses
    J1 = np.eye(m * nx, nx*m + len(p))
    print(F2)
    return F1.flatten(), -F2.flatten(), -J1, J2

In [76]:
def gauss_newton(F_J, s_guesses, param, meas_times, meas_values, itmax=100, tol=1e-7, verbose=1):
    m, nx = s_guesses.shape
    tau = 1.
    if verbose == 1:
        print("Start gauss_newton with itmax=",itmax,"and tol=",tol,"and tau=",tau)
        Fs = np.zeros(itmax+1)
    i = 0
    norm = tol+1.0
    dx_prev = 1
    while i<itmax and norm > tol:
        F1, F2, J1, J2 = F_J(dX_dt, dfx, dfp, meas_times, meas_values, s_guesses, param)
        print(F2)
        A = np.vstack((np.hstack((J1.T.dot(J1), J2.T)), np.hstack((J2,np.zeros((J2.shape[0],J2.shape[0]))))))
        b = (-1)*np.hstack((J1.transpose().dot(F1),F2))
        Dx = np.linalg.lstsq(A, b)[0][:J1.shape[1]]
        #print(Dx[:-len(param)])
        param += tau * Dx[-len(param):]
        s_increase = Dx[:-len(param)].reshape((m, nx))
        norm = np.linalg.norm(Dx)
        
        s_guesses += tau * s_increase
        i += 1
        print('Iteration:', i)
        print('|F1|', np.linalg.norm(F1))
        print('|F2|', np.linalg.norm(F2))
        print('|Dx|', np.linalg.norm(Dx))
        print('|k|', np.linalg.norm(Dx) / np.linalg.norm(dx_prev))
        dx_prev = deepcopy(Dx)
        
        '''
        print('Dx')
        print(Dx)
        print('s_incr')
        print(s_increase)
        print('s_guess')
        print(s_guesses)
        print('dp')
        print(Dx[-len(param):])
        print(param)
        '''
        
        
    return s_guesses, param

In [77]:
np.random.seed(31)
meas_times = np.arange(21) * 5
noise = 5. * np.random.rand(21, 2)
s0_init = np.array([20., 10.])
param_init = np.array((.2, .01, .001, .1))
result = solve_ivp(dX_dt, meas_times, s0_init, p=param_init) #just to create the measurements
meas_values = result.xs + noise


print("Initial values close to the correct parameters:")
# We start with an alpha variation ftom the true values 
alpha = .01
s_guesses = deepcopy(meas_values)
#as given in the exercise we use the measurements at the grid points as guesses for the initial values
param = param_init * (1 + alpha * np.random.rand(len(param_init.shape))) 

s0, param = gauss_newton(evaluate_multiple_shooting, s_guesses,np.zeros(4),meas_times,meas_values)

print('relative  error')
print((param - param_init) / param_init)
print((s0 - s0_init)/ s0_init, '\n')
print('estimated parameter vs true ones')
print(param)
print(param_init)


Initial values close to the correct parameters:
Start gauss_newton with itmax= 100 and tol= 1e-07 and tau= 1.0
[[  1.82842013e+01  -2.92029695e+00]
 [  3.32975905e+01  -5.74269223e+00]
 [  8.12224298e+01  -1.69890128e-01]
 [  1.30810724e+02   6.67171886e+00]
 [  2.80065717e+01   1.98823200e+01]
 [ -2.14187285e+02   2.00874783e+01]
 [ -7.26363620e+01  -1.21269625e+01]
 [ -1.01321925e+01  -1.39090565e+01]
 [ -1.61104451e+00  -4.86096162e+00]
 [  4.64491366e+00  -9.26733596e+00]
 [  1.33585852e+01  -7.47836898e-01]
 [  2.98560510e+01  -4.65203025e+00]
 [  6.36180352e+01   3.19443397e+00]
 [  1.21862690e+02  -1.00435582e+00]
 [  9.58148162e+01   1.55144004e+01]
 [ -2.00749939e+02   2.80193816e+01]
 [ -1.08261118e+02  -8.36978777e+00]
 [ -1.67074194e+01  -1.47546413e+01]
 [ -4.80728866e+00  -1.02226633e+01]
 [  4.42946350e+00  -2.51218812e+00]]
[ -1.82842013e+01   2.92029695e+00  -3.32975905e+01   5.74269223e+00
  -8.12224298e+01   1.69890128e-01  -1.30810724e+02  -6.67171886e+00
  -2.80065717e+01  -1.98823200e+01   2.14187285e+02  -2.00874783e+01
   7.26363620e+01   1.21269625e+01   1.01321925e+01   1.39090565e+01
   1.61104451e+00   4.86096162e+00  -4.64491366e+00   9.26733596e+00
  -1.33585852e+01   7.47836898e-01  -2.98560510e+01   4.65203025e+00
  -6.36180352e+01  -3.19443397e+00  -1.21862690e+02   1.00435582e+00
  -9.58148162e+01  -1.55144004e+01   2.00749939e+02  -2.80193816e+01
   1.08261118e+02   8.36978777e+00   1.67074194e+01   1.47546413e+01
   4.80728866e+00   1.02226633e+01  -4.42946350e+00   2.51218812e+00]
Iteration: 1
|F1| 0.0
|F2| 401.868915645
|Dx| 198.953438657
|k| 198.953438657
[[ -5.78913638e+00  -1.60122791e+00]
 [ -1.06917355e+01  -1.26063080e+00]
 [  1.43380823e+00  -3.54784507e-01]
 [  2.85841667e+01  -1.09903631e+00]
 [  3.60064587e+01  -1.21199397e+00]
 [ -2.79134673e+01   3.64276210e+00]
 [  1.16431106e-02  -1.74750885e+00]
 [  9.19861417e+00  -1.33647690e+00]
 [  5.61372221e+00  -3.08762588e-01]
 [ -6.61086429e-01  -1.39070857e+00]
 [ -2.78623691e+00  -1.10304590e-01]
 [ -7.23587248e+00  -7.68244042e-01]
 [  1.94808402e-01   4.90634740e-02]
 [ -1.03027349e+01   2.97281954e-01]
 [  3.77710737e+01   1.26053349e+00]
 [ -4.42927485e+01   6.48038413e+00]
 [ -4.31441592e+01  -3.53002760e-01]
 [ -1.01847307e+01  -1.07513295e-01]
 [ -4.07447659e+00   7.83358345e-01]
 [  1.02170006e+00   9.39124953e-01]]
[  5.78913638e+00   1.60122791e+00   1.06917355e+01   1.26063080e+00
  -1.43380823e+00   3.54784507e-01  -2.85841667e+01   1.09903631e+00
  -3.60064587e+01   1.21199397e+00   2.79134673e+01  -3.64276210e+00
  -1.16431106e-02   1.74750885e+00  -9.19861417e+00   1.33647690e+00
  -5.61372221e+00   3.08762588e-01   6.61086429e-01   1.39070857e+00
   2.78623691e+00   1.10304590e-01   7.23587248e+00   7.68244042e-01
  -1.94808402e-01  -4.90634740e-02   1.03027349e+01  -2.97281954e-01
  -3.77710737e+01  -1.26053349e+00   4.42927485e+01  -6.48038413e+00
   4.31441592e+01   3.53002760e-01   1.01847307e+01   1.07513295e-01
   4.07447659e+00  -7.83358345e-01  -1.02170006e+00  -9.39124953e-01]
Iteration: 2
|F1| 198.953331789
|F2| 93.6468546825
|Dx| 190.045143454
|k| 0.955224220985
[[  8.39729518e+00  -1.74293619e-01]
 [  1.88146432e+00  -2.31750751e-02]
 [ -5.63040086e+00   3.68881159e-02]
 [ -2.87092682e+00  -3.52284583e-01]
 [  1.71664656e+01  -3.32753800e-01]
 [ -3.28459049e+01   2.03203600e+00]
 [  1.81848137e+00  -5.13620686e-01]
 [  1.69476912e+00  -5.90211326e-02]
 [  1.54861938e+00  -1.96192007e-02]
 [  1.58398128e+00  -1.17328529e-02]
 [  2.81909580e-01   8.66569988e-03]
 [ -1.52942256e+00   7.62120917e-03]
 [ -2.79178621e+00  -1.41966569e-01]
 [  3.10211298e+00  -6.69460025e-01]
 [  4.51373318e+01  -2.58804082e+00]
 [ -2.19546409e-02   2.64905171e+00]
 [ -1.64664331e+01   2.02895985e-01]
 [ -1.17986916e+00  -1.75333943e-02]
 [ -1.25054080e-03  -1.37578260e-03]
 [ -1.66741540e-01  -9.93252789e-03]]
[ -8.39729518e+00   1.74293619e-01  -1.88146432e+00   2.31750751e-02
   5.63040086e+00  -3.68881159e-02   2.87092682e+00   3.52284583e-01
  -1.71664656e+01   3.32753800e-01   3.28459049e+01  -2.03203600e+00
  -1.81848137e+00   5.13620686e-01  -1.69476912e+00   5.90211326e-02
  -1.54861938e+00   1.96192007e-02  -1.58398128e+00   1.17328529e-02
  -2.81909580e-01  -8.66569988e-03   1.52942256e+00  -7.62120917e-03
   2.79178621e+00   1.41966569e-01  -3.10211298e+00   6.69460025e-01
  -4.51373318e+01   2.58804082e+00   2.19546409e-02  -2.64905171e+00
   1.64664331e+01  -2.02895985e-01   1.17986916e+00   1.75333943e-02
   1.25054080e-03   1.37578260e-03   1.66741540e-01   9.93252789e-03]
Iteration: 3
|F1| 51.6001800569
|F2| 62.0265532618
|Dx| 54.9161566382
|k| 0.288963746403
[[ 0.11698016 -0.1093408 ]
 [ 0.82688502 -0.08900483]
 [ 1.48173523 -0.02704881]
 [-0.6909236   0.34245408]
 [-1.5179329  -0.02071207]
 [-1.52451781  0.02479934]
 [ 0.3037933  -0.07758242]
 [-0.06254335  0.02997725]
 [ 0.05589424 -0.0355051 ]
 [ 0.27478307 -0.08331444]
 [ 0.61661636 -0.10869774]
 [ 1.11896253 -0.11683088]
 [ 1.74482475 -0.07068788]
 [ 0.76413475  0.20559363]
 [-3.22191914  0.43215857]
 [-4.38555761  0.39092895]
 [ 0.39614963  0.29559771]
 [-0.86978158 -0.34316931]
 [-0.68366599 -0.22372303]
 [-0.58893351 -0.16274372]]
[-0.11698016  0.1093408  -0.82688502  0.08900483 -1.48173523  0.02704881
  0.6909236  -0.34245408  1.5179329   0.02071207  1.52451781 -0.02479934
 -0.3037933   0.07758242  0.06254335 -0.02997725 -0.05589424  0.0355051
 -0.27478307  0.08331444 -0.61661636  0.10869774 -1.11896253  0.11683088
 -1.74482475  0.07068788 -0.76413475 -0.20559363  3.22191914 -0.43215857
  4.38555761 -0.39092895 -0.39614963 -0.29559771  0.86978158  0.34316931
  0.68366599  0.22372303  0.58893351  0.16274372]
Iteration: 4
|F1| 14.1712860752
|F2| 6.75452976949
|Dx| 5.17698389602
|k| 0.0942706884993
[[-0.00050874  0.00030755]
 [-0.00029535  0.00016449]
 [ 0.00815824  0.00024463]
 [ 0.00846836  0.00254067]
 [-0.00987122  0.00398747]
 [-0.03222327  0.00842613]
 [-0.00435003  0.00212988]
 [ 0.00253793 -0.00073322]
 [-0.00093496 -0.00255957]
 [-0.0091658  -0.00231484]
 [-0.01631428 -0.00146305]
 [-0.01954315 -0.00079175]
 [-0.01199292 -0.00093602]
 [ 0.02484791 -0.00300338]
 [ 0.08420464 -0.00776414]
 [-0.00060775  0.0068244 ]
 [-0.00382111  0.00341609]
 [ 0.00327001 -0.00094796]
 [-0.00561819 -0.00177078]
 [-0.00772833 -0.00170552]]
[ 0.00050874 -0.00030755  0.00029535 -0.00016449 -0.00815824 -0.00024463
 -0.00846836 -0.00254067  0.00987122 -0.00398747  0.03222327 -0.00842613
  0.00435003 -0.00212988 -0.00253793  0.00073322  0.00093496  0.00255957
  0.0091658   0.00231484  0.01631428  0.00146305  0.01954315  0.00079175
  0.01199292  0.00093602 -0.02484791  0.00300338 -0.08420464  0.00776414
  0.00060775 -0.0068244   0.00382111 -0.00341609 -0.00327001  0.00094796
  0.00561819  0.00177078  0.00772833  0.00170552]
Iteration: 5
|F1| 11.9155169107
|F2| 0.101242341385
|Dx| 0.442795006025
|k| 0.0855314628979
[[  2.70430027e-05   2.21695905e-07]
 [  3.01201733e-05   1.36926216e-07]
 [  2.38012756e-05   4.16515582e-07]
 [ -2.91033296e-05   1.69273620e-06]
 [ -4.36548152e-05  -1.67995446e-05]
 [  5.79297298e-06  -1.79762881e-05]
 [ -5.10609058e-05  -1.26678322e-06]
 [ -1.94431646e-05   4.43654805e-07]
 [ -1.05643216e-05   6.77771112e-07]
 [ -8.52704127e-06   8.55061884e-07]
 [ -7.27855854e-06   9.95348566e-07]
 [ -4.88042609e-06   1.16879442e-06]
 [  1.75936009e-07   1.50057353e-06]
 [  9.99092359e-06   2.42359342e-06]
 [  3.93903057e-05   5.07179753e-06]
 [ -2.58476285e-06   6.33809248e-06]
 [ -2.49111281e-05  -6.33181151e-06]
 [ -8.21337527e-06  -3.61829841e-06]
 [ -1.47971616e-06  -2.07017229e-06]
 [  2.12444813e-06  -2.13052527e-06]]
[ -2.70430027e-05  -2.21695905e-07  -3.01201733e-05  -1.36926216e-07
  -2.38012756e-05  -4.16515582e-07   2.91033296e-05  -1.69273620e-06
   4.36548152e-05   1.67995446e-05  -5.79297298e-06   1.79762881e-05
   5.10609058e-05   1.26678322e-06   1.94431646e-05  -4.43654805e-07
   1.05643216e-05  -6.77771112e-07   8.52704127e-06  -8.55061884e-07
   7.27855854e-06  -9.95348566e-07   4.88042609e-06  -1.16879442e-06
  -1.75936009e-07  -1.50057353e-06  -9.99092359e-06  -2.42359342e-06
  -3.93903057e-05  -5.07179753e-06   2.58476285e-06  -6.33809248e-06
   2.49111281e-05   6.33181151e-06   8.21337527e-06   3.61829841e-06
   1.47971616e-06   2.07017229e-06  -2.12444813e-06   2.13052527e-06]
Iteration: 6
|F1| 11.9852270441
|F2| 0.000106491446535
|Dx| 0.0067820294883
|k| 0.0153164091646
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-77-814dc76ca1b7> in <module>()
     15 param = param_init * (1 + alpha * np.random.rand(len(param_init.shape)))
     16 
---> 17 s0, param = gauss_newton(evaluate_multiple_shooting, s_guesses,np.zeros(4),meas_times,meas_values)
     18 
     19 print('relative  error')

<ipython-input-76-4e838de094f8> in gauss_newton(F_J, s_guesses, param, meas_times, meas_values, itmax, tol, verbose)
      9     dx_prev = 1
     10     while i<itmax and norm > tol:
---> 11         F1, F2, J1, J2 = F_J(dX_dt, dfx, dfp, meas_times, meas_values, s_guesses, param)
     12         print(F2)
     13         A = np.vstack((np.hstack((J1.T.dot(J1), J2.T)), np.hstack((J2,np.zeros((J2.shape[0],J2.shape[0]))))))

<ipython-input-75-f6aeb76fc862> in evaluate_multiple_shooting(f, dfx, dfp, meas_times, meas_values, s_guesses, p)
      9         s0 = deepcopy(s_guesses[i])
     10 
---> 11         temp_result = solve_ivp(f, meas_times_interval, s0, p=p, sens=True, dfx=dfx, dfp=dfp)
     12         F2[i] -= temp_result.xs[1]
     13         '''print(F2[i].shape)'''

<ipython-input-1-ab15659e7573> in solve_ivp(f, ts, x0, p, integrator, store_trajectory, sens, dfx, dfp)
     79 
     80     for ii in range(1,ts.shape[0]):
---> 81         ivp.integrate(ts[ii])
     82         result.xs[ii,:]    = ivp.y[:x0.shape[0]]
     83         if sens:

/home/lorenzo/anaconda3/lib/python3.6/site-packages/scipy/integrate/_ode.py in integrate(self, t, step, relax)
    430             self._y, self.t = mth(self.f, self.jac or (lambda: None),
    431                                   self._y, self.t, t,
--> 432                                   self.f_params, self.jac_params)
    433         except SystemError:
    434             # f2py issue with tuple returns, see ticket 1187.

/home/lorenzo/anaconda3/lib/python3.6/site-packages/scipy/integrate/_ode.py in run(self, f, jac, y0, t0, t1, f_params, jac_params)
   1088     def run(self, f, jac, y0, t0, t1, f_params, jac_params):
   1089         x, y, iwork, istate = self.runner(*((f, t0, y0, t1) +
-> 1090                                           tuple(self.call_args) + (f_params,)))
   1091         self.istate = istate
   1092         if istate < 0:

<ipython-input-1-ab15659e7573> in f_vode(t, xGxGp, p)
     23 
     24     if sens:
---> 25         def f_vode(t, xGxGp, p):
     26             x     = xGxGp[:x0.shape[0]]
     27             Gx    = xGxGp[x0.shape[0]:x0.shape[0]+x0.shape[0]*x0.shape[0]]

KeyboardInterrupt: 

In [71]:
for l in range(20):
    x0 = s0[l]
    ts = np.array([meas_times[l], meas_times[l+1]])
    result = solve_ivp(dX_dt, ts, x0, p=param, integrator='dopri5', store_trajectory=True,
                       sens=True, dfx=dfx, dfp=dfp)
    plt.plot(result.trajectory_t, result.trajectory_x)



In [11]:
s_guesses[1:], s_guesses


Out[11]:
(array([[  36.83448335,    7.76473028],
        [  73.53176179,    6.13866246],
        [ 152.23507439,    6.33884946],
        [ 287.27378968,   11.02157628],
        [ 313.24917114,   32.58697002],
        [  99.09185411,   53.00660143],
        [  27.6353132 ,   42.07988506],
        [  14.70215888,   28.33591708],
        [  13.63835571,   18.55647669],
        [  18.38693594,   12.26248246],
        [  31.33982697,    8.43862348],
        [  61.20024424,    6.40439282],
        [ 126.57644945,    6.05288722],
        [ 249.86569144,    8.97137822],
        [ 340.69864186,   24.61379793],
        [ 144.12035349,   51.79460623],
        [  36.21641992,   45.86607384],
        [  16.26291264,   31.50756899],
        [  13.3276082 ,   20.68354717],
        [  16.57954481,   13.60108301]]),
 array([[  20.70230311,   11.08363377],
        [  36.83448335,    7.76473028],
        [  73.53176179,    6.13866246],
        [ 152.23507439,    6.33884946],
        [ 287.27378968,   11.02157628],
        [ 313.24917114,   32.58697002],
        [  99.09185411,   53.00660143],
        [  27.6353132 ,   42.07988506],
        [  14.70215888,   28.33591708],
        [  13.63835571,   18.55647669],
        [  18.38693594,   12.26248246],
        [  31.33982697,    8.43862348],
        [  61.20024424,    6.40439282],
        [ 126.57644945,    6.05288722],
        [ 249.86569144,    8.97137822],
        [ 340.69864186,   24.61379793],
        [ 144.12035349,   51.79460623],
        [  36.21641992,   45.86607384],
        [  16.26291264,   31.50756899],
        [  13.3276082 ,   20.68354717],
        [  16.57954481,   13.60108301]]))

In [12]:
F1


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-12-c9d2301d915a> in <module>()
----> 1 F1

NameError: name 'F1' is not defined

In [ ]: