sixPointsChebyshev.py

#
# Six points aux abscisses de Chebyshev
# Vincent Legat - 2018
# Ecole Polytechnique de Louvain
#


from numpy import *
import matplotlib 
from matplotlib import pyplot as plt
#from matplotlib.pyplot import *
matplotlib.rcParams['toolbar'] = 'None'
plt.rcParams['figure.facecolor'] = 'white'

#
# -1- Six points aux abscisses de Chebyshev
#

n = 5
X = cos(pi * (2*arange(0,n+1) + 1)/((n+1) * 2)) 
U = [0.2,0.4,0.6,0.7,0.5,0.8]

puh = polyfit(X,U,5) 
x = linspace(-1,1,200)  
uh = polyval(puh,x) 
plt.plot(x,uh,'-b') 
plt.plot(X,U,'or')

plt.plot([x[0],x[-1]],[0,0],'-k')
plt.plot(X,zeros(size(X)),'or')
plt.axis('equal')
plt.axis('off')
plt.figure()

#
# -2- Ajoutons un septième point
#

pu = polyfit([*X,0],[*U,0.3],6) 
u = polyval(pu,x) 
plt.plot(x,u,'-g') 
plt.plot([0],[0.3],'og')

plt.plot(x,uh,'-b') 
plt.plot(X,U,'or')
plt.plot([x[0],x[-1]],[0,0],'-k')
plt.axis('equal')
plt.axis('off')
plt.figure()

#
# -3- Dessinons l'erreur
#

error = u - uh
E = error[0]

plt.plot(x,u,'-g') 
plt.plot([0.0],[0.3],'og') 
plt.plot(x,uh,'-b') 
plt.plot(X,U,'or')
plt.plot([x[0],x[-1]],[0,0],'-k')
plt.plot(x,error,'-r'); 
plt.axis('equal')
plt.axis('off')
plt.figure()

plt.plot(x,error,'-r') 
plt.plot([x[0],x[-1]],[0,0],'-k')
plt.plot(X,zeros(size(X)),'or')
plt.plot([x[0]-0.3,x[0]+0.3],[E,E],'-r')
plt.axis('equal')
plt.axis('off')
plt.figure()

#
# -4- Derivons et divisons l'erreur
#

peh = pu - [0,*puh]
eh = polyval(peh, x)
pdeh = peh * [6,5,4,3,2,1,0]
#pdeh = pdeh[0:-1]
pdeh = pdeh[0:6]
print(pdeh)
deh = polyval(pdeh,x)/6

Xd = roots(pdeh)
Ed = polyval(peh,Xd)
E = Ed[0]

plt.plot([x[0],x[-1]],[0,0],'-k')
plt.plot(x,eh,'-r')
plt.plot(x,deh,'-b')
plt.plot(X,zeros(size(X)),'or',markersize=3.5)
plt.plot(Xd,zeros(size(Xd)),'ob',markersize=3.5)
plt.plot(Xd,Ed,'or',markersize=3.5)
plt.axis('off')
plt.axis('equal')
plt.figure()

#
# -5- Et encore quelques petites manipulations
#
#     On va superposer les deux expressions de l'erreur
#     et la courbe rouge est recouverte par la courbe bleue :-)
#

plt.plot([x[0],x[-1]],[0,0],'-k')
plt.plot(x,E**2-eh**2,'-r')
plt.plot(x,(1-x**2)*(deh**2),'-b')
plt.plot(Xd,zeros(size(Xd)),'ok')
plt.plot([-1,1],[0,0],'or')
plt.axis('off')
plt.axis('equal')


plt.show()