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.
|