EQA5312 - Análise e Simulação de Processos
UNIVERSIDADE FEDERAL DE SANTA CATARINA
CURSO DE GRADUAÇÃO EM ENGENHARIA QUÍMICA


Prof. Leonel Teixeira Pinto
Estudo sobre os Métodos de Euler, Euler Expandido e Euler Modificado na resolução de Equações Diferenciais Ordinárias
Anexo: Software

O software foi desenvolvido em linguagem PASCAL utilizando o Delphi 3 como compilador. A interface gráfica do software consiste quatro campos:

  • Modo: três opções de aplicação do método de Euler, sendo eles o método de Euler Simples, Euler Estendido e Euler Modificado;
  • Intervalo de Amostragem: neste campo deverão ser fornecidos os valores limites do problema, ou seja, deve-se fornecer o "Ponto a Solucionar", o "n", e a "Condição Inicial F(x)=y";
  • Botão Inicia: deve-se clicar sobre este botão para dar início aos cálculos;
  • Gauge: varia de 0 a 100% do total cálculado.

Na figura abaixo temos a tela principal do software:

 
Figura 1a: Software do Método de Euler

O software questiona o local e nome do arquivo onde serão gravados os resultados dos cálculos:

 
Figura 2a

O software pergunta ao usuário se ele deseja abrir o arquivo com os resultados:

 
Figura 3a

O software grava os resultados dos cálculos em um arquivo no formato ASCII com os valores em coluna como no exemplo abaixo, este formato pode ser importado por qualquer outro software do windows (origin, excel, etc) ou de outras plataformas.

 

Valor de X Valor de Y
0,000 1,00000000000000E+0000
1,25000000000000E-0001 1,00000000000000E+0000
2,50000000000000E-0001 1,00000000000000E+0000
3,75000000000000E-0001 9,69230769230769E-0001
5,00000000000000E-0001 9,12217194570136E-0001
6,25000000000000E-0001 8,37240438852042E-0001
7,50000000000000E-0001 7,53516394966838E-0001
8,75000000000000E-0001 6,68851631487418E-0001
1,00000000000000E+0000 5,88589435708928E-0001
 
Tabela 1: resultado dos cálculos

O código fonte do software foi dividido em dois arquivos para facilitar o desenvolvimento e as alterações nas equações a serem resolvidas. O arquivo Main.pas contém o código principal do software, controlando todas as ações do usuário e contendo os três métodos. O arquivo Func.pas contém apenas a função a ser resolvida e a derivada 2ª.

 Código Fonte do Software do Método de Euler
 

unit Main;

interface

uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Result, math,
Forms, Dialogs,ShellApi, fmxutils,ExtCtrls, StdCtrls, Buttons, Gauges, Func, Aviso;

type
TFormEuler = class(TForm)
GaugeEuler: TGauge;
BtnEulerInicia: TBitBtn;
GroupBox11: TGroupBox;
Label41: TLabel;
Label42: TLabel;
Label43: TLabel;
Label44: TLabel;
Label45: TLabel;
PtDir: TEdit;
NSubInter: TEdit;
ConInix: TEdit;
ConIniy: TEdit;
RdGrpEuler: TRadioGroup;
procedure BtnEulerIniciaClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FormEuler: TFormEuler;
implementation
{$R *.DFM}

procedure TFormEuler.BtnEulerIniciaClick(Sender: TObject);
var
H, PontoEsq, PontoDir, CondIniy, CondIniyOld, difer : real;
NSubInt, Contador, edu : Integer;
OUP : TextFile;
FilePath, EulerFileName : String;

begin
PontoDir:=StrtoFloat(PtDir.Text);
PontoEsq:=StrtoFloat(ConInix.Text);
CondIniyOld:=StrtoFloat(ConIniy.Text);
NSubInt:=StrtoInt(NSubInter.Text);
GaugeEuler.MaxValue:=NSubInt;
Contador:=1;
EulerFileName:=InputBox('Arquivo de Saída', 'Nome do Arquivo', 'c:\temp\saida.dat');
AssignFile( OUP, EulerFileName);
rewrite(OUP);
difer:=1;
contador:=1;
edu:=round(power(2,NSubInt));
H :=(PontoDir-PontoEsq)/edu;
{Writeln ( OUP, 'Ponto a Esquerda Condição Inicial'); }
Writeln ( OUP, PontoEsq:5:3,char(9),CondIniyOld{:12:7});
if(RdGrpEuler.ItemIndex=0) then {se for método de Euler simples}
Begin
For Contador:=1 to edu do
Begin
CondIniy := CondIniyOld + H * FEuler( PontoEsq, CondIniyOld );
PontoEsq := PontoEsq + H;
writeln ( OUP,PontoEsq,char(9),CondIniyOld{:12:7});
CondIniyOld:=CondIniy;
GaugeEuler.Progress:=Contador;
end;
end

else if(RdGrpEuler.ItemIndex=1) then {se for método de Euler Estendido}

Begin
For Contador:=1 to edu do

Begin
CondIniy := CondIniyOld + H * FEuler( PontoEsq, CondIniyOld )
+(1 / 2) * sqr(H) * DerivadaSegunda(PontoEsq, CondIniyOld);
PontoEsq := PontoEsq + H;
writeln ( OUP,PontoEsq,char(9),CondIniyOld{:12:7});
CondIniyOld:=CondIniy;
GaugeEuler.Progress:=Contador;
end;

End

else if(RdGrpEuler.ItemIndex=2) then {se for método de Euler Modificado}

Begin
For Contador:=1 to edu do

Begin
CondIniy := CondIniyOld + H /2*( FEuler( PontoEsq, CondIniyOld )
+FEuler(PontoEsq+H, CondIniyOld+H*FEuler(PontoEsq, CondIniyOld )));
PontoEsq := PontoEsq + H;
writeln ( OUP,PontoEsq,char(9),CondIniyOld{:12:7});
CondIniyOld:=CondIniy;
GaugeEuler.Progress:=Contador;
end;

End;

CloseFile(OUP);
ResultDlg.ShowModal;
if (ResultDlg.ModalResult=mrOk) Then

Begin
ExecuteFile('Notepad.exe',EulerFileName,'c:\Windows\',SW_SHOWNORMAL);{Unit FmxUtils}
End;

end;
end.

unit Func;

interface

uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms,Dialogs, StdCtrls,ShellApi, math;

var
joke:real; {variavel sem importancia}
function FEuler ( X, Y : real ) : real;
function DerivadaSegunda(X, Y: real):real;

implementation

uses
Main;

{********************************************}
{ }
{ Método de Euler }
{ }
{**********************************}

{ Função a ser resolvida (altere somente aqui) }

function FEuler ( X, Y : real ) : real;

begin
FEuler :=(-2*X*Y)/(1+power(X, 2));
end;

{ Derivada segunda utilizada pelo Euler Estendido}

function DerivadaSegunda(X, Y: real):real;

begin
DerivadaSegunda := (2*Y*power(X,2) +8*power(x,2)*Y-2*y) / power((1+power(x,2)),2);
end;

end.