• Non ci sono risultati.

Implementazione in Codice Matlab

A.2 Composizione del Codice

Come anticipato, in questo paragrafo riporteremo il codice Matlab creato a per sviluppare praticamente quanto studiato in questo lavoro. Vedremo la funzione demo principale da lanciare per eseguire una istanza del programma (sottoparagrafo A.2.1), le funzioni che permettono di creare le WAM sulla palla e sul tetraedro unitari (sottoparagrafo A.2.2), quelle che calcolano la matrice di Vandermonde ed i punti di Fekete approssimati (sottoparagra-fo A.2.3) e infine altre funzioni necessarie allo svolgimento del programma (sottoparagrafo A.2.4).

A.2 Composizione del Codice 69

A.2.1 File Principale demo3DWAM

Riportiamo il codice del file principale demo3DWAM.m, che dopo aver chiesto il grado della WAM (e dei punti di fekete), il tipo di dominio su cui lavorare e la funzione da approssimare (per una lista delle funzioni si veda la Tabella 4.1). Questi crea una WAM di grado n sul dominio introdotto, calcola i Pun-ti di Fekete ApprossimaPun-ti estratPun-ti da tale WAM e li stampa a video insieme alle statistiche generali dell’esecuzione, appoggiandosi alle routine descritte nei sottoparagrafi A.2.2 e A.2.3. Infine calcola gli errori commessi nell’ap-prossimazione e altri parametri servendosi della routine demo3DWAMstats.m (sottoparagrafo A.2.4).

%---% MAIN FUNCTION demo3DWAM

%---function demo3DWAM

%---% n : APPROXIMATE WAM AND FEKETE POINTS DEGREE.

%---n = i%---nput(’\%---n \%---n \%---n >> I%---nsert WAM degree: ’);

% n must be even if (mod(n,2)==1)

n = n+1;

fprintf(’\n \n \t >> !!! WARNING !!!’);

fprintf(’\n \t n must be even. n set to %d’, n); fprintf(’\n \n’);

end

%---% WAM_type : DOMAIN OF THE FUNCTION.

% Choice of WAM’s range % 0 = ball, 1 = tetrahedron.

%---WAM_type = input(’\n >> Insert WAM type (0=ball, 1=tetrahedron): ’);

%---% CHOICE OF TEST-FUNCTION TO BE APPROXIMATED

%---function_type = input(’\n >> Insert function type (1,...,15): ’);

%---% WAM CREATION.

%---70 Implementazione in Codice Matlab

[WAM, polcont, cardWAM] = create3DWAM(n,WAM_type); [x,y,z] = dispmesh3(WAM); plot3( x, y, z, ’ko’ ); V = chebvand3d(n,WAM,polcont); hold on; %---% INTERPOLATION. %---[pts_fek,ind,C,P]=computing_fekete_points(WAM,V); num_pts_fek=length(pts_fek); [xx,yy,zz] = dispmesh3(pts_fek); plot3( xx, yy, zz, ’g.’ ); hold off;

% VANDERMONDE FOR INTP AT APPR. FEKETE PTS. V_fek=chebvand3d(n,pts_fek,polcont); %FUNCTION VALUES AT THE WAM

f_fek=fct3D(pts_fek(:,1),pts_fek(:,2),pts_fek(:,3),function_type); % SOLVING LINEAR SYSTEM TO COMPUTE INTP. COEFFICIENTS.

coeffs_fek=V_fek\f_fek;

%---% BASICS STATISTICS.

%---fprintf(’\n \n \t >> STATS. \n’);

fprintf(’\n \t [WAM TYPE]: %d’, WAM_type); fprintf(’\n \t [WAM DEGREE]: %d’, n);

fprintf(’\n \t [WAM CARDINALITY]: %d’, cardWAM);

fprintf(’\n \t [NUMBER OF FEKETE POINTS]: %d’, num_pts_fek); fprintf(’\n ’);

%---% LEAST-SQUARES POLYNOMIAL.

%---% COMPUTING LEAST-SQUARES AT WAM POINTS.

% VANDERMONDE FOR INTP AT WAM POINTS. V_ls= V;

% FUNCTION EVALUATION.

