No BSD License  

Highlights from
ChebyshevTools

from ChebyshevTools by Michael Watson
Tool box for solving ODE/PDEs using spectral Chebyshev differentiation matrices.

f=galerkin2cheb(g,typ)
function f=galerkin2cheb(g,typ)

%this function transforms from the galerkin basis to the chebyshev basis
% typ = integer
%   1) Dirichlet/Dirichlet Mason Galerkin
%   2) Dirichlet/Dirichlet Julien Galerkin
%   3) Dirichlet/Dirichlet Trefethen Galerkin
%   4) u=u'=0
%   5) u=u''=0
%   6) Neumann/Neumann
%   7) u'[-1]-u[-1]/-1=u'[1]-u[1]==0  %stress free angular velocity
%   8) u[1]=u[-1]=u''[1]+u'[1]-u[1]=u''[-1]-u'[-1]-u[-1]=0 % stress free velocity potential
%   9) u'[1]=u'[-1]=u'''[1]=u'''[-1]==0 %Neumann/Neumann and third deriv
%   9) u[1]=u[-1]=u''''[1]=u''''[-1]==0 %Dirichlet/Dirichlet and fourth deriv


% % Matrix Method ~ O(N^2)
% switch typ
%     case 1 %Mason
%         A=diag(ones(length(g)+2,1));
%         for j = 3:2:length(g)+1
%            A(1,j)=-1;
%            A(2,j+1)=-1;
%         end
%         if (mod(length(g+2),2)==0)
%             A(2,end)=-1;
%         else
%             A(1,end)=-1;
%         end
%         f=A*[0;0;g];
%     case 2  %Julien
%         A=diag(ones(length(g)+2,1))-diag(ones(length(g),1),2);
%         f=A*[0;0;g];
%     case 3  %Trefethen
%         A=diag(ones(length(g)+2,1))-diag(2*ones(length(g),1),2)+diag(ones(length(g)-2,1),4);
%         A(1,3)=-1;  A(2,4)=-1;% Correct for TO and T1 mode
%         f=A*[0;0;g];
% end

