Código:
unit AN;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Table1: TTable;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Label16: TLabel;
TabSheet3: TTabSheet;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
DBGrid2: TDBGrid;
DataSource2: TDataSource;
Table2: TTable;
Button2: TButton;
DataSource3: TDataSource;
Table3: TTable;
DBGrid3: TDBGrid;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Button3: TButton;
DBGrid4: TDBGrid;
Table4: TTable;
DataSource4: TDataSource;
Edit15: TEdit;
Edit16: TEdit;
Edit17: TEdit;
Edit18: TEdit;
Label15: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Button4: TButton;
Edit19: TEdit;
Edit20: TEdit;
Edit21: TEdit;
Edit22: TEdit;
Label20: TLabel;
Label21: TLabel;
Label22: TLabel;
Label23: TLabel;
DBGrid5: TDBGrid;
DataSource5: TDataSource;
Table5: TTable;
Button5: TButton;
Edit23: TEdit;
Label24: 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;
var xl,xu,es,imax,iter:double;
var xr,ea,xrold,test:double;
var x:double;
var aux:double;
implementation
function func(x:double):double;
//var aux:double;
begin
func:= (exp(-x))-x;
end;
function deriv(x:double):double;
begin
deriv:=(-exp(-x))-1;
end;
function xpunto(x:double):double;
begin
xpunto:=exp(-x);
end;
function bisect(xl,xu,es,imax:double):double;
begin
iter:=0;
ea:=1;
while (ea > es) and (iter <= imax)
do
begin
form1.Table1.Append;
form1.Table1.FieldByName('ITER').AsFloat := iter;
form1.table1.FieldByName('AI').AsFloat := xl;
form1.table1.FieldByName('BI').AsFloat := xu;
form1.table1.FieldByName('FA').AsFloat := func(xl);
form1.table1.FieldByName('FB').AsFloat := func(xu);
xrold:=xr;
xr:= (xl+xu)/2;
form1.table1.FieldByName('RI').AsFloat := xr;
form1.table1.FieldByName('FRI').AsFloat := func(xr);
iter:=iter+1;
if (func(xr) <> 0) then
begin
aux:=(xr-xrold)/xr;
ea:= abs(aux);
form1.table1.FieldByName('EI').AsFloat := ea;
end;
test:=func(xl) * func(xr);
if (test<0) then
begin
xu:=xr;
end
else if (test>0) then
begin
xl:=xr;
form1.Table1.Post;
end
else
begin
ea:=0;
end;
end;
bisect:=xr;
end;
function interp(xl,xu,es,imax:double):double;
begin
iter:=0;
ea:=1;
while (ea > es) and (iter <= imax)
do
begin
form1.Table2.Append;
form1.Table2.FieldByName('ITER').AsFloat := iter;
form1.table2.FieldByName('AI').AsFloat := xl;
form1.table2.FieldByName('BI').AsFloat := xu;
form1.table2.FieldByName('FA').AsFloat := func(xl);
form1.table2.FieldByName('FB').AsFloat := func(xu);
xrold:=xr;
xr:= xu-((func(xu)*(xu-xl))/(func(xu)-func(xl)));
form1.table2.FieldByName('RI').AsFloat := xr;
form1.table2.FieldByName('FRI').AsFloat := func(xr);
iter:=iter+1;
if (func(xr) <> 0) then
begin
aux:=(xr-xrold)/xr;
ea:= abs(aux);
form1.table2.FieldByName('EI').AsFloat := ea;
end;
test:=func(xl) * func(xr);
if (test<0) then
begin
xu:=xr;
end
else if (test>0) then
begin
xl:=xr;
form1.Table2.Post;
end
else
begin
ea:=0;
end;
end;
interp:=xr;
end;
function newton(xl,es,imax:double):double;
begin
iter:=0;
ea:=1;
while (ea > es) and (iter <= imax)
do
begin
form1.Table3.Append;
form1.Table3.FieldByName('ITER').AsFloat := iter;
form1.table3.FieldByName('XI').AsFloat := xl;
form1.table3.FieldByName('FXI').AsFloat := func(xl);
xrold:=xr;
xr:= -(func(xl)/deriv(xl))+xl;
form1.table3.FieldByName('XR').AsFloat := xr;
form1.table3.FieldByName('FXR').AsFloat := func(xr);
iter:=iter+1;
if (func(xr) <> 0) then
begin
aux:=(xr-xl)/xr;
ea:= abs(aux);
form1.table3.FieldByName('EI').AsFloat := ea;
end;
xl:=xr;
form1.Table3.Post;
end;
newton:=xr;
end;
function punto(xl,es,imax:double):double;
begin
iter:=0;
ea:=1;
while (ea > es) and (iter <= imax)
do
begin
form1.Table4.Append;
form1.Table4.FieldByName('ITER').AsFloat := iter;
form1.table4.FieldByName('XI').AsFloat := xl;
form1.table4.FieldByName('FXI').AsFloat := func(xl);
xrold:=xr;
xr:= xpunto(xl);
form1.table4.FieldByName('XR').AsFloat := xr;
form1.table4.FieldByName('FXR').AsFloat := func(xr);
iter:=iter+1;
if (func(xr) <> 0) then
begin
aux:=(xr-xl)/xr;
ea:= abs(aux);
form1.table4.FieldByName('EI').AsFloat := ea;
end;
xl:=xr;
form1.Table4.Post;
end;
punto:=xr;
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
while(form1.Table1.Bof = false) do
form1.Table1.Prior;
While(form1.Table1.IsEmpty<>true)do
form1.Table1.Delete;
xl := StrToFloat(edit1.Text);
xu := StrToFloat(edit2.Text);
es := StrToFloat(edit3.Text);
imax := StrToFloat(edit4.Text);
if (abs(xl)=abs(xu))
then
MessageDlg('El resultado de Xl + Xu tiene que ser diferente de 0',mtError,[mbOk],0)
else
Edit5.Text := FloatToStr(bisect(xl,xu,es,imax));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
while(form1.Table2.Bof = false) do
form1.Table2.Prior;
While(form1.Table2.IsEmpty<>true)do
form1.Table2.Delete;
xl := StrToFloat(edit6.Text);
xu := StrToFloat(edit7.Text);
es := StrToFloat(edit8.Text);
imax := StrToFloat(edit9.Text);
Edit10.Text := FloatToStr(interp(xl,xu,es,imax));
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
while(form1.Table3.Bof = false) do
form1.Table3.Prior;
While(form1.Table3.IsEmpty<>true)do
form1.Table3.Delete;
xl := StrToFloat(edit11.Text);
es := StrToFloat(edit12.Text);
imax := StrToFloat(edit13.Text);
Edit14.Text := FloatToStr(newton(xl,es,imax));
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
while(form1.Table4.Bof = false) do
form1.Table4.Prior;
While(form1.Table4.IsEmpty<>true)do
form1.Table4.Delete;
xl := StrToFloat(edit15.Text);
es := StrToFloat(edit16.Text);
imax := StrToFloat(edit17.Text);
Edit18.Text := FloatToStr(punto(xl,es,imax));
end;
end.