Documentos de Académico
Documentos de Profesional
Documentos de Cultura
interface
uses
type
TString=Array of string;
Totros=Class
xo:double;
VarResultado:string;
function ExpressionParser(Equation:string;Variables:string;Values:string):double;
procedure solverecua(Fx:string;listvar:string;listval:string);
function Resultados():string;
end;
T2DLabelArray=array of TLabelArray;
Y: Integer;
End;
TForm1 = class(TForm)
SpinEdit1: TSpinEdit;
Memo1: TMemo;
Label1: TLabel;
limpiar: TBitBtn;
salir: TBitBtn;
itera: TLabel;
tdelta: TEdit;
Label2: TLabel;
calcular: TBitBtn;
procedure DestroyEdits;
private
{ Private declarations }
////////////////////////////////BSRA////////////////////////////////////////////
public
{ Public declarations }
LeftEdits : T2DEditArray;
RightEdits : TEditArray;
LeftLabels : T2DlabelArray;
RightLabels : TLabelArray;
ResultEdits : TEditArray;
Order : integer;
end;
var
Form1: TForm1;
detJ,detM,trza,zo,yo,xo:double;
vallistT,varlist,vallist:string;
labvar:array[1..10] of string ;
Valdet:array[1..10]of double;
VarEcuacion:string;
variablelist,valorlist:string;
n,pibe1:integer;
delta:real;
bo:integer;
//const
// delta=0.0000001;
implementation
{$R *.dfm}
///////////////////////////////////////////////////////////////////////////////
var
p, q: PChar;
n: integer;
begin
Result := 0;
n := Length(substr);
if n = 0 then exit;
q := PChar(Pointer(substr));
p := PChar(Pointer(str));
p := StrPos(p, q);
inc(Result);
inc(p, n);
end;
end;
end;
// "separator"
var
i, n: integer;
p, q, s: PChar;
begin
p := PChar(str);
s := PChar(separator);
n := Length(separator);
i := 0;
repeat
q := StrPos(p, s);
SetString(Result[i], p, q - p);
p := q + n;
inc(i);
until q^ = #0;
end;
function Totros.ExpressionParser(Equation:string;Variables:string;Values:string):double;
var
MyParser:TExpressionParser;
MyParserEquation:integer;
ArrayVariables:TString;
ArrayStringValues:TString;
ArrayValues:array of double;
i:integer;
begin
SetLength(ArrayValues,length(ArrayStringValues));
begin
ArrayValues[i]:=StrToFloat(ArrayStringValues[i]);
end;
MyParser := TCstyleParser.Create;
TCStyleParser(MyParser).CStyle:=False;
//MyParser.DecimSeparator:=',';
begin
MyParser.DefineVariable(ArrayVariables[i],@ArrayValues[i])
end;
MyParser.Optimize:=true;
MyParserEquation:=MyParser.AddExpression(Equation);
Result:= StrToFloat(MyParser.AsString[MyParserEquation]);
end;
///////////////////////////////////////////////////////////////////////////////
var sol:double;
begin
sol:=ExpressionParser(Fx,listvar,listval);
VarResultado:=floattostr(sol);
end;
function Totros.Resultados():string;
begin
Result:=VarResultado;
end;
///////////////////////////////////////////////////////////////////////////////
Var
Lx := 70;
Ly := 165;
SetLength(LeftEdits, AOrder);
SetLength(RightEdits, AOrder);
SetLength(Leftlabels, AOrder);
SetLength(Rightlabels, AOrder);
begin
SetLength(LeftEdits[LRow], AOrder);
SetLength(Leftlabels[LRow], AOrder);
for LCol := 0 to 0 do
begin
LeftEdits[LRow][lcol] := TEdit.Create(Self);
with LeftEdits[LRow][lcol] do
begin
parent:=form1;
Left := Lx;
Top := Ly;
Height := 20;
Width := 200;
Text := '';
end;
Leftlabels[LRow][lcol] := Tlabel.Create(Self);
with Leftlabels[LRow][lcol] do
begin
parent:=form1;
Left := Lx-45;
Top := Ly+6;
Font.Style:= [fsBold];
caption := 'Ecu.'+inttostr(lrow+1);
end;
end;
RightEdits[LRow] := TEdit.Create(Self);
with RightEdits[LRow] do
begin
parent:=form1;
Left := 325;
Top := Ly;
Height := 20;
Width := 30;
Text := '';
end;
Rightlabels[LRow] := Tlabel.Create(Self);
with Rightlabels[LRow] do
begin
parent:=form1;
Left := 325-30;
Top := Ly+3;
Font.Style:= [fsBold];
end;
Lx := 70;
Inc(Ly, 22);
end;
end;
procedure TForm1.DestroyEdits;
Var
begin
begin
LeftEdits[LRow][LCol].Free;
Leftlabels[LRow][LCol].Free;
end;
RightEdits[LRow].Free;
RightLabels[LRow].Free;
end;
// destruye resultados
SetLength(ResultEdits, 0);
end;
end;
//////////////////////////////////////////////////////////////////////////////
// PROCEDIMIENTOS UTILES
procedure saliresultados;
var ik:integer;
begin
form1.Memo1.Lines.Add('Nº iter.='+inttostr(pibe1));
for ik:=1 to n do
form1.Memo1.Lines.Add('X.'+inttostr(ik)+'= '+floattostr(mval[ik]));
form1.Memo1.Lines.Add('_________________________ ');
end;
//linea1:='(_______________________)';
//Memo1.items.add(linea11);
var ii,ji,li,ki:integer;
begin
B:=Mjacob;
A:=mjacob;
trza:=0;
for ii:=1 to n do
trza:=trza+B[ii,ii];
VB[1]:=-1*trza;
bb:=b;
for ii:=1 to n do
Bb[ii,ii]:=B[ii,ii]+VB[1];
for ki:=2 to n do
begin begin
begin
C[ii,ji]:=0;
for li:=1 to n do
C[ii,ji]:=C[ii,ji]+A[ii,li]*Bb[li,ji] ;
B:=C;
trza:=0;
for ii:=1 to n do
trza:=trza+B[ii,ii];
VB[ki]:=-1*trza/ki;
for ii:=1 to n do
Bb[ii,ii]:=B[ii,ii]+VB[ki];
end;
detJ:=Vb[n];
end;
var ij,jj,lj,kj:integer;
begin
B:=MjacTp;
A:=mjacTp;
trza:=0;
for ij:=1 to n do
trza:=trza+B[ij,ij];
VB[1]:=-1*trza;
bb:=b;
for ij:=1 to n do
Bb[ij,ij]:=B[ij,ij]+VB[1];
for kj:=2 to n do
begin begin
for jj:=1 to n do
begin
C[ij,jj]:=0;
for lj:=1 to n do
C[ij,jj]:=C[ij,jj]+A[ij,lj]*Bb[lj,jj] ;
B:=C;
trza:=0;
for ij:=1 to n do
trza:=trza+B[ij,ij];
VB[kj]:=-1*trza/kj;
for ij:=1 to n do
Bb[ij,ij]:=B[ij,ij]+VB[kj];
end;
detM:=Vb[n];
end;
////////////////////////////////////////////////////////////////////////////////
// INICIO CALCULOS
label label1,label2;
var
otro:Totros;
LLeftSide : T2DFloatArray;
LRightSide: TFloatArray;
begin
val(tdelta.Text,delta,bo);
n:= strtoint(spinedit1.Text);
case n of
2: varlist:='x,y';
3: varlist:='x,y,z';
4: varlist:='x,y,z,l';
5: varlist:='x,y,z,l,m';
end;
///////////////////////////////////////////////////////////////////////////////
vallist:=Rightedits[0].Text;
SetLength(LLeftSide, Order);
SetLength(LRightSide, Order);
begin
SetLength(LLeftSide[LRow], Order);
for LCol := 0 to 0 do
begin
LLeftSide[LRow][LCol] := LeftEdits[LRow][LCol].Text;
end;
if RightEdits[LRow].Text = '' then Exit;
LRightSide[LRow]:= RightEdits[LRow].Text;
vallist:=vallist+';'+Rightedits[Lrow+1].Text;
end;
///////////////////////////////////////////////////////////////////////////////
pibe1:=0;
otro:=totros.Create;
label1:
for i:=1 to n do
begin
varecuacion:= LeftEdits[i-1][0].Text;
mtfun[i]:=strtofloat(otro.Resultados()) ;
Mvalt[i]:=mval[i];
end;
vallistT:=vallist;
////////////////////////////////////////////////////////////////////////////////
for i:=1 to n do
begin
for j:=1 to n do
begin
if j=i then
mvaldelta[i,j]:=mvalt[j]+delta
else
mvaldelta[i,j]:=mvalt[j];
end;
end;
for i:=1 to n do
begin
for j:=1 to n do
begin
varecuacion:= LeftEdits[i-1][0].Text;
vallist:=floattostr(mvaldelta[j,1]);
vallist:=vallist+';'+floattostr(mvaldelta[j,k+1]);
MJacob[i,j]:=(strtofloat(otro.Resultados())-mtfun[i])/delta ;
pibe1:=pibe1+1;
end;
end;
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
for i:=1 to n do
begin
MjacTp:=mjact;
for j:=1 to n do
MjacTp[j,i]:=-1*mtfun[j];
detMat;
Valdet[i]:=detM;
end;
///////////////////////////////////////////////////////////////////////////////
k:=0;
for i:=1 to n do
begin
res[i]:=mval[i]+(valdet[i]/detJ);
difval[i]:= mval[i]-res[i];
begin
mval[i]:=res[i];
k:=k+1;
end;
end;
///////////////////////////////////////////////////////////////////////////////
vallist:=floattostr(mval[1]);
goto label1;
///////////////////////////////////////////////////////////////////////////////
// MUESTRA RESULTADOS
label2:
saliresultados;
end;
var mn:integer;
begin
memo1.Clear;
mn:=strtoint(spinedit1.Text);
DestroyEdits;
creaedits(mn);
end;
begin
memo1.Clear;
Order := strtoint(spinedit1.Text);
CreaEdits(Order);
end;
procedure TForm1.limpiarClick(Sender: TObject);
begin
memo1.Clear;
itera.Caption:='';
end;
begin
close;
end;
end.