Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental Função Gama e Série de Stirling Camila R. L. Cordeiro Paulo Henrique Dettmer Paulo L. Manenti Sinvaldo Rodrigues Moreno Trabalho apresentado como requisito parcial para aprovação na Disciplina TH704 - Matemática Aplicada sob orientação Prof. Eloy Kaviski. Curitiba 28 maio 2010. Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental Introdução O presente trabalho ilustra um algoritmo desenvolvido para ser utilizado na obtenção de fatoriais de números reais e complexos, através da utilização da função gama e da Série de Stirling. O algoritmo foi dividido de forma a resolver os dois problemas de forma independente, porém utilizando a mesma interface de entrada de dados. 1. Descrição do Problema O enunciado do problema propõe que sua resolução seja através de um programa computacional, o Delphi será utilizado como linguagem de programação padrão, como fonte de homologação do algoritmo, foi fornecido, juntamente com o problema a ser resolvido, o resultado para os valores a serem calculados. A descrição do problema é divida em duas etapas que segue [1]: A. Escrever um programa para calcular )!(10 xLog diretamente da Série de Stirling, assumir que 10≥x , para valores menores, utilizar a forma de recorrência para o cálculo de fatorial. Criar uma tabela para valores de )!(10 xLog versus ix , utilizar incrementos com passo de 10 unidades, ou seja, incrementos de 10 com i= 1, 2,..., 30. Submeter o programa a teste, utilizando os dados obtidos pela multiplicação direta (definição de fatorial). O valor de referência para .97,157)!(10 =xLog B. Escrever uma rotina que calcule )!(zLn para z complexo baseado na Série de Stirling. Submeter a rotina a testes para z puramente real, z puramente complexo. O valor de referência para ( ) 82618,0!5.0 =i e a fase é ( ) .24406,0!5.0 −=i Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental 2. Função Gama e Série de Stirling 2.1 Função Gama A função gama aparece ocasionalmente em problemas físicos tais como a normalização de funções de onda de Coulomb e o cálculo de probabilidades em mecânica estatística. Contudo, em geral, ela tem menos aplicação física direta e interpretação do que, digamos, as funções de Legendre e Bessel [1]. Há em uso corrente, pelo menos três definições diferentes e convenientes da função gama, porém nesse trabalho a mesma será utilizada como, ! 0 zdtte zt ≡∫ ∞ − 1)( −>ℜ z (2.1) para defnir uma função fatorial !z .Ocasionalmente, podemos encontrar a notação de Gauss, ( )∏ z , para a função fatorial [1] : ( ) ( )1! +Γ=≡∏ zzz (2.2) A notação Γ se deve a Legendre, a função fatorial da equação (2.1) é relacionada à função gama por: ( ) ( )!1−=Γ zz ou ( ) !1 zz =+Γ (2.3) Se nz = , um inteiro positivo, obtém-se a seguinte equação: ,...321!! nnz ⋅⋅⋅⋅== (2.4) que é o familiar fatorial [1]. Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental 2.2 Série de Stirling Através da função gama, Stirling realizou uma expansão assintótica [1] para o cálculo de ( )1ln +Γ z e obteve a seguinte aproximação: ( ) ... 1260 1 360 1 12 1 ln 2 1 2ln 2 1 1ln 53 − ⋅ + ⋅ − ⋅ +−+⋅ ++⋅=+Γ zzz zzzz pi (2.5) Para ( )1+Γ z em vez de ( )1ln +Γ z , a equação (2.5) se torna: ( ) + ⋅ − ⋅ + ⋅ +⋅⋅⋅=+Γ − + ... 51840 139 288 1 12 1 121 32 2 1 zzz ezz z z pi (2.6) Sendo a equação (2.6) utilizada na solução do item A, após a obtenção do valor de ( ) !1 zz =+Γ é aplicado o logaritmo na base 10, como é sugerido no problema proposto e a equação (2.5) utilizada na solução do item B do problema. 3. Programa 3.1 Interface do Programa A interface do programa contém quatro botões, onde o usuário poderá realizar a etapa de cálculo e reset das variáveis internas para as duas etapas do problema, a tela inicial pode ser vista na figura 3.1. Após a entrada do valor numérico para a qual se deseja calcular o fatorial, o resultado é apresentado através da propriedade Caption do label, é também informado qual método foi utilizado para a obtenção da solução, figuras 3.2 e 3.3; Caso o valor inserido seja menor que 10, como proposto na primeira etapa do problema, o cálculo é realizado pela definição de fatorial, caso seja superior a esse valor é utilizado à Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental equação (2.6) e pode-se calcular através deste programa o valor do fatorial até de 1500 sem o ocorrer overflow nas variáveis internas da rotina de cálculo. Figura 3.1- Tela inicial – Interface com o usuário. Figura 3.2- Tela inicial – Apresentação dos resultados. Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental Figura 3.3- Tela inicial – Apresentação dos resultados. Para a segunda etapa do problema os resultados apresentados são em módulo e fase, a rotina apresenta mensagens de erro caso os dois campos de entrada de dados sejam deixados sem preenchimento ou caso ambos sejam preenchidos com valor nulo (zero), a figura 3.4 mostra como os resultados são apresentados: Figura 3.4- Tela inicial – Apresentação dos resultados. Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental 3.2 Desenvolvimento do Programa Para manipulação de números complexos, foi necessário desenvolver uma Unit (biblioteca), com todas as operações matemáticas de números complexos, a Unit desenvolvida recebeu o nome de Complex.pas e seu código fonte é detalhado no anexo deste trabalho. A função que descreve a série de Stirling tanto na forma da equação (2.5) e (2.6) foram reescritas para melhor desenvolvimento do algoritmo do programa. 4. Resultados Os resultados da parte A do problema são mostrados na tabela 4.1, para melhor visualização foi construído o gráfico da figura 4.1; x Log(x!) x Log(x!) x Log(x!) 10 6.559 110 178.200 210 398.024 20 18.386 120 198.825 220 421.358 30 32.423 130 219.810 230 444.889 40 47.911 140 241.129 240 468.609 50 64.483 150 262.756 250 492.509 60 81.920 160 284.673 260 516.583 70 100.078 170 306.860 270 540.823 80 118.854 180 329.302 280 565.224 90 138.171 190 351.985 290 589.780 100 157.970 200 374.896 300 614.485 Tabela 4.1 – Valores de Log(x!) versus x Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental Logaritimo da Função Gamma - Log(x!) 0 100 200 300 400 500 600 0 5 10 15 20 25 30 X (x10) Lo g( x !) Log(x!) Figura 4.1 – Gráfico de Log da Função da Gamma. Os resultados da parte B do problema são mostrados na tabela 4.2, porém os mesmos apresentaram certo desvio do valor sugerido por Arfken [1] como solução. Argumento Fase Tipo de Solução 0.82618 -0.24406 Sugerida pelo Autor 0.7979 -0.27018 Encontrada Tabela 4.2 – Valoresda Solução Obtida 5. Conclusão O trabalho mostrou a robustez da Série de Stirling para cálculos de fatoriais de números superiores a 70 e também a boa aproximação para números complexos, os desvios verificados se devem ao truncamento da série no termo de 5ª ordem. Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental Anexo I - Códigos Fonte do Programa O programa foi desenvolvido com base em [2] e [3], o mesmo faz uso das propriedades do Label para mostrar o resultado das operações. É apresentado abaixo o código com os comentários para facilitar o entendimento de um modo geral. Arquivo gamma.pas interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Math, StdCtrls, Complex; //Chamada da Unit Complex para manipular numeros complexos type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Edit1: TEdit; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Button1: TButton; Button2: TButton; Label10: TLabel; Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental Label11: TLabel; Label12: TLabel; Edit2: TEdit; Edit3: TEdit; Label13: TLabel; Label14: TLabel; Label15: TLabel; Button3: TButton; Label16: TLabel; Button4: TButton; Label17: TLabel; Label19: TLabel; Label18: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} Var Raiz, Serie, Resul,X1, X2, X3 : Extended; Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental Const //Constantes da Série de Stirling A1= 12; //Termo A1 da Série A2= 288; //Termo A2 da Série A3= 51840; //Termo A3 da Série A4= 0.5; // Constante 1/2 da Série de Stirling para numeros complexos A5= 1.838; // Calculo do Valor de Ln(2pi) A6= 360; // Constante da Série; A7= 1260; // Constante da Série; //procedure para resolver a primeira etapa do problema procedure TForm1.Button1Click(Sender: TObject); var Fact, X: Integer; Begin Label4.Caption:= Edit1.text; If Edit1.text <> ' ' then Begin X:= StrToInt(Edit1.text); If (X > 10) and (X < 1501) then Begin ShowMessage(' O Fatorial será calculado pela Série de Stirling'); X1:= 1/(A1*X); X2:= 1/(A2*SQR(X)); X3:= 139/(A3*Power(X,3)); Raiz:= SQRT(2*PI*X); // Constante da série: raiz de 2pi Serie:= Raiz*Power(X,X)*exp(-X)*(1 + X1 + X2 - X3); // Termos da Série de Stirling Label6.Caption:= FloatToStr(Serie); Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental Label9.Caption:= ('Este resultado foi calculado pela Série de Stirling!!'); // Informa o método Resul:= LOGN(10,Serie); // Calculo do Logaritmo Base 10 do Fatorial de X End Else Begin ShowMessage('O Fatorial será calculado pela Definição de Fatorial!!'); IF X > 1 then for Fact:=(X - 1) downto 1 do begin X:=Fact*X; //Calculo do Fatorial pela forma tradicional Resul:= LOGN(10,X); // Calculo do Logaritmo Base 10 do Fatorial de X Label6.Caption:= FloaTtoStr(X); Label9.Caption:= ('Este resultado foi calculado pela Definição de Fatorial!!'); end Else IF (X = 0) or (X = 1) Then Begin Resul:= LOGN(10,1); Label6.Caption:= '1'; Label9.Caption:= ('Este resultado foi calculado pela Definição de Fatorial!!'); End Else Begin Resul:= LOGN(10,1); Label6.Caption:= 'Valor Inválido'; Label9.Caption:= ('Valor Inválido, impossível de calcular!!'); End End; Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental End Else Begin Resul:= 0; ShowMessage('Valor inválido, impossível calcular!!'); Label6.Caption:= ('Valor inválido'); Label9.Caption:= ('Não foi possível calcular!!'); End; Label8.caption:= FloatToStr(Resul); End; //botão para resetar a interface gráfica procedure TForm1.Button2Click(Sender: TObject); begin Edit1.Clear; //Limpa a textbox Label4.Caption:= ' '; //limpa os textos da label; Label6.Caption:=''; Label8.Caption:=''; Label9.Caption:=''; end; // segunda parte do trabalho //Calculo de Ln(z!) para z procedure TForm1.Button3Click(Sender: TObject); Var X,Y,NepZ,Arg, Modulo : Extended; Z0, Z1, Z2, Z3, Z4, Z5, Zcb, Zqt, Zn,Zr, S1, S2, S3, S4, Sn: Complexo; Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental begin If (Edit2.text <>'') and (Edit3.text <> '') then Begin X:= strtofloat(Edit2.text); Y:= strtofloat(Edit3.text); Z0:= Atribui(X,Y); //transformao par x,y em Z0 =x + yi Z1:= SomaRealComp(Z0,A4); //Soma a parcela (Z0+1/2) Nepz:= LN(ArgComp(Z0)); //Calcula o Ln|Z0| Z2:= Atribui(Nepz,CFase(Z0)); //transforma em z = a + bi Z3:= ProdComplexo(Z1,Z2); //Calcula (a+bi)*Ln(c+di) Zr:= Atribui(1,0); // Transforma o par 1, 0 em z = 1 +0i para a divisão de 1/12*Z Z4:= RealxComp(Z0,A1); // Calcula o termo 12*Z Z4:= DivComplexo(Zr,Z4); // Calcula o termo 1/12*Z Zcb:= Pot3Comp(Z0); //Calcula Z0^3 Z5:= RealxComp(Zcb,A6); //Calcula o termo 360*Z^3 Z5:= DivComplexo(Zr,Z5); //Calcula o termo 1/360*Z^3 Zqt:= Pot5Comp(Z0); //Calcula Z0^5 Zn:= RealxComp(Zqt,A7); //Calcula o termo 1260*Z^5 Zn:= DivComplexo(Zr,Zn); //Calcula o termo 1/1260*Z^5 S1:= SomaComp(Z3,Z5); // Calcula o termo (Z3 + Z5) S2:= SomaComp(Z0,Z4); // Calcula o termo (z0 + Z4) S3:= SomaComp(S2,Zn); // Calcula o termo (S2 + Zn) S4:= SomaComp(S1,S3); // Calcula o termo (S1 + S3) Sn:= SomaRealComp(S4,A4*A5); // monta o resultado final; Modulo:= ArgComp(Sn); // Calcula o modulo do resultado Arg:= Cfase(Sn); // Calcula a fase do resultado; Label17.Caption:= floattostr(Modulo); Label19.Caption:= floattostr(Arg); Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental End Else Begin ShowMessage('Valor Inválido - Impossível de realizar o cálculo!'); Label17.Caption:=''; //limpa os textos da label; Label19.Caption:=''; //limpa os textos da label; end; end; //botão para resetar a interface gráfica procedure TForm1.Button4Click(Sender: TObject); begin Edit2.Clear;//Limpa a texbox Edit3.Clear;//Limpa a texbox Label17.Caption:=''; //limpa os textos da label; Label19.Caption:=''; //limpa os textos da label; end; end. Biblioteca Complex.pas unit Complex; interface Type Complexo = RecordR : Extended; // Parte Real I : Extended; // Parte Imaginária Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental End; Function Atribui( Const U : Extended; Const V : Extended ): Complexo; Function SomaComp(Const U, V : Complexo): Complexo; Function ArgComp(Const Z: Complexo): Extended; Function SomaRealComp(Const Z: Complexo; C : Double): Complexo; function CFase(var Z: Complexo): Extended; function ProdComplexo(U,V: Complexo): Complexo; function RealxComp(Z: Complexo; C: Double): Complexo; function Pot3Comp(Z: Complexo): Complexo; function Pot5Comp(Z: Complexo): Complexo; function DivComplexo(U,V: Complexo): Complexo; implementation //função que transforma o par x, y em z= x+yi Function Atribui ( Const U : Extended; Const V : Extended ): Complexo; Begin Result.R := U; Result.I := V; End; //função que realiza a soma de dois números complexos Function SomaComp(Const U, V : Complexo): Complexo; Begin Result.R := U.R + V.R; Result.I := U.I + V.I; End; Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental //função que calcula o argumento do numero complexo Function ArgComp(Const Z: Complexo): Extended; Var R,I : Extended; Begin R:= Z.R*Z.R; I:= Z.I*Z.I; Result:= Sqrt(R + I); End; //função que soma um numero real com um numero complexo Function SomaRealComp(Const Z: Complexo; C : Double): Complexo; Begin Result.R := Z.R + C; Result.I := Z.I; End; //função que calcula a fase do numero complexo ( em radianos) function CFase(var Z: Complexo): Extended; var Phase: extended; begin with Z do begin If Z.r = 0 then If Z.i = 0 then Phase := 0 Else If Z.i > 0 then Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental Phase := (0.5 * Pi) Else Phase :=(-0.5 * Pi) Else If Z.r > 0 then Phase := ArcTan(Z.i/Z.r) Else IF Z.i < 0 then Phase := ArcTan(Z.i/Z.r)- Pi Else Phase := ArcTan(Z.i/Z.r)+ Pi; End; Result:= Phase; End; //função que calcula o produto complexo function ProdComplexo(U,V: Complexo): Complexo; begin with result do begin Result.R:= U.r * V.r - U.i * V.i; Result.I:= U.r * V.i + U.i * V.r; end end; //função que multiplica um real por complexo function RealxComp(Z: Complexo; C: Double): Complexo; begin Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental with result do begin Result.r:= Z.r * C; Result.i:= Z.i * C; end end; //função que calcula um numero complexo a terceira potência function Pot3Comp(Z: Complexo): Complexo; Var QuadR, QuadI : Extended; begin with result do begin QuadR:= Sqr(Z.r); QuadI:= Sqr(Z.i); Result.r:= Z.r*(QuadR - 3*QuadI); Result.i:= Z.i*(2*QuadR - QuadI); end end; //função que calcula um numero complexo aquinta potência function Pot5Comp(Z: Complexo): Complexo; Var QuadR, QuadI,QuadR1, QuadI1 : Extended; begin with result do begin QuadR:= Sqr(Z.r); QuadI:= Sqr(Z.i); Universidade Federal do Paraná Setor de Tecnologia - Departamento de Pós-Graduação em Engenharia de Recursos Hídricos e Ambiental QuadR1:= Sqr(QuadR); QuadI1:= Sqr(QuadI); Result.r:= Z.r*(QuadR1 - 10*QuadR*QuadI + 5*QuadI1); Result.i:= Z.i*(QuadI1 - 10*QuadR*QuadI + 5*QuadR1); end End; //função que calcula a divisão de dois números complexos function DivComplexo(U,V: Complexo): Complexo; Var PReal , PImag, Deno : Extended; begin with result do begin PReal:= U.r * V.r + U.i * V.i; PImag:= U.i * V.r - U.r * V.i; Deno:= V.r*V.r + V.i*V.i; Result.r:= (PReal/Deno); Result.i:= (PImag/Deno); end end; 4. Referencias Bibliográficas [1] Arfken, George B, Física Matemática: Métodos para Engenharia e Física – Rio de Janeiro. Elsiever 2007; [2] Notas de Aula da Disciplina Linguagem de Programação – Prof. Eloy Kaviski – Universidade Federal do Paraná- Curitiba , 2010; [3] Barros, Edson A. R.(ET AL) - Delphi para Universitários – São Paulo: Páginas e Letras - Editora e Gráfica, 1999.
Compartilhar