f_nodes=fct3D(x,y,z,function_type)’; % LEAST SQUARE SOLUTION BY ITERATION. coeffs_ls=P*((V_ls*P)\f_nodes);

A.2 Composizione del Codice 71

% ROUTINE THAT COMPUTES ERRORS, CONSTANTS AND PRINTS STATS.

demo3DWAMstats(n,WAM_type,function_type,C,P,ind,V_ls,coeffs_fek,coeffs_ls);

A.2.2 Creazione delle WAM

In questo paragrafo scopriamo il codice dei file dispmesh3.m, che presi in input il grado e il tipo di WAM che si vuole costruire, chiama la funzio-ne preposta a crearla, funzio-nel nostro caso WAMtetra.m per il tetraedro unitario e WAMball.m per la palla unitaria.1 Il codice del primo file `e riportato in calce, mentre quello relativo alla costruzione della palla `e omesso in quanto simile. Omettiamo anche il codice di dispmesh3.m, essendo essenzialmente una semplice funzione che data una matrice M ∈ Rm×3 restituisce tre vet-tori contenenti rispettivamente le prime, seconde e terze componenti della matrice.

FUNZIONE create3DWAM(n,WAMtype)

%---% FUNZIONE create3DWAM

%---function [WAM, polcont, cardWAM] = create3DWAM(n,WAMtype)

switch WAMtype case 0

[WAM, polcont, cardWAM] = WAMball(n);

case 1

[WAM, polcont, cardWAM] = WAMtetra(n); end

1E per`` o possibile aggiungere facilmente nuovi domini al programma grazie alla presenza di questo file, aggiungendo una voce allo switch e indirizzando i parametri passati al file che costruisce la WAM.

72 Implementazione in Codice Matlab

%---% FUNCTION WAMtetra

%---function [WAM, polcont, cardWAM] = WAMtetra(n)

t=[];

num_points = 0; for l=0:n

pl=(l*pi)/(2*n);

% We now ignore points such that k=0, i.e. t_k = 0 that would be % inopportune ripetizioni pointless repetitions of points lying on the % z-axis. They’ll be added later at (*).

for k=1:n

tk = (k*pi)/(2*n);

% We now ignore points such that j=n, i.e. r_j=cos(pi/2) = 0 % that would be pointless repetitions of the centre.

for j=0:(n-1)

rj = cos((j*pi)/(2*n));

t=[t; (rj*sin(tk)*cos(pl))^2 (rj*sin(tk)*sin(pl))^2 (rj*cos(tk))^2]; num_points = num_points+1;

end end end % (*)

% Points previously ignored are now included. for j = 0:n rj = cos((j*pi)/(2*n)) ; t=[t; 0 0 rj]; end cardWAM = num_points + n+1; WAM=t; polcont =[0 1 0 1 0 1];

A.2.3 Creazione e ortogonalizzazione della Matrice di Van-dermonde, calcolo dei Punti di Fekete Approssimati

Vediamo due routine essenziali per il nostro programma: chebvand3d.m, che data una mesh An calcola la Matrice di Vandermonde nella base di Chebyshev-prodotto in tre variabili su un parallelepipedo contenente la mesh (si veda il paragrafo 4.2) e computing fekete points.m (piccola modifica di una routine di Sommariva) che presi in input un insieme di punti Aned una matrice di Vandermonde associata, effettua una doppia ortogonalizzazione numerica di quest’ultima e calcola i Punti di Fekete Approssimati estratti

A.2 Composizione del Codice 73

da Anrestituendoli insieme alla matrice ortogonalizzata e a quelle di cambio di base utilizzate nel processo.

%---% FUNCTION chebvand3d

%---function V = chebvand3d(deg,mymesh,paral);

%---% Triples with length less or equal to deg

%---j=(0:1:deg);

[j1,j2,j3]=meshgrid(j,j,j);

good=find(j1(:)+j2(:)+j3(:)<deg+1); triples=[j1(good) j2(good) j3(good)];

%---% Mapping the mesh in the cube [-1,1]^3

