[SciPy-User] Chebeshev Polynomial implimentation python

Charles R Harris charlesr.harris at gmail.com
Mon Dec 20 23:46:58 EST 2010


On Mon, Dec 20, 2010 at 9:17 PM, Charles R Harris <charlesr.harris at gmail.com
> wrote:

>
>
> On Mon, Dec 20, 2010 at 8:55 PM, Eric Carlson <ecarlson at eng.ua.edu> wrote:
>
>> On 12/18/2010 12:35 PM, Pramod wrote:
>> > Matlab imple mentation :
>> > for N = 1:Nmax;
>> > [D,x] = cheb(N);
>> >
>> > How to impliment above (written in matlab ) chebshev  polynomial in
>> > python
>>
>> cheb is not a standard matlab function, but if this is it:
>>
>> function [D,x]=cheb(N)
>>
>> if N==0, D=0; x=1; return; end
>> x=cos(pi*(0:N)/N)';
>> c=[2; ones(N-1,1); 2].*(-1).^(0:N)';
>> X=repmat(x,1,N+1);
>> dX=X-X';
>> D=(c*(1./c)')./(dX+eye(N+1)); % off diagonals
>> D=D-diag(sum(D')); % diagonals
>>
>>
>> Then a python version could be given by:
>>
>> from numpy import cos,pi,linspace,array,matrix,ones,hstack,eye,diag,tile
>>
>> def cheb(N):
>>
>>     if N==0:
>>         D=0.0
>>         x=1.0
>>     else:
>>         x=cos(pi*linspace(0,N,N+1)/N)
>>         c=matrix(hstack(([2.],ones(N-1),[2.]))*(-1)**linspace(0,N,N+1)).T
>>         X=tile(x,[N+1,1])
>>         dX=(X-X.T).T
>>         D=array(c*(1/c).T)/(dX+eye(N+1)); # off diagonals
>>         D=D-diag(sum(D,axis=1)); # diagonals
>>
>>     return D,x
>>
>> (D,x)=cheb(3)
>> print D
>> (D,x)=cheb(4)
>> print D
>>
>>
>> I almost literally translated the matlab code, so I do not know how
>> efficient it all is, and have given zero thought to better ways to do
>> it. You need to be very careful with matrix and array types. Unless you
>> KNOW you want a matrix, you probably want an array. One of the biggest
>> transitions from matlab to python is learning to not worry about whether
>> something is a column or row array, except when you are doing matrix
>> multiplication.
>>
>>
> As a guess, D is the differentiation operator for a function sampled at the
> Chebyshev points of the second kind. So perhaps this is intended as a method
> of solution for a boundary value problem.
>
>
If so, the following brute force method will work.

In [1]: import numpy.polynomial as poly

In [2]: def Cheb(N):
   ...:     x = poly.chebpts2(N+1)
   ...:     D = array([poly.Chebyshev.fit(x,c,N).deriv()(x) for c in
eye(N+1)])
   ...:     return D, x

However, I have a module for this type of use case which I've attached.  I'm
not sure what shape it's in, it's old. The relevant function would be
modified_derivative

Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20101220/a6693790/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: chebyshev.py
Type: text/x-python
Size: 18606 bytes
Desc: not available
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20101220/a6693790/attachment.py>


More information about the SciPy-User mailing list