%Direct Solve ~ O(N)
switch typ
    case 1 %Mason: u[1]=u[-1]==0
        a0=0;a1=0;
        for j = 1:2:length(g)-1
           a0=-1*g(j)+a0;
           a1=-1*g(j+1)+a1;
        end
        if mod(length(g),2)==1
           a0=-1*g(end)+a0; 
        end
        f=[a0;a1;g];
    case 2  %Julien: u[1]=u[-1]==0
        f=zeros(length(g)+2,1);
        f(end)=g(end);
        f(end-1)=g(end-1);
        for j=length(g):-1:3
           f(j)=g(j-2)-g(j);
        end
        f(1)=-g(1);
        f(2)=-g(2);
    case 3  %Trefethen: u[1]=u[-1]==0
        f=zeros(length(g)+2,1);
        f(end)=g(end);
        f(end-1)=g(end-1);
        f(end-2)=g(end-2)-2*g(end);
        f(end-3)=g(end-3)-2*g(end-1);
        for j=length(g)-2:-1:3
           f(j)=g(j-2)-2*g(j)+g(j+2);
        end
        f(1)=-g(1)+g(3);
        f(2)=-g(2)+g(4);
    case 4 %u[1]=u[-1]=u'[1]=u'[-1]=0
        L=length(g);
        D=ones(L+4,1);
        L2=[];
           for k=0:L+1;
              L2=[L2,-2*(k+2)/(k+3)]; 
           end
        L4=[];
           for k=0:L-1;
              L4=[L4,(k+1)/(k+3)]; 
           end 
        A=sparse(diag(D))+sparse(diag(L2,-2))+sparse(diag(L4,-4));
        f=A*[g;0;0;0;0];
    case 5 %u[1]=u[-1]=u''[1]=u''[-1]=0
        L=length(g);
        D=ones(L+4,1);
        L2=[];
           for k=0:L+1;
              L2=[L2,-(1+((k+1)*(2*k^2+4*k+3)/((k+3)*(2*k^2+12*k+19))))]; 
           end
        L4=[];
           for k=0:L-1;
              L4=[L4,((k+1)*(2*k^2+4*k+3)/((k+3)*(2*k^2+12*k+19)))]; 
           end 
        A=sparse(diag(D))+sparse(diag(L2,-2))+sparse(diag(L4,-4));
        f=A*[g;0;0;0;0];
     case 6 %u'[1]=u'[-1]==0
        L=length(g);
        D=[1];
           for k=1:L+1;
              D=[D,(k+2)^2/(2*k^2+4*k+4)]; 
           end
        L2=[0];
           for k=1:L-1;
              L2=[L2,-((k)^2)/(2*k^2+4*k+4)]; 
           end 
        A=sparse(diag(D))+sparse(diag(L2,-2));
        f=A*[g;0;0];
      case 7 %u'[-1]-u[-1]/-1=u'[1]-u[1]==0
        L=length(g);
        D=[];
           for k=0:L+1;
              D=[D,((k+2)^2-1)/(2*(k+1)^2)]; 
           end
        L2=[];
           for k=0:L-1;
              L2=[L2,-((k^2-1))/(2*(k+1)^2)]; 
           end            
        A=sparse(diag(D))+sparse(diag(L2,-2));
        f=A*[g;0;0];
      case 8 %u[1]=u[-1]=u''[1]+u'[1]-u[1]=u''[-1]-u'[-1]-u[-1]=0
        L=length(g);
        D=ones(L+4,1);
        L2=[];
           for k=0:L+1;
              L2=[L2,-2*(k+2)*(k^2+4*k+9)/((k+3)*(k^2+6*k+11))]; 
           end
        L4=[];
           for k=0:L-1;
              L4=[L4,(k+1)*(k^2+2*k+3)/((k+3)*(k^2+6*k+11))]; 
           end 
        A=sparse(diag(D))+sparse(diag(L2,-2))+sparse(diag(L4,-4));
        f=A*[g;0;0;0;0];   
      case 9 %u'[1]=u'[-1]=u'''[1]=u'''[-1]==0 %Neumann/Neumann and third deriv
        L=length(g);
        D=ones(L+4,1);
        L2=[];
           for j=0:L+1;
              L2=[L2,(-2*j^2*(11 + 2*j*(4 + j)))/((2 + j)*(3 + j)*...
                 (15 + 2*j*(6 + j)))]; 
           end 
        L4=[];
           for j=0:L-1;
              L4=[L4,(j^2*(1 + j)*(-1 + 2*j*(2 + j)))/ ...
                  ((3 + j)*(4 + j)^2*(15 + 2*j*(6 + j)))]; 
           end 
        A=sparse(diag(D))+sparse(diag(L2,-2))+sparse(diag(L4,-4));
        
        f=A*[g;0;0;0;0];     
     case 10 %u[1]=u[-1]=u''''[1]=u''''[-1]==0 %Dirichlet/Dirchlet and fourth deriv
        L=length(g);
        D=ones(L+4,1);
        D(1)=1;
        L2=[];
           for j=0:L+1;
              L2=[L2,(-2*(210 + j*(4 + j)*(53 + 2*j*(4 + j))))/ ...
                     ((4 + j)*(5 + j)*(21 + 2*j*(6 + j)))]; 
           end 
        L4=[];
           for j=0:L-1;
              L4=[L4,(j*(-5 + j*(1 + 2*j*(1 + j))))/...
                     ((4 + j)*(5 + j)*(21 + 2*j*(6 + j)))]; 
           end 
        A=sparse(diag(D))+sparse(diag(L2,-2))+sparse(diag(L4,-4));
        
        f=A*[g;0;0;0;0];     

end

Contact us at files@mathworks.com