Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Interpolation basis

1074 views
�
�eVWc@s�ddlmZmZmZmZmZmZmZmZm	Z	ddl
mZmZm
Z
mZmZmZmZddlmZddlmZddlmZddljZddlmZddd	��YZd
dd�Zd
�d�ZdS(i����(	tarraytonestpitcostconcatenatetlinspacetsintNaNtshape(tsymbolstlambdifytlatextdifftFunctiontexpandR(timplemented_function(t
parse_expr(tdbgN(t	DataFrametLagrangecBsneZddddgd�Zd�Zd�Zgddd�Zddd�Zd	dgd
�Zd�ZRS(i����icCsd||_td�|_d|_d|_d|_g|_g|_d|_d|_	d|_
dS(Ntxi(tpointsR	RtftiFtAtdtddt
dataFrameDtdataFrameDDtx0(tselfR((ssrc/lagrange.pyt__init__
s								cCs4t|j�dkr*t|j�|_nt|j�dkr0g}g}t|j�\}}x�t|�D]�}|dkr�|jdtd�d�qm|dkr�|jdtd�d�qm||dkr�|jdtd�d�qm|jd�qmW|j	}t|jd|d	|�|_
ndS(
Nit$sf(x_{i})isf(x_{i};x_{j})sf(x_{i};...;x_{j})s...tindextcolumns(tlenRRRRRtrangetappendRRR(RR"R!tmtnti((ssrc/lagrange.pytshowInNotebooks 	cCs�|j}t||jd�}|j}t|jd|jdd�}tj|||�d|||��tjd
dd	�tj	t
|j�|t
|j���tj�dS(Ntnumpyii����itosf(x)sinterp f(x)tlocs
upper left(sf(x)sinterp f(x)(RR
RRRRtplttplottlegendtstemRtshow(RRRRta((ssrc/lagrange.pyR.,s		 %(s	sin(pi*x)ic
Cs�t|�dkr|j}nt|�|_t|�}t|�}t||f�t}t||f�t}|d|d |dd*|j}t|�}	t||	d�}
|
|_	t|t
|	�d�}ti|	d6�|
|d�|
|d �|dd*|
|d�}|rSt|�}|d|d |dd*|d}ntit|dd �||dfd6�|j|||ddd|�\}}x�t
t|�dd�d	D]�}
x�t
|
�D]�}t||d
|
��dkr�||d
|
�d||d
|
�d ||
d|d
|
�d*ti||
|d|d
|
�d ||d
|
�||d
|
�d||d
|
�d fd6�q�q�W||
d	d|
d!||
d	|
 ||
d|
*ti|
||
d||
d	d|
d!||
d	|
 fd6�|j|||d|