%---a=paral(1);b=paral(2); c=paral(3);d=paral(4); e=paral(5);f=paral(6); map=[(2*mymesh(:,1)-b-a)/(b-a) (2*mymesh(:,2)-d-c)/(d-c) ... (2*mymesh(:,3)-f-e)/(f-e)]; %---%Chebyshev-Vandermonde matrix at the mesh

%---V1=cos(triples(:,1)*acos(map(:,1)’)); V2=cos(triples(:,2)*acos(map(:,2)’)); V3=cos(triples(:,3)*acos(map(:,3)’)); V=((V1.*V2).*V3)’; %---% FUNCTION computing_fekete_points %---function [pts_fek,ind,C,P]=computing_fekete_points(pts_wam,V_wam)

% niter: NUMBER OF TIMES THAT THE DISCRETE ORTHOGONALIZATION PROCESS TAKES % PLACE. IF niter=0 THEN NO DISCRETE ORTHOGONALIZATION.

74 Implementazione in Codice Matlab B=V_wam; P=eye(length(V_wam(1,:))); for it=1:niter, [Q,R]=qr(B,0); U=inv(R); B=B*U; P=P*U; end; C=B’; %************************************************************************** % IMPORTANT: At this point "C = P’*V_wam’" (theroretically but not

% numerically!). %

% Instead of V_wam’w=m, we intent to solve the theoretically % equivalent linear system (B*inv(P))’*w=m.

%************************************************************************** m=ones(size(V_wam,2),1);

m=P’*m;

% QR METHOD. w=C\m;

%indexes of the nonzero weights ind=find(abs(w)>0);

pts_fek=pts_wam(ind,:);

A.2.4 Routine aggiuntive

Evitiamo di inserire il codice relativo agli ultimi due file: fct3D.m `e essen-zialmente una routine che presi un vettore di punti ed una funzione calcola il valore di una funzione sui punti dati, mentre demoWAMstats.m `e una leg-gera modifica del codice gi`a scritto da Sommariva, che calcola l’errore in norma infinito commesso approssimando una funzione ai minimi quadrati sulla WAM di un dominio o interpolandola sui pundi di Fekete Approssima-ti estratApprossima-ti da essa. Il codice stampa inoltre a video un riassunto dei valori calcolati.

Bibliografia

[1] L. Bos, J.P. Calvi, N. Levenberg, A. Sommariva e M. Vianello Geome-tric Weakly Admissible Meshes, Discrete Least Squares Approximation and Approximate Fekete Points, Math. Comp. (2009), to appear. [2] L. Bos e N. Levenberg, On the Calculation of Approximate Fekete

Points: the Univariate Case, Electron. Trans. Numer. Anal. 30 (2008), 377–397.

[3] J.P. Calvi e N. Levenberg, Uniform approximation by discrete least squares polynomials, J. Approx. Theory 152 (2008), 82–100.

[4] L. Bos, A. Sommariva e M. Vianello, Least-squares polynomial appro-ximation on weakly admissible meshes: disk and triangle (2008), to appear.

[5] V.K. Dzjadyk, S.Ju. Dzjadyk e A.S. Prypik On the asymptotic beha-vior of the Lebesgue constant in trigonometric interpolation, Ukrainian Math. J. 33 (1981), 553–559.

[6] C.F. Dunkl e Y. Xu, Orthogonal polynomials of severals variables, Cambridge University Press (2001).

[7] L.Giraud, J.Langou, M. Rozloznik e J. Van Den Eshof Rounding er-ror analysis of the classical Gram-Schmidt orthogonalization process, Numer. Math. 101 (2005), 87-100. (2008), to appear.

[8] G. Golub e C.F. Van Loan, Matrix Computation, 3rd edition, Johns Hopkins U. Press (1996).

[9] M. Klimek, Pluripotential Theory, Oxford U. Press (1991).

[10] The Mathworks, MATLAB documentation set, 2009 version (disponi-bile online all’indirizzo http://www.mathworks.com).

76 BIBLIOGRAFIA

[11] T.J. Rivlin, An Introduction to the Approximations of Functions, Dover (1969).

[12] A. Sommariva e M. Vianello, Computing approximate Fekete points by QR factorizations of Vandermonde matrices (2008), to appear.

Documenti correlati