In [2]:
h=0.5
f=[sin(x_).n() for x_ in srange(0,pi,h) ]
xdata=[x_ for x_ in srange(0,pi,h) ]
len(xdata)
Out[2]:
In [ ]:
In [3]:
plt_data = point(zip(xdata,f),figsize=4,color='red',size=20)+\
plot(sin(x),(x,0,pi))
plt_data
Out[3]:
In [5]:
df=[]
for i in range(len(xdata)-1):
df.append( (f[i+1]-f[i])/(xdata[i+1]-xdata[i]) )
In [6]:
point(zip(xdata[:-1],df),figsize=4)+plot(cos(x),(x,0,pi),color='red' )
Out[6]:
In [7]:
df=[]
for i in range(1,len(xdata)):
df.append( (f[i]-f[i-1])/(xdata[i]-xdata[i-1]) )
In [8]:
point(zip(xdata[1:],df),figsize=4)+plot(cos(x),(x,0,pi),color='red' )
Out[8]:
In [9]:
df=[]
for i in range(1,len(xdata)-1):
df.append( (f[i+1]-f[i-1])/(xdata[i+1]-xdata[i-1]) )
In [10]:
point(zip(xdata[1:-1],df),figsize=4)+plot(cos(x),(x,0,pi),color='red' )
Out[10]:
Niech $w_n(x)$ będzie wielomianem interpolującym funkcję $f(x)$ w $n+1$ równoodległych punktach na odcinku $[a,b]$. Zachodzi:
$$f'(x)-w'_n(x)=O(h^n).$$
In [82]:
n=3
i=3
pts=zip(xdata[i:i+n],f[i:i+n])
R = PolynomialRing(QQ, 'X') ### X - bedzie generatorem wielomianów nad ciałem liczb wymiernych,
### R - będzie objektem reprezentującym to ciało
L = R.lagrange_polynomial(pts) ### interpolacja Lagrange'a jest zaimplementowana w R
show(L(X=x).expand() )
In [83]:
n=5
pltdf=[]
pltf=[]
R = PolynomialRing(QQ, 'X') # R - będzie objektem reprezentującym to ciało,
# X - bedzie generatorem wielomianów nad ciałem liczb wymiernych,
for i in range(0,len(xdata)-n,n-1):
pts=zip(xdata[i:i+n],f[i:i+n])
L = R.lagrange_polynomial(pts) ### interpolacja Lagrange'a jest zaimplementowana w R
pltdf.append( plot( L(X=x).diff(), (x,xdata[i],xdata[i+n-1]) ) )
pltf.append( plot( L(X=x), (x,xdata[i],xdata[i+n-1]),thickness=3 ) )
In [84]:
i=2
sum(pltdf)+plot(cos(x),(x,0,pi),color='red',figsize=(6,3))+ point( zip(xdata[i:i+n],[0]*n),color='black')
Out[84]:
In [85]:
i=2
sum(pltf)+plot(sin(x),(x,0,pi),color='red',figsize=(6,3))+ point( zip(xdata[i:i+n],f[i:i+n]),color='black')
Out[85]:
In [86]:
L(X=x).expand()
Out[86]:
In [87]:
def roznica_centralna(n=10):
xdata=[(i/(n-1)*pi).n() for i in range(n)]
f=[sin(x) for x in xdata]
df=[]
blad=[]
for i in range(1,len(xdata)-1):
df.append( (f[i+1]-f[i-1])/(xdata[i+1]-xdata[i-1]) )
blad.append ( ( df[-1]-cos(xdata[i]) )^2 )
return sqrt( sum(blad)/n )
def roznica_w_przod(n=10):
xdata=[(i/(n-1)*pi).n() for i in range(n)]
f=[sin(x) for x in xdata]
df=[]
blad=[]
for i in range(0,len(xdata)-1):
df.append( (f[i+1]-f[i])/(xdata[i+1]-xdata[i]) )
blad.append ( ( df[-1]-cos(xdata[i]) )^2 )
return sqrt( sum(blad)/n )
In [ ]:
$$\delta(n)=C h^\alpha=C_2( \frac{1}{n})^\alpha$$
$$\log ( \delta(n) ) =\log(C_2)+\log( \frac{1}{n})^\alpha=C_3+ \alpha\log(\frac{1}{n}) = C_3- \alpha \log(n)$$
In [88]:
point ( [(log(2^n),log( roznica_centralna(2^n) ) ) for n in [2,3,4,5,6]]) +point ( [(log(2^n),log( roznica_w_przod(2^n) ) ) for n in [2,3,4,5,6]],color='red',figsize=(6,4))
Out[88]:
In [89]:
var('a,b')
(a, b)
model(x) = a*x+b
dane=[(log(2^n),log( roznica_w_przod(2^n) ) ) for n in [5,6,7,8]]
print find_fit(dane,model)
dane=[(log(2^n),log( roznica_centralna(2^n) ) ) for n in [5,6,7,8]]
print find_fit(dane,model)
In [90]:
model(x) = x^a*b
dane=[(2^n, roznica_w_przod(2^n) ) for n in [5,6,7,8]]
print find_fit(dane,model)
dane=[((2^n),( roznica_centralna(2^n) ) ) for n in [5,6,7,8]]
print find_fit(dane,model)
In [28]:
Out[28]: