# -*- coding: utf-8 -*-
"""
Created on Tue May 22 18:06:51 2012

@author: FRANCES
"""

import numpy as np
import interp
import scipy.interpolate as sinterp
import matplotlib.pyplot as plt
#%%

# interpolazione con le funzioni spline lineare o cubica

f = interp.runge
a = -1
b = 1
xx = np.linspace(a, b, 200)
yy = f(xx)
#%%

n = 4
# liste
error = []
nvet = []
error3 = []

# matrici come structured array (Record array)
# ogni elemento di risultati e' un record
# che contiene 3 oggetti, una stringa di lunghezza 15
# un intero e un float
# si possono indicizzare gli elementi usando 
# i nomi assegnati ai campi del record
risultati = np.zeros((12,), dtype=[('spline', 'S15'),
      ('n', int), ('errore', float)])
 
for i in range(0, 6):    
    xnodi = np.linspace(a, b, n+1)
    fnodi = f(xnodi)
    s1 = sinterp.interp1d(xnodi, fnodi, 1) # 'linear' 
    s3 = sinterp.interp1d(xnodi, fnodi, 3) # 'cubic'   
    ys1 = s1(xx)
    ys3 = s3(xx)
    nvet.append(n)    
    error.append(np.max(np.abs(ys1-yy)))  
    error3.append(np.max(np.abs(ys3-yy)))
    risultati[i]=('lineare', n, error[i])
    risultati[6+i]=('cubica', n, error3[i])
  
    plt.figure(i)
    plt.cla()
    plt.plot(xx, ys1, xnodi, fnodi, 'o', xx, yy, '--')
    plt.title("Spline con %(n)5i nodi" %  {"n":n})  
    plt.show()
    
    n = 2*n
  
   
print ("errore della spline")

# concateniamo le liste creando una matrice 
# con 3 colonne
print (np.concatenate(
 [np.asmatrix(nvet).T,np.asmatrix(error).T,np.asmatrix(error3).T],
  axis=1)  )  
  
# per calcolare il rapporto di convergenza usiamo l'array strutturato:  
np.log2(risultati["errore"][0:5]/risultati["errore"][1:6])
np.log2(risultati["errore"][6:11]/risultati["errore"][7:12])
# per individuare i record relativi solo alla spline cubica:
findcub=risultati["spline"]==b'cubica'
print( risultati[findcub])