d|�\}}q�Wti|||fd
6�t|d
d
d�t|
|�g�fdd�d
d
d�d j|_|jd}|}ti||fd6�|}d}xC|jdd D]0}|||d}|d}|||}q
Wti|
|d�|fd6�t|�}t||d�}||_tt|g�|d g�|_|S(s\
        INTUITION PHASE in solving Lagrange interpolation problem:
        STEP 0:
        a[1:]-a[:-1]
        
        a[::2][1:]-a[::2][:-1]
        a[1::2][1:]-a[1::2][:-1]
        
        c[::3][:-1]=a[::3][1:]-a[::3][:-1]
        c[1::3][:-1]=a[1::3][1:]-a[1::3][:-1]
        c[2::3][:-1]=a[2::3][1:]-a[2::3][:-1]
        c[3::3][:-1]=a[3::3][1:]-a[3::3][:-1]
        c[4::3][:-1]=a[4::3][1:]-a[4::3][:-1]
        c[5::3][:-1]=a[5::3][1:]-a[5::3][:-1]
        c[6::3][:-1]=a[6::3][1:]-a[6::3][:-1]
        6=9-3
        
        for i in range(len(a)-1-3):
           c[i::3]=a[i::3][1:]-a[i::3][:-1]
    
        STEP 1:
        c[::9]
        c=d=ones((n+1,n))
        c[0]=a
        c[1]=f
        
        QUESTIONs:
        +c=ones((n+1),n)#i.e lines below
        +c=ones((n+1),n)
        +j from 1 or 2 ?
        +if from 1 what menans i
        
        STEP 5:
        c[0]=a[1:]-a[:-1]
        for j in range(len(a)-1+1)[2:]:
           for i in range(len(a)-1-j+1):
              c[j-1][i::j][:-1]=a[i::j][1:]-a[i::j][:-1]
           d[j+2]=(d[j+1][1:]-d[j+1][:-1])/float(c[j+2])
    
        SOME USEFUL REMARKs:
        f = implemented_function(Function('f'), lambda x: x+1)
        func = lambdify(x, f(x))
        func(4)
        expr=sp.parsing.sympy_parser.parse_expr("sin(x)+x**2")
        sp.diff(expr)
        ff=sp.lambdify(x,sp.diff(expr),"numpy")
        
        TESTS: 
        import src.lagrange as lg
        lg.lagrangeInterp(listX=[pi,2*pi,3*pi,2*pi])
        lg.lagrangeInterp(listX=[0,-2,0.5,2/3.],func='x*sin(pi*x)')
        lg.lagrangeInterp(listX=[-1,-1,1,1],func="sin(pi*x)")
        iii����R*slagrangeInterp|part1slagrangeInterp|part2tjtdfiNslagrangeInterp|part3slagrangeInterp|part4slagrangeInterp|part5taxisslagrangeInterp|part6slagrangeInterp|part7(R#RtlistRRRRRR
RRRt
ifEqPointsR$RtTRRRR(RRtfunctyR2R'tcRRtexprRR4t
firstElementFR3R(RtXtexprSumtexprMulttaitg((ssrc/lagrange.pytlagrangeInterp7s^6		&
,'%Eo8G+
K
!	"cCs�d||d| kry||d| ||d| ||d|*ti|||d||dfd6�nxtt||d| ��D]�}||d| |dkr'||d| |||d| |||d| |<ti||||d| |fd6�q�|dkr;dGHn||d |�||d| |<ti||||d| |fd6�q�W||fS(NiisifEqPoints|part1sifEqPoints|part21sFATAL ERROR!!!i����sifEqPoints|part22(RR$R#(RR2R;RR3R4R(((ssrc/lagrange.pyR7�s1/&=.%/ssin(x)c	
Cs@||_t|�}t|�s9td|dd�}n|jd|d|�|j}tt|�t|�f�}ti||fd6�x(tt|��D]}|d||d<x�tt|��dD]�}|d |||d ||||||d |<tit|�|dt|�d|t|�d|t|�|||d |fd	6�q�W||j	�}t
t|g�|d g�}ti|d
6�q�Wgtt|d��dD]!}|j|�|d|^q�}ti||fd6�t
|ddd�|jfd
d�|_
|S(s�
        DECRCIPTION:
        find len(points)-1 derivation of function func
        
        step1 (find b):
        
        b[n]=a[n]
        for k=n-1,...,1 do
        b[k]=a[k]+(x0-x[k])b[k+1]
        b[1] is f'(x0)
        
        step2:
        a=b
        and try agen step1
        after k+1 steps 
        b[1]=f'(x0),...,b[k]=f^{k}(x0)
        
        INPUT:
        func-whom derivations we want to find
        x0 is point to find derivations in
        points will be generated in small area near x0 as Chebyshev points
        
        questions:
        +x0 from left in points?
        +check array.copy's
        
        RR'iRR9sdiffSocket|part1i����isdiffSocket|part21sdiffSocket|part22sdiffSocket|part3NR5i(RRR#tchoosingPointsRCRRRR$tcopyRtfactRR(	RR9RRR2tbR(tktderiv((ssrc/lagrange.pyt
diffSocket�s(		:eB+cCs)|dkrdS||j|d�SdS(Ni(RF(RR'((ssrc/lagrange.pyRF�s(	t__name__t
__module__RR)R.RCR7RJRF(((ssrc/lagrange.pyR	s		�4ii
cCs�t|d|d|�}tt|��}|d}|d}tgt|d�dD]^}||||td|dttd|��ttttd|���d^qX�}|d|dkr�||j�}n|S(s$Choose different points near x0
    g�������?iig@ii����(RRR$RRtfloattargsort(RR'RR2RGR3((ssrc/lagrange.pyRDs

cCs|S(N((R((ssrc/lagrange.pyt<lambda>scCs�t|�dkrD||d�||d�t|d|d�St}||d|�||d |�t|d|d�SdS(Niiii����(R#RMtdividedDifferences(tlRtdD((ssrc/lagrange.pyRPs2((R*RRRRRRRRRtsympyR	R
RRR
Rtsympy.utilities.lambdifyRtsympy.parsing.sympy_parserRtsrc.dbgRtmatplotlib.pyplottpyplotR-tpandasRRRDRP(((ssrc/lagrange.pyt<module>s@4