Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Interpolation basis

1074 views


�eVW�"�@sddlmZmZmZmZmZmZmZmZm	Z	ddl
mZmZm
Z
mZmZmZmZddlmZddlmZddlmZddljZddlmZGdd	�d	�Zdd
dd�Zd
d�dd�ZdS)�)	�array�ones�pi�cos�concatenate�linspace�sin�NaN�shape)�symbols�lambdify�latex�diff�Function�expandr)�implemented_function)�
parse_expr)�dbgN)�	DataFramec@s�eZdZddddgdd�Zdd�Zdd�Zgdd	d
d�Zdd	dd
�Zdd	gdd�Zdd�Z	dS)�Lagrange�cCsd||_td�|_d|_d|_d|_g|_g|_d|_d|_	d|_
dS)N�xr)�pointsrr�f�iF�A�d�dd�
dataFrameD�dataFrameDD�x0)�selfr�r"�F/projects/91f280f0-b3af-42e1-a2e0-ed2660b96906/jupyter/src/lagrange.py�__init__
s								zLagrange.__init__cCs.t|j�dkr't|j�|_t|j�dkr*g}g}t|j�\}}x�t|�D]�}|dkr�|jdtd�d�qj|dkr�|jdtd�d�qj||dkr�|jdtd�d�qj|jd�qjW|j	}t|jd|d	|�|_
dS)
Nr�$zf(x_{i})rzf(x_{i};x_{j})zf(x_{i};...;x_{j})z...�index�columns)�lenrrrrr
�range�appendr
rr)r!r'r&�m�n�ir"r"r#�showInNotebooks 	zLagrange.showInNotebookcCs�|j}t||jd�}|j}t|jd|jd
d�}tj|||�d|||��tjddd	�tj	t
|j�|t
|j���tj�dS)N�numpyrr��o�f(x)�interp f(x)�locz
upper left�����)r2r3)rrrrrr�plt�plot�legend�stemr�show)r!rrr�ar"r"r#r7,s		 %(z
Lagrange.plotz	sin(pi*x)rc
CsPt|�dkr|j}nt|�|_t|�}t|�}t||f�t}t||f�t}|dd�|dd�|ddd�<|j}t|�}	t||	d�}
|
|_	t|t
|	�d�}td|	i�|
|dd��|
|dd��|ddd�<|
|d�}|r�t|�}|dd�|dd�|ddd�<|d}tdt|ddd��||dfi�|j|||ddd|�\}}x�t
t|�dd�d	d�D]�}
xt
|
�D]�}t||d|
��dkr||d|
�dd�||d|
�dd�||
d|d|
�dd�<td
||
|d|d|
�dd�||d|
�||d|
�dd�||d|
�dd�fi�qW||
d	d|
d�||
d	d|
�||
dd|
�<td|
||
ddd�||
d	d|
d�||
d	d|
�fi�|j|||d|
d|�\}}qWtd|||fi�t|ddd�t|
|�g�fd
d�ddd�dd�j|_|jddd�}|dd�}td||fi�|}d}xO|jddd�D]6}|||d}|dd�}|||}q�Wtd|
|d�|fi�t|�}t||d�}||_tt|g�|dd�g�|_|S) a\
        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)")
        rrNr/zlagrangeInterp|part1zlagrangeInterp|part2�j�df�zlagrangeInterp|part3zlagrangeInterp|part4zlagrangeInterp|part5�axiszlagrangeInterp|part6zlagrangeInterp|part7r5r5r5r5r5r5r5r5r5r5r5r5r5r5r5r5)r(r�listrrr	rrrrrr�
ifEqPointsr)r�Trrrr)r!r�func�yr;r,�crr�exprrr=Z
firstElementFr<r-r�XZexprSumZexprMult�ai�gr"r"r#�lagrangeInterp7s^6,		8,
1'+W}GX+
Q 	(zLagrange.lagrangeInterpcCs�d||dd|�kr�||dd|�||dd|�||dd|�<td|||ddd�||ddd�fi�nLxItt||dd|���D]"}||dd|�|dkrs||dd|�|||dd|�|||dd|�|<td||||dd|�|fi�q�|dkr�td�||dd�|�||dd|�|<td||||dd|�|fi�q�W||fS)NrrzifEqPoints|part1zifEqPoints|part21zFATAL ERROR!!!zifEqPoints|part22r5)rr)r(�print)r!r;rErr<r=r-r"r"r#rA�sC@,#O3
14zLagrange.ifEqPointszsin(x)csQ|�_t|�}t|�s6td|dd�}�jd|d|��j}tt|�t|�f��td||fi�xJtt|��D]6}|d�|d<x�tt|��dd�D]�}|dd�|||dd�|�||�|dd�|<td	t��|dt��d|t��d|t��|�|dd�|fi�q�W�|j	�}t
t|g�|dd�g�}td
|i�q�W��fdd�tt�d��dd�D�}td
�|fi�t
�ddd��jfdd��_|S)a�
        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
        
        r r,�rrCzdiffSocket|part1rNzdiffSocket|part21zdiffSocket|part22cs+g|]!}�j|��d|�qS)rr5)�fact)�.0r-)�br!r"r#�
<listcomp>�s	z'Lagrange.diffSocket.<locals>.<listcomp>zdiffSocket|part3r?rr5r5r5r5r5r5r5r5r5)
r rr(�choosingPointsrJrrrr)�copyrrr)r!rCr rr;r-�k�derivr")rOr!r#�
diffSocket�s(		#Lj%6+zLagrange.diffSocketcCs)|dkrdS||j|d�SdS)Nr)rM)r!r,r"r"r#rM�sz
Lagrange.factNr5r5)
�__name__�
__module__�__qualname__r$r.r7rJrArUrMr"r"r"r#r	s�4r�
cs�t|d|d��}tt���}|d�|d�t���fdd�t�d�dd�D��}|d|dkr�||j�}|S)	z$Choose different points near x0
    g�������?r>c
shg|]^}����td|dttd���ttttd����d�qS)r>rg@)rr�float)rNr<)r;rOr,r"r#rPs	z"choosingPoints.<locals>.<listcomp>rNrr5)rrr)�argsort)r r,rr")r;rOr,r#rQs

9rQcCs|S)Nr")rr"r"r#�<lambda>sr\cCs�t|�dkrD||d�||d�t|d|d�St}||dd�|�||dd�|�t|d|d�SdS)Nr>rrr5r5)r(rZ�dividedDifferences)�lrZdDr"r"r#r]s2r])r/rrrrrrrr	r
Zsympyrrr
rrrZsympy.utilities.lambdifyrZsympy.parsing.sympy_parserrZsrc.dbgr�matplotlib.pyplot�pyplotr6�pandasrrrQr]r"r"r"r#�<module>s@4