FOURIER OTIMIZADO A função Scilab descrita ao final desse texto (a qual deve ser salva em arquivo com terminação “.sci”) também executa a recuperação de pontos da função “dente de serra” apresentada em aula. Porém, a implementação ora apresentada é extremamente mais eficiente do que a primeira versão discutida pois nessa nova versão não são utilizados laços nem isolados nem aninhados. Todo o processamento é matricial. Os casos relativos à transformada de Fourier aqui discutidos servem apenas como estratégia de apoio para o exercício da programação. D e fato, o Scilab já possui funções internas (fft e dft) as quais lidam com transformadas de Fourier. As expressões são preparadas para executar operações por álgebra de matrizes, para tanto, a função mtlb_repmat é utilizada para replicar linhas ou colunas de maneira adequada à realização das operações. Outro operador utilizado (talvez uma novidade) é “.*” o qual realiza o produto ponto-aponto entre as células das matrizes operadas. Note, no exemplo a seguir, a diferença em relação ao produto convencional de matrizes: X=[1 2 3] e Y=[4 5 6]: a) X.*Y=[1*4 2*5 3*6]=[4 10 18], ao passo que...; b) O produto convencional das matrizes X e Y é calculado através da expressão: X*Y' = [1*4+ 2*5+ 3*6]= [32] No que se refere às alterações realizadas sobre a primeira implementação, a parte mais importante da otimização consiste na adaptação da expressão contida nos dois laços aninhados (o mais externo para determinação dos valores de t e o mais interno para determinação da f(t)). for t=0:%pi/32:2*%pi acum=a0/2; for n=1:MAX an=(cos(n*%pi)-1)/(n*%pi)^2; bn=-cos(n*%pi)/(n*%pi); acum=acum+(an*cos(n*W0*t)+bn*sin(n*W0*t)); end cont=cont+1; XY(1:2,cont)=[t,acum]'; end Uma etapa inicial consiste em adaptar (an*cos(n*W0*t)+bn*sin(n*W0*t) à forma matricial. O vetor t é facilmente obtido fazendo t=[0:pi/32:2pi] , porém n é de tamanho variável (1 linha MAX colunas) e tem que ser operado junto com o vetor t. Fazemos então uma replicação de t (através da função mtlb_repmat) criando uma matriz tt de MAX linhas, onde cada linha é uma cópia de t. Com isso temos: n de dimensões 1,MAX e tt com dimensões MAX,numColsEm_t, com essa adaptação o produto n*W0*t fica viabilizado pelo produto das matrizes n*W0*tt, sendo que este operador (produto de matrizes) é disponibilizado pelo próprio Scilab. As outras adaptações seguem o mesmo princípio, ou seja, criar um sistema matricial que viabilize as operações algébricas necessárias. Temos abaixo, o código da função otimizada: function fourier1Otimo(MAX) T=2*%pi; a0=1/4; W0=2*%pi/T; t=[0:%pi/32:T]; tt=mtlb_repmat(t,MAX,1);//cria uma matriz tt com MAX linhas, sendo cada uma a cópia de t n=[1:1:MAX]; an=(cos(n*%pi)-1)./((n*%pi)^2); bn=-cos(n*%pi)./(n*%pi); nn=mtlb_repmat(n',1,size(tt,2)); A=cos(nn.*(W0*tt)); B=sin(nn.*(W0*tt)); C=an*A; D=bn*B; A0=a0/2; ft=A0+(C+D);// <<< EQUAÇÃO MATRICIAL EQUIVALENTE AOS DOIS LAÇOS FOR ANINHADOS // UTILIZADOS NA PRIMEIRA VERSÃO DO PROGRAMA h=figure(1); plot(t,ft); nomeFig=input("Entre com o nome do arquivo a ser salvo \n","string"); caminho="c:\PRE1001\"; caminhoEnome=strcat([caminho, nomeFig,".jpg"]); xs2jpg(1,caminhoEnome); endfunction