You are on page 1of 93

// Declaracin de categorias START

RAIZFX();
SISLINEAL();
INTERPOL();
INTEGRALES();
EQDIFF();
// Declaracin de acciones: met. RAIZFX
METODORAIZFX();
//Declaracin de metodos: cat. RAIZFX
BISECC();
PTOFIJO();
NEWTON();
SECANTE();
FALSAPOS();
NEWTONMEJ();
// Declaracin de acciones: met. SISLINEAL
METODOSISLINEAL();
// Declaracin de metodos: cat. SISLINEAL
JACOBI();
GAUSSSEIDEL();
SOR();
// Ceros en diagonal principal
CEROSDIAG(n);
// Declaracin de acciones: met. INTERPOL
METODOINTERPOL();
// Declaracin de metodos: cat. INTERPOL
LAGRANG();
CUBNATURAL();
CUBSUJETO();
// VECTOR a polinomio N N-1...0
VEC2POLY(vect);
// Declaracin de metodos: cat. INTEGRALES
METODOINTEGRALSIMPLE();
METODOINTEGRALCOMPUESTA();
METODOINTEGRALMULTIPLE();
SIMPLE();
ABIERTASNC();
CERRADASNC();
CUADGAUSS();
COMPUESTA();
SIMPSONGEN();
TRAPECIOGEN();
PTOMEDIOGEN();
MULTIPLE();

INTDOBLE();
DobleMsimpG();
DobleMcGauss();
DobleMsimp38();
INTTRIPLE();
TripleMsimpG();
TripleMcGauss();
TripleMsimp38();
// Declaracin de metodos: cat. EQ. DIFERENCIALES
METODOEQDIFF1VAR();
METODOEQDIFFSIST();
METODOEQDIFFDERPAR();
EQDIFF1VAR();
EQDIFF1VAREULER();
EQDIFF1VARRK2();
EQDIFF1VARRK4();
EQDIFF1VARPREDCORR();
EQDIFFSIST();
EQDIFFSISTRK4();
EQDIFFDERPAR();
EQDIFFDERPARELIP();
EQDIFFDERPARPARAB();
EQDIFFDERPARHIPER();
// Funciones varias
MUESTRAitera();
PINTAraiz(ii,colraiz);
MUESTRAresult();
EXPORT Analisis_Numerico()
BEGIN
END;
VIEW "EJECUTAR Analisis Numerico", START()
BEGIN
LOCAL categoria;
IF CHOOSE(categoria,
"Analisis Numerico - Categoria:",
"Raices de Funcin F(X)",
"Sistema EQs lineales AX=B",
"Interpolacin X F(X)",
"Integrales 1, 2, 3 VAR",
"EQs Diferenciales 1, 2 VAR")
THEN
CASE

IF categoria==1 THEN RAIZFX() END;


IF categoria==2 THEN SISLINEAL() END;
IF categoria==3 THEN INTERPOL() END;
IF categoria==4 THEN INTEGRALES() END;
IF categoria==5 THEN EQDIFF() END;
END;
// ELSE STARTVIEW(6,1);
KILL;
END;
END;
/////////////////////////////////////
// "Raices de Funcin F(X)"
/////////////////////////////////////
RAIZFX()
BEGIN
LOCAL metodo;
IF
CHOOSE(metodo,
"Raices de Funcin F(X) - Mtodo:",
"Biseccin", "Punto Fijo", "Newton",
"Secante", "Falsa Posicin",
"Newton Mejorado")
THEN
CASE
IF metodo==1 THEN
METODORAIZFX("BISECCION", "BISECC");
END;
IF metodo==2 THEN
METODORAIZFX("PUNTO FIJO", "PTOFIJO");
END;
IF metodo==3 THEN
METODORAIZFX("NEWTON","NEWTON");
END;
IF metodo==4 THEN
METODORAIZFX("SECANTE","SECANTE")
END;
IF metodo==5 THEN
METODORAIZFX("FALSA POSICION","FALSAPOS");
END;
IF metodo==6 THEN
METODORAIZFX("NEWTON MEJORADO",
"NEWTONMEJ");
END;
END;
ELSE START();
END;
END;

METODORAIZFX(metodo,nombrefunc)
BEGIN
LOCAL accion;
IF
CHOOSE(accion, "METODO: "+metodo,
"Ejecutar "+metodo,
"Ver Tabla Resultados",
"Ver Tabla X F(X)",
"TRUCO: Hallar Raiz Directa ",
"Configurar Rango de Grafica",
"Graficar")
THEN
CASE
IF accion==1 THEN
EXPR(nombrefunc+"(metodo,
nombrefunc)") END;
IF accion==2 THEN
STARTAPP("Spreadsheet"); END;
// STARTAPP("Analisis Numerico") END;
IF accion==3 THEN
STARTVIEW(2,1) END;
IF accion==4 THEN
MSGBOX("EN DESARROLLO...,OBSERVE LA GRAFICA ");
METODORAIZFX(metodo,nombrefunc); END;
IF accion==5 THEN
STARTVIEW(4,1) END;
IF accion==6 THEN
STARTVIEW(1,1) END;
END;
// RETURN accion;
ELSE RAIZFX();
END;
END;
// RAIZ BISECCIN
BISECC(metodo, nombrefunc)
BEGIN
LOCAL fx, a, b, tol, n;
LOCAL fa,fb,p,fp,i,err;
LOCAL okdata, colum, itera,salir;
fx:='X-2'; a:=1; b:=2;
tol:=0.001; n:=20; okdata:=0;
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,a,b,tol,n},
" "+metodo+" V1.0 ",
{"F(X):","A :","B :","TOL:","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese lmite inferior A",

"Ingrese limite superior B",


"Ingrese tolerancia ",
"Ingrese # maximo de iteraciones"},
{quote('X-2'),1,2,0.001,20})
THEN
F1:=fx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
fx:='X-2';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF F1(a)*F1(b)>0 THEN
MSGBOX("Signo de F(a) y Signo de F(b) son
IGUALES, En [a,b] puede NO EXISTIR Raiz
o PUEDEN EXISTIR un NUMERO PAR DE RAICES");
CHOOSE(okdata,"CAMBIAR A o B ?","SI","NO");
okdata:=okdata1;
END;
IF tol<0 THEN
MSGBOX("Se requiere: TOL>0")
END;
IF n<1 THEN
MSGBOX("Se requiere: N>0")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODORAIZFX(metodo, nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"iteracin", "a","b","p","F(p)",
"error", "SignoF(a)", "SignoF(p)",
"SignoF(b)", "apb?",
"F(a)","F(b)"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
i:=1;
WHILE in DO

MUESTRAitera(i);
p:=(a+b)/2;
err:=bp;
fa:=F1(a);
fp:=F1(p);
fb:=F1(b);
L9:={};
L9(1):=i;
L9(2):=a;
L9(3):=b;
L9(4):=p;
L9(5):=fp;
L9(6):=err;
L9(7):=IFTE(fa<0,"","+");
L9(8):=IFTE(fp<0,"","+");
L9(9):=IFTE(fb<0,"","+");
L9(10):=IFTE(fa*fp>0,"ap","pb");
L9(11):=fa;
L9(12):=fb;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(i+1,colum):= L9(colum);
END;
IF fp==0 OR (ba)/2<tol THEN
PINTAraiz(i,4);
MSGBOX("RAIZ X=p: "+p);
BREAK;
END;
IFTE(fa*fp>0,a:=p,b:=p);
i:=i+1;
END;
IF i>n THEN
MSGBOX("Mtodo: "+metodo+
" fall despues de: "+n+" iteraciones,
Sugerencia aumente N o Reduzca Tol");
END;
MUESTRAresult();
END;
// RAIZ PUNTO FIJO
PTOFIJO(metodo, nombrefunc)
BEGIN
LOCAL gx, p0, tol, n;
LOCAL p,i,err;
LOCAL okdata, colum, itera;
gx:='(10/(4+X))'; p0:=1.5;
tol:=0.0001; n:=20; okdata:=0;
REPEAT
gx:=EXPR("''"+gx+"''");
IF INPUT({gx,p0,tol,n},

" "+metodo+" V1.0 ",


{"G(X):","P0 :","TOL:","N :"},
{"'G(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese aproximacin inicial P0",
"Ingrese tolerancia ",
"Ingrese # maximo de iteraciones"},
{quote('(10/(4+X))'),1.5,0.0001,20})
THEN
F1:=gx;
CASE
IF TYPE(gx)==0 THEN
MSGBOX("Debe ingresar 'G(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
gx:='(10/(4+X))';
END;
IF tol<0 THEN
MSGBOX("Se requiere: TOL>0")
END;
IF n<1 THEN
MSGBOX("Se requiere: N>0")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODORAIZFX(metodo, nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(1,1,1):=Spreadsheet.AA1000;
L0:={"iteracin", "p0","p=G(p0)","error"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
i:=1;
WHILE in DO
MUESTRAitera(i);
p:=F1(p0);
err:=ABS(pp0);
L9:={};
L9(1):=i;
L9(2):=p0;
L9(3):=p;
L9(4):=err;
FOR colum FROM 1 TO SIZE(L9)
DO

Spreadsheet.Cell(i+1,colum):= L9(colum);
END;
IF err<tol THEN
PINTAraiz(i,3);
MSGBOX("RAIZ X=p: "+p);
BREAK;
END;
p0:=p;
i:=i+1;
END;
IF i>n THEN
MSGBOX("Mtodo: "+metodo+
" fall despues de: "+n+" iteraciones,
Sugerencia aumente N o cambie G(X)");
END;
MUESTRAresult();
END;
// RAIZ NEWTON
NEWTON(metodo, nombrefunc)
BEGIN
LOCAL fx, p0, tol, n;
LOCAL dfx,fp0,dfp0,p,i,err;
LOCAL okdata, colum, itera;
fx:='COS(X)-X'; p0:=/4;
tol:=110; n:=20; okdata:=0;
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,p0,tol,n},
" "+metodo+" V1.0 ",
{"F(X):","P0 :","TOL:","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese aproximacin inicial P0",
"Ingrese tolerancia ",
"Ingrese # maximo de iteraciones"},
{quote('COS(X)-X'),/4,110,20})
THEN
F1:=fx;
dfx:=EXPR("CAS.diff(QUOTE(fx),QUOTE(X))");
F2:=dfx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
fx:='COS(X)-X';
END;
IF tol<0 THEN
MSGBOX("Se requiere: TOL>0")
END;

IF n<1 THEN
MSGBOX("Se requiere: N>0")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODORAIZFX(metodo, nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"iteracin", "p0","p=p0-F(p0)/dF(p0)",
"F(p0)","dF(p0)","error","dF(X)"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
// ponemos dF(X)
Spreadsheet.Cell(2,7,0):=EXPR("''"+
dfx+"''");
PRINT();
i:=1;
WHILE in DO
MUESTRAitera(i);
dfp0:=F2(p0);
IF dfp0==0 THEN
MSGBOX("ERROR! division para CERO
dF(p0)=0 en
X=p0: "+p0 +"
Iteracin: "+i);
BREAK;
END;
fp0:=F1(p0);
p:=p0-(fp0/dfp0);
err:=ABS(pp0);
L9:={};
L9(1):=i;
L9(2):=p0;
L9(3):=p;
L9(4):=fp0;
L9(5):=dfp0;
L9(6):=err;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(i+1,colum):= L9(colum);
END;
IF err<tol THEN

PINTAraiz(i,3);
MSGBOX("RAIZ X=p: "+p);
BREAK;
END;
p0:=p;
i:=i+1;
END;
IF i>n THEN
MSGBOX("Mtodo: "+metodo+
" fall despues de: "+n+" iteraciones,
Sugerencia aumente N o
Analice convergencia en grafica");
END;
MUESTRAresult();
END;
// RAIZ SECANTE
SECANTE(metodo,nombrefunc)
BEGIN
LOCAL fx, p0, p1, tol, n;
LOCAL p,fp,q0,q1,i,err;
LOCAL okdata, colum, itera;
fx:='COS(X)-X'; p0:=0.5; p1:=/4;
tol:=17; n:=20; okdata:=0;
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,p0,p1,tol,n},
" "+metodo+" V1.0 ",
{"F(X):","P0 :","P1 :","TOL:","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese 1ra aproximacin inicial P0",
"Ingrese 2da aproximacin inicial P1",
"Ingrese tolerancia ",
"Ingrese # maximo de iteraciones"},
{quote('COS(X)-X'),0.5,/4,17,20})
THEN
F1:=fx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
fx:='COS(X)-X';
END;
IF tol<0 THEN
MSGBOX("Se requiere: TOL>0")
END;
IF n<1 THEN
MSGBOX("Se requiere: N>0")
END;

DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODORAIZFX(metodo, nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"iteracin","p=p1-q1*(p1-p0)/(q1-q0)",
"F(p)","p1","q1=F(p1)","p0","F(p0)",
"error"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
i:=1;
WHILE in DO
MUESTRAitera(i);
q0:=F1(p0);
q1:=F1(p1);
IF q0==q1 THEN
MSGBOX("ERROR! division para CERO
q0-q1=0 en
X=p0=p1: "+p1 +"
Iteracin: "+i);
BREAK;
END;
p:=p1-q1*(p1-p0)/(q1-q0);
fp:=F1(p);
err:=ABS(pp1);
L9:={};
L9(1):=i+1;
L9(2):=p;
L9(3):=fp;
L9(4):=p1;
L9(5):=q1;
L9(6):=p0;
L9(7):=q0;
L9(8):=err;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(i+1,colum):= L9(colum);
END;
IF err<tol THEN
PINTAraiz(i,2);
MSGBOX("RAIZ X=p: "+p);

BREAK;
END;
p0:=p1;
q0:=q1;
p1:=p;
q1:=fp;
i:=i+1;
END;
IF i>n THEN
MSGBOX("Mtodo: "+metodo+
" fall despues de: "+n+" iteraciones,
Sugerencia aumente N o
Analice convergencia columna error.");
END;
MUESTRAresult();
END;
// RAIZ FALSA POSICION
FALSAPOS(metodo,nombrefunc)
BEGIN
LOCAL fx, p0, p1, tol, n;
LOCAL p,fp,q,q0,q1,i,err;
LOCAL okdata, colum, itera;
fx:='COS(X)-X'; p0:=0.5; p1:=/4;
tol:=17; n:=20; okdata:=0;
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,p0,p1,tol,n},
" "+metodo+" V1.0 ",
{"F(X):","P0 :","P1 :","TOL:","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese 1ra aproximacin inicial P0",
"Ingrese 2da aproximacin inicial P1",
"Ingrese tolerancia ",
"Ingrese # maximo de iteraciones"},
{quote('COS(X)-X'),0.5,/4,17,20})
THEN
F1:=fx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
fx:='COS(X)-X';
END;
IF tol<0 THEN
MSGBOX("Se requiere: TOL>0")
END;
IF n<1 THEN
MSGBOX("Se requiere: N>0")

END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODORAIZFX(metodo, nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"iteracin","p=p1-q1*(p1-p0)/(q1-q0)",
"F(p)","p1","q1=F(p1)","p0","F(p0)",
"error"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
i:=1;
WHILE in DO
MUESTRAitera(i);
q0:=F1(p0);
q1:=F1(p1);
IF q0==q1 THEN
MSGBOX("ERROR! division para CERO
q0-q1=0 en
X=p0=p1: "+p1 +"
Iteracin: "+i);
BREAK;
END;
p:=p1-q1*(p1-p0)/(q1-q0);
fp:=F1(p);
err:=ABS(pp1);
L9:={};
L9(1):=i+1;
L9(2):=p;
L9(3):=fp;
L9(4):=p1;
L9(5):=q1;
L9(6):=p0;
L9(7):=q0;
L9(8):=err;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(i+1,colum):= L9(colum);
END;
IF err<tol THEN
PINTAraiz(i,2);

MSGBOX("RAIZ X=p: "+p);


BREAK;
END;
q:=F1(p);
IF q*q1<0 THEN
p0:=p1;
q0:=q1;
END;
p1:=p;
q1:=q;
i:=i+1;
END;
IF i>n THEN
MSGBOX("Mtodo: "+metodo+
" fall despues de: "+n+" iteraciones,
Sugerencia aumente N o
Analice convergencia columna error.");
END;
MUESTRAresult();
END;
// RAIZ NEWTON MEJORADO
NEWTONMEJ(metodo,nombrefunc)
BEGIN
LOCAL fx, p0, tol, n;
LOCAL dfx,d2fx,fp0,dfp0,d2fp0,p,i,err;
LOCAL okdata, colum, itera;
fx:='COS(X)-X'; p0:=/4;
tol:=110; n:=20; okdata:=0;
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,p0,tol,n},
" "+metodo+" V1.0 ",
{"F(X):","P0 :","TOL:","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese aproximacin inicial P0",
"Ingrese tolerancia ",
"Ingrese # maximo de iteraciones"},
{quote('COS(X)-X'),/4,110,20})
THEN
F1:=fx;
dfx:=EXPR("CAS.diff(QUOTE(fx),QUOTE(X))");
F2:=dfx;
d2fx:=EXPR("CAS.diff(QUOTE(dfx),QUOTE(X))");
F3:=d2fx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");

fx:='COS(X)-X';
END;
IF tol<0 THEN
MSGBOX("Se requiere: TOL>0")
END;
IF n<1 THEN
MSGBOX("Se requiere: N>0")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODORAIZFX(metodo, nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"iteracin", "p0",
"p=p0-F(p0)*dF(p0)/((dF(p0))F(p0)*d2F(p0))",
"F(p)","F(p0)","dF(p0)","d2F(p0)","error",
"dF(X)","d2F(X)"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
// ponemos dF(X)
Spreadsheet.Cell(2,9,0):=EXPR("''"+
dfx+"''");
// ponemos d2F(X)
Spreadsheet.Cell(2,10,0):=EXPR("''"+
d2fx+"''");
PRINT();
i:=1;
WHILE in DO
MUESTRAitera(i);
dfp0:=F2(p0);
d2fp0:=F3(p0);
IF (dfp0)-fp0*d2fp0==0 THEN
MSGBOX("ERROR! division para CERO
dF(p0)=0 en
X=p0: "+p0 +"
Iteracin: "+i);
BREAK;
END;
fp0:=F1(p0);
p:=p0-fp0*dfp0/((dfp0)-fp0*d2fp0);
err:=ABS(pp0);
L9:={};
L9(1):=i;

L9(2):=p0;
L9(3):=p;
L9(4):=F1(p);
L9(5):=fp0;
L9(6):=dfp0;
L9(7):=d2fp0;
L9(8):=err;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(i+1,colum):= L9(colum);
END;
IF err<tol THEN
PINTAraiz(i,3);
MSGBOX("RAIZ X=p: "+p);
BREAK;
END;
p0:=p;
i:=i+1;
END;
IF i>n THEN
MSGBOX("Mtodo: "+metodo+
" fall despues de: "+n+" iteraciones,
Sugerencia aumente N o
Analice columna error.");
END;
MUESTRAresult();
END;

//////////////////////////////////////
// "Sistema EQs lineales AX=B"
//////////////////////////////////////
SISLINEAL()
BEGIN
LOCAL metodo;
IF
CHOOSE(metodo,
"Sistema EQs lineales AX=B Mtodo:",
"Jacobi", "Gauss-Seidel",
"Sor-SobreRelajacin")
THEN
CASE
IF metodo==1 THEN
METODOSISLINEAL("JACOBI", "JACOBI");
END;
IF metodo==2 THEN
METODOSISLINEAL("GAUSS SEIDEL", "GAUSSSEIDEL");

END;
IF metodo==3 THEN
METODOSISLINEAL("SOR-SobreRelajacin","SOR");
END;
END;
ELSE START();
END;
END;
METODOSISLINEAL(metodo,nombrefunc)
BEGIN
LOCAL accion;
IF
CHOOSE(accion, "METODO: "+metodo,
"Ejecutar "+metodo,
"Ver Tabla Resultados")
THEN
CASE
IF accion==1 THEN
// JACOBI(nombrefunc,metodo); END;
EXPR(nombrefunc+"(metodo,
nombrefunc)") END;
IF accion==2 THEN
STARTAPP("Spreadsheet"); END;
// STARTAPP("Analisis Numerico") END;
END;
// RETURN accion;
ELSE SISLINEAL();
END;
END;
// SIS LINEAL JACOBI
JACOBI(metodo,nombrefunc)
BEGIN
LOCAL a, b, x0, tol, nmax;
LOCAL xk, k, ii,errabs, errrel,suma;
LOCAL okdata, colum,m,n,mb,mx0, itera;
a:=[[10,1,2,0],[1,11,1,3],
[2,1,10,1],[0,3,1,8]];
b:=[[6],[25],[11],[15]];
x0:=[[0],[0],[0],[0]];
tol:=13; nmax:=20; okdata:=0;
REPEAT
// fx:=EXPR("''"+fx+"''");
IF INPUT({a,b,x0,tol,nmax},
" "+metodo+" V1.0 ",
{"A :","B :","X0 :","TOL:","N :"},
{"Ingrese matriz A, use SHIFT 5 para [",
"Matriz B COLUMNA, use SHIFT 5 para [",
"Vector X0 COLUMNA aproximacin inicial",

"Ingrese tolerancia ",


"Ingrese # maximo de iteraciones"},
{a,b,x0,13,20})
THEN
M1:=a;
M2:=b;
M3:=x0;
M4:=M3; // USADO PARA Xk
n:=colDim(M1);
m:=rowDim(M1);
mb:=rowDim(M2);
mx0:=rowDim(M3);
CASE
IF nm THEN
MSGBOX("Se requiere matriz A cuadrada,
igual numero de filas y columnas");
END;
IF mmb OR mmx0 THEN
MSGBOX("Se requiere: IGUAL NUMERO DE FILAS:
En matriz A, Vector Col B y Vector Col X0")
END;
IF CEROSDIAG(n) THEN
MSGBOX("CEROs en DIAGONAL PRINCIPAL:
CAMBIE FILAS...!")
END;
IF tol<0 THEN
MSGBOX("Se requiere: TOL>0")
END;
IF n<1 THEN
MSGBOX("Se requiere: N>0")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOSISLINEAL(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"iteracin k", "Xk","errorAbs=max(x(k)-x(k-1))", "errorRel=errAbs/max(x(k))"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
k:=1;
M4:=M3;

WHILE knmax DO
MUESTRAitera(k);
FOR ii FROM 1 TO n DO
M4(ii,1):=(M1(ii,ii)*M3(ii,1)-(M1(ii,J)*M3(J,1),J,1,n)+M2(ii,1))/M1(ii,ii);
END;
errabs:=ROWNORM(M4-M3);
errrel:=errabs/ROWNORM(M4);
L9:={};
L9(1):=k;
L9(2):=M4;
L9(3):=errabs;
L9(4):=errrel;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(k+1,colum):= L9(colum);
END;
IF errabs<tol THEN
PINTAraiz(k,2);
MSGBOX("RAIZ Xk en iteracin k: "+k);
BREAK;
END;
M3:=M4;
k:=k+1;
END;
IF k>nmax THEN
MSGBOX("Mtodo: "+metodo+
" fall despues de: "+n+" iteraciones,
Sugerencia aumente N o
Analice columna error.");
END;
MUESTRAresult();
END;
// SIS LINEAL GAUSS-SEIDEL
GAUSSSEIDEL(metodo,nombrefunc)
BEGIN
LOCAL a, b, x0, tol, nmax;
LOCAL xk,j, k, ii,errabs, errrel,suma;
LOCAL okdata, colum,m,n,mb,mx0, itera;
a:=[[10,1,2,0],[1,11,1,3],
[2,1,10,1],[0,3,1,8]];
b:=[[6],[25],[11],[15]];
x0:=[[0],[0],[0],[0]];
tol:=13; nmax:=20; okdata:=0;
REPEAT
// fx:=EXPR("''"+fx+"''");
IF INPUT({a,b,x0,tol,nmax},
" "+metodo+" V1.0 ",
{"A :","B :","X0 :","TOL:","N :"},

{"Ingrese matriz A, use SHIFT 5 para [",


"Matriz B COLUMNA, use SHIFT 5 para [",
"Vector X0 COLUMNA aproximacin inicial",
"Ingrese tolerancia ",
"Ingrese # maximo de iteraciones"},
{a,b,x0,13,20})
THEN
M1:=a;
M2:=b;
M3:=x0;
M4:=M3; // USADO PARA Xk
n:=colDim(M1);
m:=rowDim(M1);
mb:=rowDim(M2);
mx0:=rowDim(M3);
CASE
IF nm THEN
MSGBOX("Se requiere matriz A cuadrada,
igual numero de filas y columnas");
END;
IF mmb OR mmx0 THEN
MSGBOX("Se requiere: IGUAL NUMERO DE FILAS:
En matriz A, Vector Col B y Vector Col X0")
END;
IF CEROSDIAG(n) THEN
MSGBOX("CEROs en DIAGONAL PRINCIPAL:
CAMBIE FILAS...!")
END;
IF tol<0 THEN
MSGBOX("Se requiere: TOL>0")
END;
IF n<1 THEN
MSGBOX("Se requiere: N>0")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOSISLINEAL(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"iteracin k", "Xk","errorAbs=max(x(k)-x(k-1))", "errorRel=errAbs/max(x(k))"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;

PRINT();
k:=1;
M4:=M3;
WHILE knmax DO
MUESTRAitera(k);
FOR ii FROM 1 TO n DO
CASE
IF ii==1 THEN
M4(ii,1):=(M2(ii,1)(M1(ii,J)*M3(J,1),J,ii+1,n))/M1(ii,ii);
END;
IF ii==n THEN
M4(ii,1):=(M2(ii,1)(M1(ii,J)*M4(J,1),J,1,ii-1))/M1(ii,ii);
END;
DEFAULT
M4(ii,1):=(M2(ii,1)(M1(ii,J)*M4(J,1),J,1,ii-1)(M1(ii,J)*M3(J,1),J,ii+1,n))/M1(ii,ii);
END;
END;
errabs:=ROWNORM(M4-M3);
errrel:=errabs/ROWNORM(M4);
L9:={};
L9(1):=k;
L9(2):=M4;
L9(3):=errabs;
L9(4):=errrel;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(k+1,colum):= L9(colum);
END;
IF errabs<tol THEN
PINTAraiz(k,2);
MSGBOX("RAIZ Xk en iteracin k: "+k);
BREAK;
END;
M3:=M4;
k:=k+1;
END;
IF k>nmax THEN
MSGBOX("Mtodo: "+metodo+
" fall despues de: "+n+" iteraciones,
Sugerencia aumente N o
Analice columna error.");
END;
MUESTRAresult();
END;

// SIS LINEAL SOR


SOR(metodo,nombrefunc)
BEGIN
LOCAL a, b, x0, w, tol, nmax;
LOCAL xk,j, k, ii,errabs, errrel,suma;
LOCAL okdata, colum,m,n,mb,mx0, itera;
a:=[[4,3,0],[3,4,1],[0,1,4]];
b:=[[24],[30],[24]];
x0:=[[1],[1],[1]];
w:=1.25; tol:=13; nmax:=20; okdata:=0;
REPEAT
// fx:=EXPR("''"+fx+"''");
IF INPUT({a,b,x0,w,tol,nmax},
" "+metodo+" V1.0 ",
{"A :","B :","X0 :", "w :","TOL:","N :"},
{"Ingrese matriz A, use SHIFT 5 para [",
"Matriz B COLUMNA, use SHIFT 5 para [",
"Vector X0 COLUMNA aproximacin inicial",
"Ingrese parametro aceleracin w",
"Ingrese tolerancia ",
"Ingrese # maximo de iteraciones"},
{a,b,x0,1.25,13,20})
THEN
M1:=a;
M2:=b;
M3:=x0;
M4:=M3; // USADO PARA Xk
n:=colDim(M1);
m:=rowDim(M1);
mb:=rowDim(M2);
mx0:=rowDim(M3);
CASE
IF nm THEN
MSGBOX("Se requiere matriz A cuadrada,
igual numero de filas y columnas");
END;
IF mmb OR mmx0 THEN
MSGBOX("Se requiere: IGUAL NUMERO DE FILAS:
En matriz A, Vector Col B y Vector Col X0")
END;
IF CEROSDIAG(n) THEN
MSGBOX("CEROs en DIAGONAL PRINCIPAL:
CAMBIE FILAS...!")
END;
IF tol<0 THEN
MSGBOX("Se requiere: TOL>0")
END;
IF n<1 THEN
MSGBOX("Se requiere: N>0")

END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOSISLINEAL(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"iteracin k", "Xk","errorAbs=max(x(k)-x(k-1))", "errorRel=errAbs/max(x(k))"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
k:=1;
M4:=M3;
WHILE knmax DO
MUESTRAitera(k);
FOR ii FROM 1 TO n DO
CASE
IF ii==1 THEN
M4(ii,1):=(1-w)*M3(ii,1)+w*(M2(ii,1)(M1(ii,J)*M3(J,1),J,ii+1,n))/M1(ii,ii);
END;
IF ii==n THEN
M4(ii,1):=(1-w)*M3(ii,1)+w*(M2(ii,1)(M1(ii,J)*M4(J,1),J,1,ii-1))/M1(ii,ii);
END;
DEFAULT
M4(ii,1):=(1-w)*M3(ii,1)+w*(M2(ii,1)(M1(ii,J)*M4(J,1),J,1,ii-1)(M1(ii,J)*M3(J,1),J,ii+1,n))/M1(ii,ii);
END;
END;
errabs:=ROWNORM(M4-M3);
errrel:=errabs/ROWNORM(M4);
L9:={};
L9(1):=k;
L9(2):=M4;
L9(3):=errabs;
L9(4):=errrel;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(k+1,colum):= L9(colum);
END;
IF errabs<tol THEN

PINTAraiz(k,2);
MSGBOX("RAIZ Xk en iteracin k: "+k);
BREAK;
END;
M3:=M4;
k:=k+1;
END;
IF k>nmax THEN
MSGBOX("Mtodo: "+metodo+
" fall despues de: "+n+" iteraciones,
Sugerencia aumente N o
Analice columna error.");
END;
MUESTRAresult();
END;
CEROSDIAG(n)
BEGIN
LOCAL ii,cerodiagonal:=1;
FOR ii FROM 1 TO n DO
cerodiagonal:=cerodiagonal*M1(ii,ii);
END;
RETURN NOT cerodiagonal;
END;
/////////////////////////////////////
// "Interpolacin X F(X)"
/////////////////////////////////////
INTERPOL()
BEGIN
LOCAL metodo;
IF
CHOOSE(metodo,
"Interpolacin - Mtodo:",
"Lagrange","Cbico Natural","Cbico Sujeto")
THEN
CASE
IF metodo==1 THEN
METODOINTERPOL("LAGRANGE", "LAGRANG");
END;
IF metodo==2 THEN
METODOINTERPOL("CUBICO NATURAL", "CUBNATURAL");
END;
IF metodo==3 THEN
METODOINTERPOL("CUBICO SUJETO","CUBSUJETO");
END;
END;
ELSE START();

END;
END;
METODOINTERPOL(metodo,nombrefunc)
BEGIN
LOCAL accion;
IF
CHOOSE(accion, "METODO: "+metodo,
"Ejecutar "+metodo,
"Ver Tabla Resultados")
THEN
CASE
IF accion==1 THEN
EXPR(nombrefunc+"(metodo,
nombrefunc)") END;
IF accion==2 THEN
STARTAPP("Spreadsheet"); END;
// STARTAPP("Analisis Numerico") END;
END;
// RETURN accion;
ELSE INTERPOL();
END;
END;
// INTERPOLACION LAGRANGE
LAGRANG(metodo, nombrefunc)
BEGIN
LOCAL a, xint;
LOCAL ii,j,k,xk,fxk,xi,px;
LOCAL lknum,lkden,lk,interpola;
LOCAL okdata, colum,m,mm1,n;
a:=[[1,0.7651977],[1.3,0.6200860],
[1.6,0.4554022],[1.9,0.2818186],
[2.2,0.1103623]];
xint:=1.5; okdata:=0;
REPEAT
// fx:=EXPR("''"+fx+"''");
IF INPUT({a,xint},
" "+metodo+" V1.0 ",
{"x fx:","x interpolar:"},
{"Matriz COL1=xi, COL2=fxi, Shift 5 inicia MTRw",
"Valor de x a interpolar x0xxn"},
{a,xint})
THEN
M1:=a;
n:=colDim(M1);
m:=rowDim(M1);
mm1:=m-1;

CASE
IF n2 THEN
MSGBOX("Se requiere matriz con 2 columnas
COL1=xi COL2=fxi");
END;
IF m<2 THEN
MSGBOX("Se requiere: matriz con
ALMENOS 2 FILAS:
(n+1) puntos(filas) generan polinomio grado n")
END;
IF xintM1(1,1) OR xintM1(m,1) THEN
MSGBOX("Se requiere:
X0<Xinterpolar<Xn (n+1)")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTERPOL(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"k","LkNUM","LkDENOM","LkNUMdesarrollado",
"LkDENOMdesaroll.","Lk(X)","F(Xi)",
"Xinterpolar", "Lk(Xinterp.)"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
print();
k:=1;
// crear px
px:=MAKEMAT(0,m);
FOR k FROM 1 TO m DO
// crear lk
// crear L8=lknum L7=lkden
xk:=M1(k,1); fxk:=M1(k,2);
L8:={};
lknum:=""; lkden:="";
j:=1;
FOR ii FROM 1 TO m DO
xi:=M1(ii,1);
IF iik THEN
L8(j):=M1(ii,1);
IF j==1 THEN
lknum:=lknum+"(X-"+xi+")";

lkden:=lkden+"("+xk+"-"+xi+")";
ELSE
lknum:=lknum+"*(X-"+xi+")";
lkden:=lkden+"*("+xk+"-"+xi+")";
END;
j:=j+1;
END;
END;
//print(expand(fcoeff(L8)));
L9:={};
L9(1):=k-1;
L9(2):=lknum;
L9(3):=lkden;
M8:=POLYCOEF(L8);
L9(4):=VEC2POLY(M8);
L9(5):=POLYEVAL(M8,xk);
M8:=M8/POLYEVAL(M8,xk); //Lkcoeficientes
px:=px+M8*fxk;
L9(6):=VEC2POLY(M8);
L9(7):=fxk;
L9(8):=xint;
L9(9):=POLYEVAL(M8,xint);
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(k+1,colum):= L9(colum);
END;
END;
Spreadsheet.Cell(m+3,2):="P(X)=(fxk*lk,k=0,n)";
Spreadsheet.Cell(m+4,2):=VEC2POLY(px);
Spreadsheet.Cell(m+6,1):="Xinterpolar";
Spreadsheet.Cell(m+6,2):="F(Xinterp.)";
Spreadsheet.Cell(m+7,1):=xint;
Spreadsheet.Cell(m+7,2):=POLYEVAL(px,xint);
ii:=0;
IF CHOOSE(interpola,"Accin?",
{"INTERPOLAR","VER RESULTADOS Y P(X)"})
THEN
WHILE interpola==1 DO
IF INPUT({xint},
" LAGRANGE ",
{"x interpolar:"},
{"Valor de x a interpolar x0xxn"},
{xint})

THEN
ii:=ii+1;
Spreadsheet.Cell(m+7+ii,1):=xint;
Spreadsheet.Cell(m+7+ii,2):=POLYEVAL(px,xint);
MSGBOX("Xinterp: "+xint+"
P(Xinterp): "+POLYEVAL(px,xint));
END;
IF CHOOSE(interpola,"Accin?",
{"INTERPOLAR","VER RESULTADOS Y P(X)"})
THEN
END;
END;
END;
MUESTRAresult();
END;
VEC2POLY(vect)
BEGIN
LOCAL ii,n,pol,vectres,retxn;
M7:=vect;
n:=head(SIZE(M7));
CASE
IF n==0 THEN RETURN(""); END;
IF n==1 THEN RETURN(""+vect(1)); END;
IF n==2 THEN RETURN(
""+vect(1)+"*X+"+vect(2)); END;
DEFAULT
pol:="";
FOR ii FROM 1 TO n-2 DO
pol:=pol+vect(ii)+"*X^"+(n-ii)+"+";
END;
pol:=pol+vect(n-1)+"*X+"+vect(n);
END;
RETURN pol;
END;
// INTERPOLACION CUBICO NATURAL
CUBNATURAL(metodo,nombrefunc)
BEGIN
LOCAL a, xint;
LOCAL ii,j,hi,li,ui,zi,xi,sjx;
LOCAL bj,cj,dj,alfai,xj,interpola;
LOCAL okdata, colum,m,mm1,n;
a:=[[.9,1.3],[1.3,1.5],[1.9,1.85],[2.1,2.1],[2.6,2.6],[3,2.7],[3.9,2.4],[4.4,2.15],[4.7,2.05],
[5,2.1],[6,2.25],[7,2.3],[8,2.25],[9.2,1.95],[10.5,1.4],[11.3,.9],[11.6,.7],[12,.6],[12.6,.5],
[13,.4],[13.3,.25]];
xint:=5.5; okdata:=0;
REPEAT

// fx:=EXPR("''"+fx+"''");
IF INPUT({a},
" "+metodo+" V1.0 ",
{"x fx:"},
{"Matriz COL1=xi, COL2=fxi, Shift 5 inicia MTRw"},
{a})
THEN
M1:=a;
n:=colDim(M1);
m:=rowDim(M1);
mm1:=m-1;
CASE
IF n2 THEN
MSGBOX("Se requiere matriz con 2 columnas
COL1=xi COL2=fxi");
END;
IF m<2 THEN
MSGBOX("Se requiere: matriz con
ALMENOS 2 FILAS:
(n+1) puntos(filas) generan polinomio grado n")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTERPOL(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"j","xj","aj=fxj","bj","cj","dj"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
print();
// crear vectores hi(m)
hi:=MAKEMAT(0,m); // solo hi(mm1)
bj:=hi;
cj:=hi;
dj:=hi;
// crear alfai=li=ui=zi(n)
alfai:=MAKEMAT(0,m);
li:=alfai;
ui:=li;

zi:=li;
FOR ii FROM 1 TO mm1 DO
hi(ii):=M1(ii+1,1)-M1(ii,1);
END;
M2:=hi;
FOR ii FROM 2 TO mm1 DO
alfai(ii):=3/hi(ii)*(M1(ii+1,2)-M1(ii,2))3/hi(ii-1)*(M1(ii,2)-M1(ii-1,2))
END;
//alfa0:=3*(M1(2,2)-M1(1,2))/M2(1)-3*M1(1,2);
li(1):=1;
ui(1):=0;
zi(1):=0;
FOR ii FROM 2 TO mm1 DO
li(ii):=2*(M1(ii+1,1)-M1(ii-1,1))hi(ii-1)*ui(ii-1);
ui(ii):=hi(ii)/li(ii);
zi(ii):=(alfai(ii)-hi(ii-1)*zi(ii-1))/li(ii);
END;
li(m):=1;
zi(m):=0;
cj(m):=0;
FOR j FROM mm1 DOWNTO 1 DO
cj(j):=zi(j)-ui(j)*cj(j+1);
bj(j):=(M1(j+1,2)-M1(j,2))/hi(j)hi(j)*(cj(j+1)+2*cj(j))/3;
dj(j):=(cj(j+1)-cj(j))/(3*hi(j));
END;
FOR ii from 1 TO mm1 DO
L9:={};
L9(1):=ii-1;
L9(2):=M1(ii,1);
L9(3):=M1(ii,2);
L9(4):=bj(ii);
L9(5):=cj(ii);
L9(6):=dj(ii);
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(ii+1,colum):= L9(colum);
END;

END;
Spreadsheet.Cell(m+1,SIZE(L9)-2):="Cn =";
Spreadsheet.Cell(m+1,SIZE(L9)-1):=cj(m);
Spreadsheet.Cell(m+3,2):=
"Sj(X)=aj+bj*(X-Xj)+cj*(X-Xj)^2+dj*(X-Xj)^3";
Spreadsheet.Cell(m+4,2):="Se elige Sj: aj,bj..
Dependiendo del X a interpolar";
Spreadsheet.Cell(m+6,1):="Xinterpolar";
Spreadsheet.Cell(m+6,2):="Sj(Xinterp.)";
Spreadsheet.Cell(m+6,3):="j, para usar aj,bj..";
//Spreadsheet.Cell(m+7,1):=xint;
//Spreadsheet.Cell(m+7,2):=POLYEVAL(px,xint);
ii:=0;
IF CHOOSE(interpola,"Accin?",
{"INTERPOLAR","VER RESULTADOS Y Sj"})
THEN
WHILE interpola==1 DO
okdata:=O;
REPEAT
IF INPUT({xint},
metodo,
{"x interpolar:"},
{"Valor de x a interpolar x0xxn"},
{xint})
THEN
CASE
IF xintM1(1,1) OR xintM1(m,1) THEN
MSGBOX("Se requiere:
X0<Xinterpolar<Xn (n+1)")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( " INTERPOLACIN " + " CANCELADA...");
// METODOINTERPOL(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
ii:=ii+1;
Spreadsheet.Cell(m+6+ii,1):=xint;
j:=0;
WHILE M1(j+1,1)xint DO
j:=j+1;
END;
// j:=j; // indice de matriz desde 1.
xj:=M1(j,1);

sjx:=M1(j,2)+bj(j)*(xint-xj)+cj(j)*(xint-xj)^2+dj(j)*(xint-xj)^3;
Spreadsheet.Cell(m+6+ii,2):=sjx;
Spreadsheet.Cell(m+6+ii,3):=j-1;
MSGBOX("Xinterp: "+xint+"
Sj(Xinterp): "+ sjx +"
j: "+(j-1));
// END;
IF CHOOSE(interpola,"Accin?",
{"INTERPOLAR","VER RESULTADOS Y Sj"})
THEN
END;
END; // while interpola
END; // primer menu interpola /result
MUESTRAresult();
RETURN(0);
END;
// INTERPOLACION CUBICO SUJETO
CUBSUJETO(metodo,nombrefunc)
BEGIN
LOCAL a, xint;
LOCAL ii,j,hi,li,ui,zi,xi,sjx;
LOCAL bj,cj,dj,alfai,xj,interpola;
LOCAL okdata,colum,m,mm1,n,dfx0,dfxn;
a:=[[.9,1.3],[1.3,1.5],[1.9,1.85],[2.1,2.1],[2.6,2.6],[3,2.7],[3.9,2.4],[4.4,2.15],[4.7,2.05],
[5,2.1],[6,2.25],[7,2.3],[8,2.25],[9.2,1.95],[10.5,1.4],[11.3,.9],[11.6,.7],[12,.6],[12.6,.5],
[13,.4],[13.3,.25]];
xint:=5.5; okdata:=0;
dfx0:=0.5; dfxn:=0.2;
REPEAT
// fx:=EXPR("''"+fx+"''");
IF INPUT({a,dfx0,dfxn},
" "+metodo+" V1.0 ",
{"x fx:","dfx0","dfxn"},
{"Matriz COL1=xi, COL2=fxi, Shift 5 inicia MTRw",
"Ingrese df(X0)","Ingrese df(Xn)"},
{a,dfx0,dfxn})
THEN
M1:=a;
n:=colDim(M1);
m:=rowDim(M1);
mm1:=m-1;
CASE
IF n2 THEN

MSGBOX("Se requiere matriz con 2 columnas


COL1=xi COL2=fxi");
END;
IF m<2 THEN
MSGBOX("Se requiere: matriz con
ALMENOS 2 FILAS:
(n+1) puntos(filas) generan polinomio grado n")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTERPOL(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"j","xj","aj=fxj","bj","cj","dj"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
print();
// crear vectores hi(m)
hi:=MAKEMAT(0,m); // solo hi(mm1)
bj:=hi;
cj:=hi;
dj:=hi;
// crear alfai=li=ui=zi(n)
alfai:=MAKEMAT(0,m);
li:=alfai;
ui:=li;
zi:=li;
FOR ii FROM 1 TO mm1 DO
hi(ii):=M1(ii+1,1)-M1(ii,1);
END;
M2:=hi;
alfai(1):=3*(M1(2,2)-M1(1,2))/hi(1)-3*dfx0;
alfai(m):=3*dfxn-3*(M1(m,2)-M1(mm1,2))/hi(mm1);
FOR ii FROM 2 TO mm1 DO
alfai(ii):=3/hi(ii)*(M1(ii+1,2)-M1(ii,2))3/hi(ii-1)*(M1(ii,2)-M1(ii-1,2))
END;

li(1):=2*hi(1);
ui(1):=0.5;
zi(1):=alfai(1)/li(1);
FOR ii FROM 2 TO mm1 DO
li(ii):=2*(M1(ii+1,1)-M1(ii-1,1))hi(ii-1)*ui(ii-1);
ui(ii):=hi(ii)/li(ii);
zi(ii):=(alfai(ii)-hi(ii-1)*zi(ii-1))/li(ii);
END;
li(m):=hi(mm1)*(2-ui(mm1));
zi(m):=(alfai(m)-hi(mm1)*zi(mm1))/li(m);
cj(m):=zi(m);
FOR j FROM mm1 DOWNTO 1 DO
cj(j):=zi(j)-ui(j)*cj(j+1);
bj(j):=(M1(j+1,2)-M1(j,2))/hi(j)hi(j)*(cj(j+1)+2*cj(j))/3;
dj(j):=(cj(j+1)-cj(j))/(3*hi(j));
END;
FOR ii from 1 TO mm1 DO
L9:={};
L9(1):=ii-1;
L9(2):=M1(ii,1);
L9(3):=M1(ii,2);
L9(4):=bj(ii);
L9(5):=cj(ii);
L9(6):=dj(ii);
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(ii+1,colum):= L9(colum);
END;
END;
Spreadsheet.Cell(m+1,SIZE(L9)-2):="Cn =";
Spreadsheet.Cell(m+1,SIZE(L9)-1):=cj(m);
Spreadsheet.Cell(m+3,2):=
"Sj(X)=aj+bj*(X-Xj)+cj*(X-Xj)^2+dj*(X-Xj)^3";
Spreadsheet.Cell(m+4,2):="Se elige Sj: aj,bj..
Dependiendo del X a interpolar";
Spreadsheet.Cell(m+6,1):="Xinterpolar";
Spreadsheet.Cell(m+6,2):="Sj(Xinterp.)";
Spreadsheet.Cell(m+6,3):="j, para usar aj,bj..";
//Spreadsheet.Cell(m+7,1):=xint;
//Spreadsheet.Cell(m+7,2):=POLYEVAL(px,xint);

ii:=0;
IF CHOOSE(interpola,"Accin?",
{"INTERPOLAR","VER RESULTADOS Y Sj"})
THEN
WHILE interpola==1 DO
okdata:=O;
REPEAT
IF INPUT({xint},
metodo,
{"x interpolar:"},
{"Valor de x a interpolar x0xxn"},
{xint})
THEN
CASE
IF xintM1(1,1) OR xintM1(m,1) THEN
MSGBOX("Se requiere:
X0<Xinterpolar<Xn (n+1)")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( " INTERPOLACIN " + " CANCELADA...");
// METODOINTERPOL(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
ii:=ii+1;
Spreadsheet.Cell(m+6+ii,1):=xint;
j:=0;
WHILE M1(j+1,1)xint DO
j:=j+1;
END;
// j:=j; // indice de matriz desde 1.
xj:=M1(j,1);
sjx:=M1(j,2)+bj(j)*(xint-xj)+cj(j)*(xint-xj)^2+dj(j)*(xint-xj)^3;
Spreadsheet.Cell(m+6+ii,2):=sjx;
Spreadsheet.Cell(m+6+ii,3):=j-1;
MSGBOX("Xinterp: "+xint+"
Sj(Xinterp): "+ sjx +"
j: "+(j-1));
// END;
IF CHOOSE(interpola,"Accin?",
{"INTERPOLAR","VER RESULTADOS Y Sj"})
THEN
END;
END; // while interpola

END; // primer menu interpola /result


MUESTRAresult();
RETURN(0);
END;
/////////////////////////////////////
// "Integrales 1, 2, 3 VAR"
/////////////////////////////////////
INTEGRALES()
BEGIN
LOCAL metodo;
IF
CHOOSE(metodo,
"Integrales - Mtodo:",
"Simple","Compuesta","Multiple")
THEN
CASE
IF metodo==1 THEN
SIMPLE();
// METODOINTEGRAL("SIMPLE", "SIMPLE");
END;
IF metodo==2 THEN
COMPUESTA();
// METODOINTEGRAL("COMPUESTA", "COMPUESTA");
END;
IF metodo==3 THEN
MULTIPLE();
// METODOINTEGRAL("MULTIPLE","MULTIPLE");
END;
END;
ELSE START();
END;
END;
// INTEGRAL SIMPLE
SIMPLE()
BEGIN
LOCAL metodo2;
IF
CHOOSE(metodo2,
"Integrales Simple:",
"Cerradas:Trapec. Simps. Simp3/8 +","Abiertas: PtoMedio +","Cuadratura Gauss")
THEN
CASE
IF metodo2==1 THEN
METODOINTEGRALSIMPLE("CERRADAS NEWT.COT", "CERRADASNC");
END;
IF metodo2==2 THEN

METODOINTEGRALSIMPLE("ABIERTAS NEWT.COT", "ABIERTASNC");


END;
IF metodo2==3 THEN
METODOINTEGRALSIMPLE("CUADRATURA GAUSS","CUADGAUSS");
END;
END;
ELSE INTEGRALES();
END;
END;
// CODIGO SIGUIENTE NECESARIO PARA REGRESAR A MENU ANTERIOR.
METODOINTEGRALSIMPLE(metodo,nombrefunc)
BEGIN
LOCAL accion;
IF
CHOOSE(accion, "METODO: "+metodo,
"Ejecutar "+metodo,
"Ver Tabla Resultados")
THEN
CASE
IF accion==1 THEN
EXPR(nombrefunc+"(metodo,
nombrefunc)") END;
IF accion==2 THEN
STARTAPP("Spreadsheet"); END;
// STARTAPP("Analisis Numerico") END;
END;
// RETURN accion;
ELSE SIMPLE();
END;
END;
//
// INTEGRALES CERRADAS DE NEWTON COTES.
CERRADASNC(metodo,nombrefunc)
BEGIN
LOCAL fx, a, b, n;
LOCAL h,sum,ii,xi,fxi;
LOCAL okdata, colum, itera;
L8:={ {'1/2',1,1,"N=1 TRAPECIO","(F(X),X,X0,X1)=(h/2)*(F(X0)+F(X1))(h^3/12)*f()"},
{'1/3',1,4,1,"N=2 SIMPSON","(F(X),X,X0,X2)=(h/2)*(F(X0)+4*F(X1)+F(X2))(h^5/90)*f()"},
{'3/8',1,3,3,1,"N=3 SIMPSON
3/8","(F(X),X,X0,X3)=(3*h/8)*(F(X0)+3*F(X1)+3*F(X2)+F(X3))(3*h^5/80)*f()"},
{'2/45',7,32,12,32,7,"N=4
SinNOMBRE","(F(X),X,X0,X4)=(2*h/45)*(7*F(X0)+32*F(X1)+12*F(X2)+32*F(X3)
+7*F(X4))-(8*h^7/945)*f()"}};
fx:='SIN(X)'; a:=0; b:=/4; n:=1; okdata:=0;
REPEAT

fx:=EXPR("''"+fx+"''");
IF INPUT({fx,a,b,n},
" "+metodo+" V1.0 ",
{"F(X):","A :","B :","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese limite inferior A",
"Ingrese limite superior B",
"1.Trapecio 2.Simp 3.Simp3/8 4.SinNombre"},
{quote('SIN(X)'),0,/4,1})
THEN
F1:=fx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
fx:='SIN(X)';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<1 OR n>4 OR IP(n)n THEN
MSGBOX("Se requiere: ENTERO (1N4)")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTEGRALSIMPLE(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
L8:=L8(n); // actualizar coeficientes de acuerdo a n
sum:=0;
h:=(b-a)/n;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i", "Xi","F(Xi)","Coef","Coef*F(Xi)"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
// i:=1;
FOR ii FROM 0 TO n DO
MUESTRAitera(ii);
xi:=a+ii*h;
fxi:=F1(xi);

L9:={};
L9(1):=ii;
L9(2):=xi;
L9(3):=fxi;
L9(4):=L8(ii+2);
sum:=sum+L8(ii+2)*fxi;
L9(5):=L8(ii+2)*fxi;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(ii+2,colum):= L9(colum);
END;
END; // fin del lazo for i..0..n
// agregando mas detalles al spreadsheed
Spreadsheet.Cell(n+4,2):= metodo;
Spreadsheet.Cell(n+4,3):= L8(n+3);
Spreadsheet.Cell(n+5,2):= "Formula:";
Spreadsheet.Cell(n+5,3):= L8(n+4);
Spreadsheet.Cell(n+6,2):= "h=";
Spreadsheet.Cell(n+6,3):= h;
Spreadsheet.Cell(n+7,2):= "RESULT=";
Spreadsheet.Cell(n+7,3):= approx(sum*L8(1)*h);
MUESTRAresult();
END;
//
// INTEGRALES ABIERTAS DE NEWTON COTES.
ABIERTASNC(metodo,nombrefunc)
BEGIN
LOCAL fx, a, b, n;
LOCAL h,sum,ii,xi,fxi;
LOCAL okdata, colum, itera;
L8:={ {2,1,"N=0 PUNTO MEDIO","(F(X),X,X-1,X1)=(2*h)*F(X0)+(h^3/3)*f()"},
{'3/2',1,1,"N=1 SinNOMBRE","(F(X),X,X-1,X2)=(3*h/2)*(F(X0)+F(X1))
+(3*h^6/4)*f()"},
{'4/3',2,-1,2,"N=2 SinNOMBRE","(F(X),X,X-1,X3)=(4*h/3)*(2*F(X0)F(X1)+2*F(X2))+(14*h^5/45)*f()"},
{'5/24',11,1,1,11,"N=3 SinNOMBRE","(F(X),X,X1,X4)=(5*h/24)*(11*F(X0)+F(X1)+F(X2)+11*F(X3))+(95*h^5/144)*f()"}};
fx:='SIN(X)'; a:=0; b:=/4; n:=0; okdata:=0;
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,a,b,n},
" "+metodo+" V1.0 ",
{"F(X):","A :","B :","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",

"Ingrese limite inferior A",


"Ingrese limite superior B",
"0.PUNTO MEDIO 1.SinNombre 2.SinNomb 3.SinNomb"},
{quote('SIN(X)'),0,/4,0})
THEN
F1:=fx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
fx:='SIN(X)';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<0 OR n>3 OR IP(n)n THEN
MSGBOX("Se requiere: ENTERO (0N3)")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTEGRALSIMPLE(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
L8:=L8(n+1); // actualizar coeficientes de acuerdo a n (n+1 abiertas)
sum:=0;
h:=(b-a)/(n+2);
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i", "Xi","F(Xi)","Coef","Coef*F(Xi)"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
// i:=1;
FOR ii FROM 0 TO n DO
MUESTRAitera(ii);
xi:=a+(ii+1)*h;
fxi:=F1(xi);
L9:={};
L9(1):=ii;
L9(2):=xi;
L9(3):=fxi;
L9(4):=L8(ii+2);

sum:=sum+L8(ii+2)*fxi;
L9(5):=L8(ii+2)*fxi;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(ii+2,colum):= L9(colum);
END;
END; // fin del lazo for i..0..n
// agregando mas detalles al spreadsheet
Spreadsheet.Cell(n+4+1,2):= metodo;
Spreadsheet.Cell(n+4+1,3):= L8(n+3);
Spreadsheet.Cell(n+5+1,2):= "Formula:";
Spreadsheet.Cell(n+5+1,3):= L8(n+4);
Spreadsheet.Cell(n+6+1,2):= "h=";
Spreadsheet.Cell(n+6+1,3):= h;
Spreadsheet.Cell(n+7+1,2):= "RESULT=";
Spreadsheet.Cell(n+7+1,3):= approx(sum*L8(1)*h);
MUESTRAresult();
END;
//
// INTEGRAL CUADRATURA DE GAUSS.
CUADGAUSS(metodo,nombrefunc)
BEGIN
LOCAL fx, a, b, n;
LOCAL sum,t,c,w,bpa,ii,xi,fxi;
LOCAL okdata, colum, itera;
L8:={
{ { '(1/3)', '(1/3)' }, {1,1} },
{ { '(3/5)', 0, '(3/5)' }, {'5/9','8/9','5/9'} }
};
fx:='EXP(-X^2)'; a:=1; b:=1.5; n:=2; okdata:=0;
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,a,b,n},
" "+metodo+" V1.0 ",
{"F(X):","A :","B :","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese limite inferior A",
"Ingrese limite superior B",
"Numero de nodos o puntos 2 o 3"},
{quote('EXP(-X^2)'),1,1.5,2})
THEN
F1:=fx;
CASE

IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
fx:='EXP(-X^2)';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<2 OR n>3 OR IP(n)n THEN
MSGBOX("Se requiere: N ENTERO = 2 o 3")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTEGRALSIMPLE(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
L8:=L8(n-1); // actualizar coeficientes de acuerdo a n (n-1 posicion en lista L8)
sum:=0;
t:=L8(1);
c:=L8(2);
w:=(b-a)/2;
bpa:=(b+a)/2;
//h:=(b-a)/(n+2);
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i","Ti", "Xi","F(Xi)","Ci","Ci*F(Xi)"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
// i:=1;
FOR ii FROM 1 TO n DO
MUESTRAitera(ii);
xi:=approx(w*t(ii))+bpa;
fxi:=F1(xi);
L9:={};
L9(1):=ii;
L9(2):=t(ii);
L9(3):=xi;
L9(4):=fxi;
L9(5):=c(ii);
sum:=sum+approx(c(ii)*fxi);
L9(6):=approx(c(ii)*fxi);

FOR colum FROM 1 TO SIZE(L9)


DO
Spreadsheet.Cell(ii+1,colum):= L9(colum);
END;
END; // fin del lazo for i..1..n
// agregando mas detalles al spreadsheet
Spreadsheet.Cell(n+2+1,2):= metodo;
Spreadsheet.Cell(n+2+1,3):= "Nro. Nodos n="+n;
Spreadsheet.Cell(n+3+1,2):= "Formula:";
Spreadsheet.Cell(n+3+1,3):= "I=w*(Ci*F(Xi),i,1,n))";
Spreadsheet.Cell(n+4+1,2):= "w=(b-a)/2";
Spreadsheet.Cell(n+4+1,3):= w;
Spreadsheet.Cell(n+5+1,2):= "Ci= n valores ctes (coeficientes)";
Spreadsheet.Cell(n+6+1,2):= "Xi=(b-a)/2*Ti+(b+a)/2";
Spreadsheet.Cell(n+7+1,2):= "Ti= n valores ctes (raices)";
Spreadsheet.Cell(n+8+1,2):= "(Ci*F(Xi),i,1,n))=";
Spreadsheet.Cell(n+8+1,3):= sum;
Spreadsheet.Cell(n+9+1,2):= "RESULT I=";
Spreadsheet.Cell(n+9+1,3):= approx(sum*w);
MUESTRAresult();
END;
// INTEGRALE COMPUESTA
COMPUESTA()
BEGIN
LOCAL metodo2;
IF
CHOOSE(metodo2,
"Integral Compuesta/Generalizado:",
"Trapecio Gen","Simpson Gen","Punto Medio Gen")
THEN
CASE
IF metodo2==1 THEN
METODOINTEGRALCOMPUESTA("TRAPECIO GEN o COMP",
"TRAPECIOGEN");
END;
IF metodo2==2 THEN
METODOINTEGRALCOMPUESTA("SIMPSON GEN o COMP Gen",
"SIMPSONGEN");
END;
IF metodo2==3 THEN
METODOINTEGRALCOMPUESTA("PUNTO MEDIO GEN","PTOMEDIOGEN");
END;
END;

ELSE INTEGRALES();
END;
END;
// CODIGO SIGUIENTE NECESARIO PARA REGRESAR A MENU ANTERIOR.
METODOINTEGRALCOMPUESTA(metodo,nombrefunc)
BEGIN
LOCAL accion;
IF
CHOOSE(accion, "METODO: "+metodo,
"Ejecutar "+metodo,
"Ver Tabla Resultados")
THEN
CASE
IF accion==1 THEN
EXPR(nombrefunc+"(metodo,
nombrefunc)") END;
IF accion==2 THEN
STARTAPP("Spreadsheet"); END;
// STARTAPP("Analisis Numerico") END;
END;
// RETURN accion;
ELSE COMPUESTA();
END;
END;
//
// INTEGRAL SIMPSON COMPUESTA o GENERALIZADO.
SIMPSONGEN(metodo,nombrefunc)
BEGIN
LOCAL fx, a, b, n;
LOCAL h,simp,spar,ii,xi,fxi,fa,fb;
LOCAL okdata, colum, itera;
fx:='SIN(X)'; a:=0; b:=; n:=20; okdata:=0;
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,a,b,n},
" "+metodo+" V1.0 ",
{"F(X):","A :","B :","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese limite inferior A",
"Ingrese limite superior B",
"N=Num. PAR de TRAMOS, (SUBinterv=N/2)"},
{quote('SIN(X)'),0,,20})
THEN
F1:=fx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");

fx:='SIN(X)';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<0 OR FP(n/2)0 OR IP(n)n THEN
MSGBOX("Se requiere: N ENTERO PAR")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTEGRALCOMPUESTA(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
simp:=0;
spar:=0;
h:=(b-a)/n;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i", "Xi","F(Xi)"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
// i:=1;
FOR ii FROM 0 TO n DO
MUESTRAitera(ii);
xi:=a+ii*h;
fxi:=F1(xi);
L9:={};
L9(1):=ii;
L9(2):=xi;
L9(3):=fxi;
IF ii >0 AND ii<n THEN
IFTE(FP(ii/2),simp:=simp+fxi, spar:=spar+fxi);
END;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(ii+2,colum):= L9(colum);
END;
END; // fin del lazo for i..0..n

// agregando mas detalles al spreadsheed


Spreadsheet.Cell(n+4,2):= metodo;
Spreadsheet.Cell(n+4,3):= "Tramos= "+ n +" Subinterv= "+n/2;
Spreadsheet.Cell(n+5,2):= "Formula:";
Spreadsheet.Cell(n+5,3):= "(F(X),X,a,b)=(h/3)*(F(a)+2*(F(Xi_par),i,1,(n/2)1)+4*(F(Xi_impar),i,1,n/2)+F(b)-((b-a)*h^4/180)*f()";
Spreadsheet.Cell(n+6,2):= "h=";
Spreadsheet.Cell(n+6,3):= h;
Spreadsheet.Cell(n+7,2):= "F(A)=";
Spreadsheet.Cell(n+7,3):= F1(a);
Spreadsheet.Cell(n+8,2):= "(F(Xi_par)";
Spreadsheet.Cell(n+8,3):= spar;
Spreadsheet.Cell(n+9,2):= "(F(Xi_impar)";
Spreadsheet.Cell(n+9,3):= simp;
Spreadsheet.Cell(n+10,2):= "F(B)=";
Spreadsheet.Cell(n+10,3):= F1(b);
Spreadsheet.Cell(n+11,2):= "RESULT I=";
Spreadsheet.Cell(n+11,3):= approx(h/3*(F1(a)+2*spar+4*simp+F1(b)));
MUESTRAresult();
END;
//
// INTEGRAL TRAPECIO COMPUESTO o GENERALIZADO.
TRAPECIOGEN(metodo,nombrefunc)
BEGIN
LOCAL fx, a, b, n;
LOCAL h,sum,ii,xi,fxi,fa,fb;
LOCAL okdata, colum, itera;
fx:='SIN(X)'; a:=0; b:=; n:=20; okdata:=0;
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,a,b,n},
" "+metodo+" V1.0 ",
{"F(X):","A :","B :","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese limite inferior A",
"Ingrese limite superior B",
"N=Num. de TRAMOS, (SUBinterv=N)"},
{quote('SIN(X)'),0,,20})
THEN
F1:=fx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
fx:='SIN(X)';
END;

IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<0 OR IP(n)n THEN
MSGBOX("Se requiere: N ENTERO POSITIVO")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTEGRALCOMPUESTA(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
sum:=0;
h:=(b-a)/n;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i", "Xi","F(Xi)"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
// i:=1;
FOR ii FROM 0 TO n DO
MUESTRAitera(ii);
xi:=a+ii*h;
fxi:=F1(xi);
L9:={};
L9(1):=ii;
L9(2):=xi;
L9(3):=fxi;
IF ii >0 AND ii<n THEN
sum:=sum+fxi;
END;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(ii+2,colum):= L9(colum);
END;
END; // fin del lazo for i..0..n
// agregando mas detalles al spreadsheed
Spreadsheet.Cell(n+4,2):= metodo;
Spreadsheet.Cell(n+4,3):= "Tramos = SubIntervalos= "+n;

Spreadsheet.Cell(n+5,2):= "Formula:";
Spreadsheet.Cell(n+5,3):= "(F(X),X,a,b)=(h/2)*(F(a)+2*(F(Xi),i,1,n-1)+F(b)-((ba)*h^2/12)*f()";
Spreadsheet.Cell(n+6,2):= "h=";
Spreadsheet.Cell(n+6,3):= h;
Spreadsheet.Cell(n+7,2):= "F(A)=";
Spreadsheet.Cell(n+7,3):= F1(a);
Spreadsheet.Cell(n+8,2):= "(F(Xi)";
Spreadsheet.Cell(n+8,3):= sum;
Spreadsheet.Cell(n+9,2):= "F(B)=";
Spreadsheet.Cell(n+9,3):= F1(b);
Spreadsheet.Cell(n+10,2):= "RESULT I=";
Spreadsheet.Cell(n+10,3):= approx(h/2*(F1(a)+2*sum+F1(b)));
MUESTRAresult();
END;
//
// INTEGRAL PUNTO MEDIO COMPUESTO o GENERALIZADO.
PTOMEDIOGEN(metodo,nombrefunc)
BEGIN
LOCAL fx, a, b, n;
LOCAL h,simp,spar,ii,xi,fxi,fa,fb;
LOCAL okdata, colum, itera;
fx:='SIN(X)'; a:=0; b:=; n:=20; okdata:=0;
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,a,b,n},
" "+metodo+" V1.0 ",
{"F(X):","A :","B :","N :"},
{"'F(X)' entre comilla [Shift] [( ) N] y X MAYUSCULA",
"Ingrese limite inferior A",
"Ingrese limite superior B",
"N=Num. PAR TRAMOS de X0 a Xn (SUBint=N/2+1)"},
{quote('SIN(X)'),0,,20})
THEN
F1:=fx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
fx:='SIN(X)';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<0 OR FP(n/2)0 OR IP(n)n THEN
MSGBOX("Se requiere: N ENTERO PAR

Numero de tramos de:


X0 a Xn")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTEGRALCOMPUESTA(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
//simp:=0;
spar:=0;
h:=(b-a)/(n+2);
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i", "Xi","F(Xi)"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
PRINT();
// i:=1;
FOR ii FROM -1 TO n+1 DO
MUESTRAitera(ii);
xi:=a+(ii+1)*h;
fxi:=F1(xi);
L9:={};
L9(1):=ii;
L9(2):=xi;
L9(3):=fxi;
IF FP(ii/2)==0 THEN spar:=spar+fxi; END;
FOR colum FROM 1 TO SIZE(L9)
DO
Spreadsheet.Cell(ii+3,colum):= L9(colum);
END;
END; // fin del lazo for i..0..n
// agregando mas detalles al spreadsheed
Spreadsheet.Cell(n+6,2):= metodo;
Spreadsheet.Cell(n+6,3):= "TramosTOT= "+(n+2)+", SubIntervalos:"+(n/2+1);
Spreadsheet.Cell(n+7,2):= "Formula:";
Spreadsheet.Cell(n+7,3):= "(F(X),X,a,b)=(2*h)*(F(Xi_par),i,0,n)+((ba)*h^2/6)*f()";
Spreadsheet.Cell(n+8,2):= "h=";

Spreadsheet.Cell(n+8,3):= h;
Spreadsheet.Cell(n+9,2):= "(F(Xi_par)";
Spreadsheet.Cell(n+9,3):= spar;
Spreadsheet.Cell(n+10,2):= "RESULT I=";
Spreadsheet.Cell(n+10,3):= approx(2*h*spar);
MUESTRAresult();
END;
// INTEGRALES MULTIPLES
MULTIPLE()
BEGIN
LOCAL metodo2;
IF
CHOOSE(metodo2,
"Integrales MULTIPLES:",
"Doble","Triple")
THEN
CASE
IF metodo2==1 THEN
METODOINTEGRALMULTIPLE("INTEGRAL DOBLE", "INTDOBLE");
END;
IF metodo2==2 THEN
METODOINTEGRALMULTIPLE("INTEGRAL TRIPLE", "INTTRIPLE");
END;
END;
ELSE INTEGRALES();
END;
END;
// CODIGO SIGUIENTE NECESARIO PARA REGRESAR A MENU ANTERIOR.
METODOINTEGRALMULTIPLE(metodo,nombrefunc)
BEGIN
LOCAL accion;
IF
CHOOSE(accion, "METODO: "+metodo,
"Ejecutar "+metodo,
"Ver Tabla Resultados")
THEN
CASE
IF accion==1 THEN
EXPR(nombrefunc+"(metodo,
nombrefunc)") END;
IF accion==2 THEN
STARTAPP("Spreadsheet"); END;
// STARTAPP("Analisis Numerico") END;
END;
// RETURN accion;
ELSE MULTIPLE();

END;
END;
//
// INTEGRAL DOBLE.
INTDOBLE(metodo,nombrefunc)
BEGIN
LOCAL fxy, a, b, mx, n, nr;
LOCAL cx, dx, my, m, mr;
LOCAL hx,hy,i,j,xi,var,lmetodos;
LOCAL okdata, colum, itera;
L8:={"DobleMsimpG","DobleMcGauss","DobleMsimp38"};
fxy:='LN(X+2*Y)'; a:=1.4; b:=2; mx:=1; n:=4;
cx:=1; dx:=1.5; my:=1; m:=2; okdata:=0;
//fxy:='EXP(Y/X)'; a:=0.1; b:=0.5; mx:=2; n:=2;
// cx:='X*X'; dx:='X*X*X'; my:=2; m:=2; okdata:=0;
cx:=EXPR("''"+cx+"''");
dx:=EXPR("''"+dx+"''");
REPEAT
fxy:=EXPR("''"+fxy+"''");
IF INPUT({fxy,a,b,mx,n,cx,dx,my,m},
" "+metodo+" V1.0 ",
{"F(X,Y):","A :","B :","Mx :","N: ","Cx :","Dx :","My :","M: "},
{"'F(X,Y)' entre comilla [Shift] [( ) N], X Y MAYUSCULAS",
"Ingrese limite inferior en X",
"Ingrese limite superior en X",
"Mx= 1.SimpsonG 2.Gauss 3.Simp3/8(N=3)",
"N= Numero de Nodos en X",
"Ingrese 'C(X)' limite inferior en Y",
"Ingrese 'D(X)' limite superior en Y",
"My= 1.Simpson 2.Gauss 3.Simp3/8(M=3)",
"M= Numero de Nodos en Y" },
{quote('LN(X+2*Y)'),1.4,2,2,3, 1,1.5,2,3})
THEN
E1:=fxy;
CASE
IF TYPE(fxy)==0 THEN
MSGBOX("Debe ingresar 'F(X,Y)' entre comilla
simple usando teclas [Shift] [( ) N]");
fxy:='LN(X+2*Y)';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<1 OR m<1 OR IP(n)n OR IP(m)m THEN
MSGBOX("Se requiere: ENTEROS N1 M1")
END;

DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTEGRALMULTIPLE(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
nr:=n;
mr:=m;
//Si no es no es Gauss, aumentar un nodo (simp, simp38)
IF mx2 THEN nr:=n+1; END;
IF my2 THEN mr:=m+1; END;
M1:=MAKEMAT(0,nr*mr,3);
M2:=MAKEMAT(0,nr);
//LLAMANDO A X
var:=1; // X
//EXPR(""+L8(mx)+"(a,b,mx,n,nr, cx,dx,my,m,mr, var)");
EXPR(""+L8(mx)+"(a,b,mx,n,nr, cx,dx,my,m,mr, var)");
END;
//SUB METODO SIMPSON GEN PARA INTEGRAL DOBLE
DobleMsimpG(a,b,mx,n,nr, cx,dx,my,m,mr, var)
BEGIN
LOCAL hx, hy, i, j, integral=0;
CASE
// CASE var==1 es integral X
IF var==1 THEN
MSGBOX("SIMPSON GENERAL X
Xi=a+i*hx
hx=(b-a)/n
i=0...n");
// PARTICIONES EN X
hx:=(b-a)/n;
FOR i FROM 1 TO nr DO
FOR j FROM 1 TO mr DO
M1((i-1)*mr+j,1):=a+(i-1)*hx;
END;
END;
// LLAMAR A Y
var:=2; //Y
EXPR(""+L8(my)+"(a,b,mx,n,nr, cx,dx,my,m,mr, var)");
// REGRESA DE Y, APLICAR METODO X A Ix
MSGBOX("SIMPSON GENERAL IX

I=hx/3*(IX0+2*FXi_par+
4*FXi_impar+IXn)
i=1...n-1");
integral:=M2(1)+M2(nr);
FOR i FROM 2 TO nr-1 DO
integral:=integral+IFTE(odd(i),2,4)*M2(i);
END;
integral:=hx/3*integral;
MSGBOX("En Variable I
queda resultado:
I= "+integral);
MSGBOX("En Variable I
queda resultado:
I= "+integral);
I:=integral;
RETURN(integral);
END; // end del case de intregal x
// CASE var==2 es integral Y
IF var==2 THEN
MSGBOX("SIMPSON GENERAL Y
Yj=cx+j*hy
hy=(dx-cx)/m
j=0...m");
// PARTICIONES EN Y
// hy:= ; MAS ABAJO DENTRO DEL FOR VARIABLE
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr+1,1); // x para hallar hy
hy:=approx((dx-cx)/m);
FOR j FROM 1 TO mr DO
Y:=approx(cx+(j-1)*hy);
M1((i-1)*mr+j,2):=Y;
M1((i-1)*mr+j,3):=approx(E1);
END;
END;
MSGBOX("Ver M1 Tabla X Y F(X,Y):");
EDITMAT(M1);
// LLAMAR A Z
// var:=2; //Y
// EXPR(""+L8(my)+"(a,b,mx,n,nr, cx,dx,my,m,mr, var)");
// REGRESA DE Z, APLICAR METODO Y A FXY (IY en triple)
MSGBOX("SIMPSON GENERAL FXY
IXi=hyi/3*(FXiY0+2*FXiYj_par+
4*FXiYj_impar+FXiYm)
i=0...n j=1...m-1");
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr+1,1); // x para hallar hy
hy:=approx((dx-cx)/m);
M2(i):=M1((i-1)*mr+1,3)+M1(i*mr,3);
FOR j FROM 2 TO mr-1 DO
M2(i):=M2(i)+IFTE(odd(j),2,4)*M1((i-1)*mr+j,3);

END;
M2(i):=hy/3*M2(i);
END;
MSGBOX("Ver M2 SubIntegrales IX:");
EDITMAT(M2);
END; // end del case de intregal Y
END; // end del case.
// fin de submetodo
END;
//SUB METODO CUADRATURA DE GAUSS PARA INTEGRAL DOBLE
DobleMcGauss(a,b,mx,n,nr, cx,dx,my,m,mr, var)
BEGIN
LOCAL hx, hy, i, j, integral=0;
LOCAL t, cc, wx, wy, apb, cpd;
LOCAL listat, listacc;
L7:={
{ { '(1/3)', '(1/3)' }, {1,1} },
{ { '(3/5)', 0, '(3/5)' }, {'5/9','8/9','5/9'} },
{ {0.8611363116, 0.3399810436, -0.3399810436, -0.8611363116},
{0.3478548451, 0.6521451549, 0.6521451549, 0.3478548451} },
{ {0.9061798459, 0.5384693101, 0, -0.5384693101, -0.9061798459 },
{0.236926885, 0.4786286705, 0.5688888889, 0.4786286705, 0.236926885 }}
};
listat:={
"=2 Valores Ctes
T0=-(1/3) T1=(1/3)",
"=3 Valores Ctes
T0=-(3/5) T1=0 T2=(3/5)",
"=4 Valores Ctes
T0, T1, T2, T3",
"=5 Valores Ctes
T0, T1, T2, T3, T4"
};
listacc:={
"=2 Valores Ctes
C0=1 C1=1",
"=3 Valores Ctes
C0=5/9 C1=8/9 C2=5/9",
"=4 Valores Ctes
C0, C1, C2, C3",
"=5 Valores Ctes
C0, C1, C2, C3, C4"
};

CASE
// CASE var==1 es integral X
IF var==1 THEN
t:=L7(n-1,1);
cc:=L7(n-1,2);
wx:=(b-a)/2;
apb:=(b+a)/2;
MSGBOX("CUAD. GAUSS X
Xi=(b-a)/2*Ti+(b+a)/2
Ti: n"+listat(n-1));
// PARTICIONES EN X
FOR i FROM 1 TO nr DO
FOR j FROM 1 TO mr DO
M1((i-1)*mr+j,1):=wx*approx(t(i))+apb;
END;
END;
// LLAMAR A Y
var:=2; //Y
EXPR(""+L8(my)+"(a,b,mx,n,nr, cx,dx,my,m,mr, var)");
// REGRESA DE Y, APLICAR METODO X A Ix
MSGBOX("CUAD. GAUSS IX
I=W*Ci*IXi
W=(b-a)/2
Ci: n"+listacc(n-1));
integral:=0;
FOR i FROM 1 TO nr DO
integral:=integral+approx(cc(i))*M2(i);
END;
integral:=approx(wx*integral);
MSGBOX("En Variable I
queda resultado:
I= "+integral);
I:=integral;
MSGBOX("En Variable I
queda resultado:
I= "+integral);
RETURN(integral);
END; // end del case de intregal x
// CASE var==2 es integral Y
IF var==2 THEN
t:=L7(m-1,1);
cc:=L7(m-1,2);
MSGBOX("CUAD. GAUSS Y
Yj=(dx-cx)/2*Tj+(dx+cx)/2
Tj: m"+listat(m-1));
// PARTICIONES EN Y
// hy:= ; MAS ABAJO DENTRO DEL FOR VARIABLE
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr+1,1); // x para hallar cpd wy
wy:=approx((dx-cx)/2);

cpd:=approx((dx+cx)/2);
FOR j FROM 1 TO mr DO
Y:=wy*approx(t(j))+cpd;
M1((i-1)*mr+j,2):=Y;
M1((i-1)*mr+j,3):=approx(E1);
END;
END;
MSGBOX("Ver M1 Tabla X Y F(X,Y):");
EDITMAT(M1);
// LLAMAR A Z
// var:=2; //Y
// EXPR(""+L8(mz)+"(a,b,mx,n,nr, cx,dx,my,m,mr, var)");
// REGRESA DE Z, APLICAR METODO Y A FXY (IY en triple)
MSGBOX("CUAD. GAUSS FXY
IXi=Wi*Cj*FXiYj
Wi=(dx-cx)/2
Cj: m"+listacc(m-1));
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr+1,1); // x para hallar hy
wy:=approx((dx-cx)/2);
FOR j FROM 1 TO mr DO
M2(i):=M2(i)+approx(cc(j))*M1((i-1)*mr+j,3);
END;
M2(i):=wy*M2(i);
END;
MSGBOX("Ver M2 SubIntegrales IX:");
EDITMAT(M2);
END; // end del case de intregal Y
END; // end del case.
// fin de submetodo
END;
//SUB METODO SIMPSON 3/8 (NO GEN) PARA INTEGRAL DOBLE
DobleMsimp38(a,b,mx,n,nr, cx,dx,my,m,mr, var)
BEGIN
LOCAL hx, hy, i, j, integral=0;
CASE
// CASE var==1 es integral X
IF var==1 THEN
MSGBOX("SIMPSON 3/8 X
Xi=a+i*hx
hx=(b-a)/n
i=0...n, n=3");
// PARTICIONES EN X
hx:=(b-a)/n;
FOR i FROM 1 TO nr DO
FOR j FROM 1 TO mr DO
M1((i-1)*mr+j,1):=a+(i-1)*hx;

END;
END;
// LLAMAR A Y
var:=2; //Y
EXPR(""+L8(my)+"(a,b,mx,n,nr, cx,dx,my,m,mr, var)");
// REGRESA DE Y, APLICAR METODO X A Ix
MSGBOX("SIMPSON 3/8 IX
I=hx*3/8*(IX0+
3*(IX1+IX2)+IX3)");
integral:=M2(1)+M2(nr);
FOR i FROM 2 TO nr-1 DO
// integral:=integral+IFTE(odd(i),2,4)*M2(i);
integral:=integral+3*M2(i);
END;
integral:=hx*3/8*integral;
MSGBOX("En Variable I
queda resultado:
I= "+integral);
I:=integral;
MSGBOX("En Variable I
queda resultado:
I= "+integral);
RETURN(integral);
END; // end del case de intregal x
// CASE var==2 es integral Y
IF var==2 THEN
MSGBOX("SIMPSON 3/8 Y
Yj=cx+j*hy
hy=(dx-cx)/m
j=0...m, m=3");
// PARTICIONES EN Y
// hy:= ; MAS ABAJO DENTRO DEL FOR VARIABLE
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr+1,1); // x para hallar hy
hy:=approx((dx-cx)/m);
FOR j FROM 1 TO mr DO
Y:=approx(cx+(j-1)*hy);
M1((i-1)*mr+j,2):=Y;
M1((i-1)*mr+j,3):=approx(E1);
END;
END;
MSGBOX("Ver M1 Tabla X Y F(X,Y):");
EDITMAT(M1);
// LLAMAR A Z
// var:=2; //Y
// EXPR(""+L8(mz)+"(a,b,mx,n,nr, cx,dx,my,m,mr, var)");
// REGRESA DE Z, APLICAR METODO Y A FXY (IY en triple)
MSGBOX("SIMPSON 3/8 FXY
IXi=hyi*3/8*(FXiY0+
3*(FXiY1+FXiY2)+FXiY3)

i=0...n");
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr+1,1); // x para hallar hy
hy:=approx((dx-cx)/m);
M2(i):=M1((i-1)*mr+1,3)+M1(i*mr,3);
FOR j FROM 2 TO mr-1 DO
// M2(i):=M2(i)+IFTE(odd(j),2,4)*M1((i-1)*mr+j,3);
M2(i):=M2(i)+3*M1((i-1)*mr+j,3);
END;
M2(i):=hy*3/8*M2(i);
END;
MSGBOX("Ver M2 SubIntegrales IX:");
EDITMAT(M2);
END; // end del case de intregal Y
END; // end del case.
// fin de submetodo
END;

//
// INTEGRAL TRIPLE.
INTTRIPLE(metodo,nombrefunc)
BEGIN
LOCAL fxyz, a, b, mx, n, nr;
LOCAL cx, dx, my, m, mr;
LOCAL exy,fxy, mz, p, pr;
LOCAL hx,hy,i,j,k,xi,ykz;
LOCAL okdata, colum, itera, var,lmetodos;
L8:={"TripleMsimpG","TripleMcGauss","TripleMsimp38"};
fxyz:='Z'; a:=0; b:=1; mx:=1; n:=2;
cx:='X^2'; dx:='X'; my:=1; m:=2;
exy:='X-Y'; fxy:='X+Y'; mz:=1; p:=2; okdata:=0;
//??fxyz:='(X^2+Y^2)'; a:=-2; b:=2; mx:=2; n:=5;
//cx:='-(4-X^2)'; dx:='(4-X^2)'; my:=2; m:=5;
//exy:='(X^2+Y^2)'; fxy:=2; mz:=2; p:=5; okdata:=0;
//fxyz:='EXP(X+Y+Z)'; a:=0; b:=1; mx:=1; n:=2;
// cx:=1; dx:=2; my:=1; m:=2;
// exy:=0; fxy:=0.5; mz:=1; p:=2; okdata:=0;
cx:=EXPR("''"+cx+"''");
dx:=EXPR("''"+dx+"''");
exy:=EXPR("''"+exy+"''");

fxy:=EXPR("''"+fxy+"''");
REPEAT
fxyz:=EXPR("''"+fxyz+"''");
IF INPUT({fxyz,a,b,mx,n,cx,dx,my,m,exy,fxy,mz,p},
" "+metodo+" V1.0 ",
{"F(X,Y,Z):","A :","B :","Mx :","N: ","Cx :","Dx :","My :","M: ",
"Exy :","Fxy :","Mz :","P: "},
{"'F(X,Y,Z)' entre comilla [Shift] [( ) N], X Y Z MAYUSCULAS",
"Ingrese limite inferior en X",
"Ingrese limite superior en X",
"Mx= 1.Simpson 2.Gauss 3.Simp3/8(N=3)",
"N= Numero de Nodos en X",
"Ingrese 'C(X)' limite inferior en Y",
"Ingrese 'D(X)' limite superior en Y",
"My= 1.Simpson 2.Gauss 3.Simp3/8(M=3)",
"M= Numero de Nodos en Y",
"Ingrese 'E(X,Y)' limite inferior en Z",
"Ingrese 'F(X,Y)' limite superior en Z",
"Mz= 1.SimpsonG 2.Gauss 3.Simp3/8(P=3)",
"P= Numero de Nodos en Z" },
{quote('(X^2+Y^2)'),-2,2,1,5, '-(4-X^2)','(4-X^2)',1,5,
'(X^2+Y^2)',2,1,5})
THEN
E1:=fxyz;
CASE
IF TYPE(fxyz)==0 THEN
MSGBOX("Debe ingresar 'F(X,Y)' entre comilla
simple usando teclas [Shift] [( ) N]");
fxyz:='(X^2+Y^2)';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<1 OR m<1 OR p<1 OR IP(n)n OR IP(m)m OR IP(p)p THEN
MSGBOX("Se requiere: ENTEROS
N1 M1 P1")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOINTEGRALMULTIPLE(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
nr:=n;

mr:=m;
pr:=p;
//Si no es no es Gauss, aumentar un nodo (simp, simp38)
IF mx2 THEN nr:=n+1; END;
IF my2 THEN mr:=m+1; END;
IF mz2 THEN pr:=p+1; END;
M1:=MAKEMAT(0,nr*mr*pr,4); // x y x fxyz
M2:=MAKEMAT(0,nr*mr); // Ixy
M3:=MAKEMAT(0,nr); // Ix
//LLAMANDO A X
var:=1; // X
//EXPR(""+L8(mx)+"(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)");
EXPR(""+L8(mx)+"(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)");
END;
//SUB METODO SIMPSON GEN PARA INTEGRAL TRIPLE
TripleMsimpG(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)
BEGIN
LOCAL hx, hy, hz, i, j, k, integral=0;
CASE
// CASE var==1 es integral X
IF var==1 THEN
MSGBOX("SIMPSON GENERAL X
Xi=a+i*hx
hx=(b-a)/n
i=0...n");
// PARTICIONES EN X
hx:=(b-a)/n;
FOR i FROM 1 TO nr DO
FOR j FROM 1 TO mr DO
FOR k FROM 1 TO pr DO
M1((i-1)*mr*pr+(j-1)*pr+k,1):=a+(i-1)*hx;
END;
END;
END;
// LLAMAR A Y
var:=2; //Y
EXPR(""+L8(my)+"(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)");
// REGRESA DE Y, APLICAR METODO X A Ix
MSGBOX("SIMPSON GENERAL IX
I=hx/3*(IX0+2*IXi_par+
4*IXi_impar+IXn)
i=1...n-1");
integral:=M3(1)+M3(nr);
FOR i FROM 2 TO nr-1 DO
integral:=integral+IFTE(odd(i),2,4)*M3(i);

END;
integral:=hx/3*integral;
MSGBOX("En Variable I
queda resultado:
I= "+integral);
I:=integral;
MSGBOX("En Variable I
queda resultado:
I= "+integral);
RETURN(integral);
END; // end del case de intregal x
// CASE var==2 es integral Y
IF var==2 THEN
MSGBOX("SIMPSON GENERAL Y
Yj=cx+j*hy
hy=(dx-cx)/m
j=0...m");
// PARTICIONES EN Y
// hy:= ; MAS ABAJO DENTRO DEL FOR VARIABLE
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar hy
hy:=approx((dx-cx)/m);
FOR j FROM 1 TO mr DO
Y:=approx(cx+(j-1)*hy);
FOR k FROM 1 TO pr DO
M1((i-1)*mr*pr+(j-1)*pr+k,2):=Y;
END;
END;
END;
// LLAMAR A Z
var:=3; //Z
EXPR(""+L8(mz)+"(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)");
// REGRESA DE Z, APLICAR METODO Y A FXY (IY en triple)
MSGBOX("SIMPSON GENERAL IXY
IXi=hyi/3*(IXiY0+2*IXiYj_par+
4*IXiYj_impar+IXiYm)
i=0...n j=1...m-1");
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar hy
hy:=approx((dx-cx)/m);
M3(i):=M2((i-1)*mr+1)+M2(i*mr);
FOR j FROM 2 TO mr-1 DO
M3(i):=M3(i)+IFTE(odd(j),2,4)*M2((i-1)*mr+j);
END;
M3(i):=hy/3*M3(i);
END;
MSGBOX("Ver M3 SubIntegrales IX:");
EDITMAT(M3);
END; // end del case de intregal Y
// CASE var==3 es integral Z

IF var==3 THEN
MSGBOX("SIMPSON GENERAL Z
Zk=exy+k*hz
hz=(fxy-exy)/p
k=0...p");
// PARTICIONES EN Z
// hy:= hz; MAS ABAJO DENTRO DEL FOR VARIABLE
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar hy
hy:=approx((dx-cx)/m);
FOR j FROM 1 TO mr DO
Y:=M1((i-1)*mr*pr+(j-1)*pr+1,2);
hz:=approx((fxy-exy)/p);
FOR k FROM 1 TO pr DO
Z:=approx(exy+(k-1)*hz);
M1((i-1)*mr*pr+(j-1)*pr+k,3):=Z;
M1((i-1)*mr*pr+(j-1)*pr+k,4):=approx(E1);
END;
END;
END;
MSGBOX("Ver M1 Tabla X Y F(X,Y):");
EDITMAT(M1);
// APLICAR METODO IXY A FXY
MSGBOX("SIMPSON GENERAL FXYZ
IXiYj=hzj/3*(FXiYjZ0+2*FXiYjZk_par+
4*FXiYjZk_impar+FXiYjZp)
i=0..n j=0..m k=1..p-1");
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar hy
FOR j FROM 1 TO mr DO
Y:=M1((i-1)*mr*pr+(j-1)*pr+1,2);
hz:=approx((fxy-exy)/p);
M2((i-1)*mr+j):=M1((i-1)*mr*pr+(j-1)*pr+1,4)+M1((i-1)*mr*pr+j*pr,4);
FOR k FROM 2 TO pr-1 DO
M2((i-1)*mr+j):=M2((i-1)*mr+j)+IFTE(odd(k),2,4)*M1((i-1)*mr*pr+(j-1)*pr+k,4);
END;
M2((i-1)*mr+j):=hz/3*M2((i-1)*mr+j);
END;
END;
MSGBOX("Ver M2 SubIntegrales IXY:");
EDITMAT(M2);
END; // USAR VAR==3 PARA TRIPLE (INT Z)
END; // end del case.
// fin de submetodo
END;
//SUB METODO CUADRATURA DE GAUSS PARA INTEGRAL TRIPLE

TripleMcGauss(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)


BEGIN
LOCAL i, j, k, integral=0;
LOCAL t, cc, wx, wy, wz;
LOCAL apb, cpd, epf;
LOCAL listat, listacc;
L7:={
{ { '(1/3)', '(1/3)' }, {1,1} },
{ { '(3/5)', 0, '(3/5)' }, {'5/9','8/9','5/9'} },
{ {0.8611363116, 0.3399810436, -0.3399810436, -0.8611363116},
{0.3478548451, 0.6521451549, 0.6521451549, 0.3478548451} },
{ {0.9061798459, 0.5384693101, 0, -0.5384693101, -0.9061798459 },
{0.236926885, 0.4786286705, 0.5688888889, 0.4786286705, 0.236926885 }}
};
listat:={
"=2 Valores Ctes
T0=-(1/3) T1=(1/3)",
"=3 Valores Ctes
T0=-(3/5) T1=0 T2=(3/5)",
"=4 Valores Ctes
T0, T1, T2, T3",
"=5 Valores Ctes
T0, T1, T2, T3, T4"
};
listacc:={
"=2 Valores Ctes
C0=1 C1=1",
"=3 Valores Ctes
C0=5/9 C1=8/9 C2=5/9",
"=4 Valores Ctes
C0, C1, C2, C3",
"=5 Valores Ctes
C0, C1, C2, C3, C4"
};
CASE
// CASE var==1 es integral X
IF var==1 THEN
t:=L7(n-1,1);
cc:=L7(n-1,2);
wx:=(b-a)/2;
apb:=(b+a)/2;
MSGBOX("CUAD. GAUSS X
Xi=(b-a)/2*Ti+(b+a)/2
Ti: n"+listat(n-1));
// PARTICIONES EN X
FOR i FROM 1 TO nr DO
FOR j FROM 1 TO mr DO
FOR k FROM 1 TO pr DO

M1((i-1)*mr*pr+(j-1)*pr+k,1):=wx*approx(t(i))+apb;
END;
END;
END;
// LLAMAR A Y
var:=2; //Y
EXPR(""+L8(my)+"(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)");
// REGRESA DE Y, APLICAR METODO X A Ix
MSGBOX("CUAD. GAUSS IX
I=W*Ci*IXi
W=(b-a)/2
Ci: n"+listacc(n-1));
integral:=0;
FOR i FROM 1 TO nr DO
integral:=integral+approx(cc(i))*M3(i);
END;
integral:=approx(wx*integral);
MSGBOX("En Variable I
queda resultado:
I= "+integral);
I:=integral;
MSGBOX("En Variable I
queda resultado:
I= "+integral);
RETURN(integral);
END; // end del case de intregal x
// CASE var==2 es integral Y
IF var==2 THEN
t:=L7(m-1,1);
cc:=L7(m-1,2);
MSGBOX("CUAD. GAUSS Y
Yj=(dx-cx)/2*Tj+(dx+cx)/2
Tj: m"+listat(m-1));
// PARTICIONES EN Y
// hy:= ; MAS ABAJO DENTRO DEL FOR VARIABLE
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar cpd wy
wy:=approx((dx-cx)/2);
cpd:=approx((dx+cx)/2);
FOR j FROM 1 TO mr DO
Y:=wy*approx(t(j))+cpd;
FOR k FROM 1 TO pr DO
M1((i-1)*mr*pr+(j-1)*pr+k,2):=Y;
END;
END;
END;
// LLAMAR A Z
var:=3; //Z
EXPR(""+L8(mz)+"(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)");
// REGRESA DE Z, APLICAR METODO A IXY

MSGBOX("CUAD. GAUSS IXY


IXi=Wi*Cj*IXiYj
Wi=(dx-cx)/2
Cj: m"+listacc(m-1));
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar wy
wy:=approx((dx-cx)/2);
FOR j FROM 1 TO mr DO
M3(i):=M3(i)+approx(cc(j))*M2((i-1)*mr+j);
END;
M3(i):=wy*M3(i);
END;
MSGBOX("Ver M3 SubIntegrales IX:");
EDITMAT(M3);
END; // end del case de intregal Y
// CASE var==3 es integral Z
IF var==3 THEN
t:=L7(p-1,1);
cc:=L7(p-1,2);
MSGBOX("CUAD. GAUSS Z
Zk=Wk*Tk+(fxy+exy)/2
Wz=(fxy-exy)/2
Tk: p"+listat(p-1));
// PARTICIONES EN Z
// hy:= hz; MAS ABAJO DENTRO DEL FOR VARIABLE
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar wy
wy:=approx((dx-cx)/2);
FOR j FROM 1 TO mr DO
Y:=M1((i-1)*mr*pr+(j-1)*pr+1,2);
wz:=approx((fxy-exy)/2);
epf:=approx((fxy+exy)/2);
FOR k FROM 1 TO pr DO
Z:=wz*approx(t(k))+epf;
M1((i-1)*mr*pr+(j-1)*pr+k,3):=Z;
M1((i-1)*mr*pr+(j-1)*pr+k,4):=approx(E1);
END;
END;
END;
MSGBOX("Ver M1 Tabla X Y F(X,Y):");
EDITMAT(M1);
// APLICAR METODO IXY A FXY
MSGBOX("CUAD. GAUSS FXYZ
IXiYj=Wj*Ck*FXiYjZk
Wj=(fxy-exy)/2
Ck: p"+listacc(n-1));
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar hy
FOR j FROM 1 TO mr DO

Y:=M1((i-1)*mr*pr+(j-1)*pr+1,2);
wz:=approx((fxy-exy)/2);
FOR k FROM 1 TO pr DO
M2((i-1)*mr+j):=M2((i-1)*mr+j)+approx(cc(k))*M1((i-1)*mr*pr+(j-1)*pr+k,4);
END;
M2((i-1)*mr+j):=wz*M2((i-1)*mr+j);
END;
END;
MSGBOX("Ver M2 SubIntegrales IXY:");
EDITMAT(M2);
END; // USAR VAR==3 PARA TRIPLE (INT Z)
END; // end del case.
// fin de submetodo
END;
//SUB METODO SIMPSON 3/8 (NO GEN) PARA INTEGRAL DOBLE
TripleMsimp38(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)
BEGIN
LOCAL hx, hy, hz, i, j, k, integral=0;
CASE
// CASE var==1 es integral X
IF var==1 THEN
MSGBOX("SIMPSON 3/8 X
Xi=a+i*hx
hx=(b-a)/n
i=0...n, n=3");
// PARTICIONES EN X
hx:=(b-a)/n;
FOR i FROM 1 TO nr DO
FOR j FROM 1 TO mr DO
FOR k FROM 1 TO pr DO
M1((i-1)*mr*pr+(j-1)*pr+k,1):=a+(i-1)*hx;
END;
END;
END;
// LLAMAR A Y
var:=2; //Y
EXPR(""+L8(my)+"(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)");
// REGRESA DE Y, APLICAR METODO X A Ix
MSGBOX("SIMPSON 3/8 IX
I=hx*3/8*(IX0+
3*(IX1+IX2)+IX3)");
integral:=M3(1)+M3(nr);
FOR i FROM 2 TO nr-1 DO
integral:=integral+3*M3(i);
END;
integral:=hx*3/8*integral;

MSGBOX("En Variable I
queda resultado:
I= "+integral);
I:=integral;
MSGBOX("En Variable I
queda resultado:
I= "+integral);
RETURN(integral);
END; // end del case de intregal x
// CASE var==2 es integral Y
IF var==2 THEN
MSGBOX("SIMPSON 3/8 Y
Yj=cx+j*hy
hy=(dx-cx)/m
j=0...m");
// PARTICIONES EN Y
// hy:= ; MAS ABAJO DENTRO DEL FOR VARIABLE
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar hy
hy:=approx((dx-cx)/m);
FOR j FROM 1 TO mr DO
Y:=approx(cx+(j-1)*hy);
FOR k FROM 1 TO pr DO
M1((i-1)*mr*pr+(j-1)*pr+k,2):=Y;
END;
END;
END;
// LLAMAR A Z
var:=3; //Z
EXPR(""+L8(mz)+"(a,b,mx,n,nr, cx,dx,my,m,mr, exy,fxy,mz,p,pr, var)");
// REGRESA DE Z, APLICAR METODO Y IXY
MSGBOX("SIMPSON 3/8 IXY
IXi=hyi*3/8*(IXiY0+
3*(IXiY1+IXiY2)+IXiY3)
i=0...n");
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar hy
hy:=approx((dx-cx)/m);
M3(i):=M2((i-1)*mr+1)+M2(i*mr);
FOR j FROM 2 TO mr-1 DO
M3(i):=M3(i)+3*M2((i-1)*mr+j);
END;
M3(i):=hy*3/8*M3(i);
END;
MSGBOX("Ver M3 SubIntegrales IX:");
EDITMAT(M3);
END; // end del case de intregal Y
// CASE var==3 es integral Z
IF var==3 THEN
MSGBOX("SIMPSON GENERAL Z

Zk=exy+k*hz
hz=(fxy-exy)/p
k=0...p");
// PARTICIONES EN Z
// hy:= hz; MAS ABAJO DENTRO DEL FOR VARIABLE
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar hy
hy:=approx((dx-cx)/m);
FOR j FROM 1 TO mr DO
Y:=M1((i-1)*mr*pr+(j-1)*pr+1,2);
hz:=approx((fxy-exy)/p);
FOR k FROM 1 TO pr DO
Z:=approx(exy+(k-1)*hz);
M1((i-1)*mr*pr+(j-1)*pr+k,3):=Z;
M1((i-1)*mr*pr+(j-1)*pr+k,4):=approx(E1);
END;
END;
END;
MSGBOX("Ver M1 Tabla X Y F(X,Y):");
EDITMAT(M1);
// APLICAR METODO IXY A FXYZ
MSGBOX("SIMPSON 3/8 FXYZ
IXiYj=hzj/3*(FXiYjZ0+2*FXiYjZk_par+
4*FXiYjZk_impar+FXiYjZp)
i=0..n j=0..m k=1..p-1");
FOR i FROM 1 TO nr DO
X:=M1((i-1)*mr*pr+1,1); // x para hallar hy
FOR j FROM 1 TO mr DO
Y:=M1((i-1)*mr*pr+(j-1)*pr+1,2);
hz:=approx((fxy-exy)/p);
M2((i-1)*mr+j):=M1((i-1)*mr*pr+(j-1)*pr+1,4)+M1((i-1)*mr*pr+j*pr,4);
FOR k FROM 2 TO pr-1 DO
M2((i-1)*mr+j):=M2((i-1)*mr+j)+3*M1((i-1)*mr*pr+(j-1)*pr+k,4);
END;
M2((i-1)*mr+j):=hz*3/8*M2((i-1)*mr+j);
END;
END;
MSGBOX("Ver M2 SubIntegrales IXY:");
EDITMAT(M2);
END; // USAR VAR==3 PARA TRIPLE (INT Z)
END; // end del case.
// fin de submetodo
END;

/////////////////////////////////////
// "EQs Diferenciales 1, 2 VAR"

/////////////////////////////////////
EQDIFF()
BEGIN
LOCAL metodo;
IF
CHOOSE(metodo,
"Ecuaciones Diferenciales:",
"Simple dY/dT=F(T,Y)","Sistema EQs. Dif.","Derivadas Parciales")
THEN
CASE
IF metodo==1 THEN
EQDIFF1VAR();
// METODOINTEGRAL("SIMPLE", "SIMPLE");
END;
IF metodo==2 THEN
EQDIFFSIST();
// COMPUESTA("COMPUESTA", "COMPUESTA");
END;
IF metodo==3 THEN
EQDIFFDERPAR();
// METODOINTEGRAL("MULTIPLE","MULTIPLE");
END;
END;
ELSE START();
END;
END;
// EQ DIFF 1 VAR
EQDIFF1VAR()
BEGIN
LOCAL metodo2;
IF
CHOOSE(metodo2,
"EQ DIFF dY/dT=F(T,Y) :",
"Euler","Runge-Kutta 2do Ord","Runge-Kutta 4to Ord","Predictor/Corrector")
THEN
CASE
IF metodo2==1 THEN
METODOEQDIFF1VAR("Eq.Diff-Euler", "EQDIFF1VAREULER");
END;
IF metodo2==2 THEN
METODOEQDIFF1VAR("Runge-Kutta 2", "EQDIFF1VARRK2");
END;
IF metodo2==3 THEN
METODOEQDIFF1VAR("Runge-Kutta 4","EQDIFF1VARRK4");
END;
IF metodo2==4 THEN
METODOEQDIFF1VAR("Predictor/Correct.","EQDIFF1VARPREDCORR");
END;

END;
ELSE EQDIFF();
END;
END;
// CODIGO SIGUIENTE NECESARIO PARA REGRESAR A MENU ANTERIOR.
METODOEQDIFF1VAR(metodo,nombrefunc)
BEGIN
LOCAL accion;
IF
CHOOSE(accion, "METODO: "+metodo,
"Ejecutar "+metodo,
"Ver Tabla Resultados")
THEN
CASE
IF accion==1 THEN
EXPR(nombrefunc+"(metodo,
nombrefunc)") END;
IF accion==2 THEN
STARTAPP("Spreadsheet"); END;
// STARTAPP("Analisis Numerico") END;
END;
// RETURN accion;
ELSE EQDIFF1VAR();
END;
END;
//
// EQ. DIFF. 1 VAR EULER.
EQDIFF1VAREULER(metodo,nombrefunc)
BEGIN
LOCAL fty, a, b, , n;
LOCAL h,i;
LOCAL okdata, colum, itera;
fty:='Y-T^2+1'; a:=0; b:=2; :=0.5; n:=10; okdata:=0;
REPEAT
fty:=EXPR("''"+fty+"''");
IF INPUT({fty,a,b,,n},
" "+metodo+" V1.0 ",
{"F(T,Y):","A :","B :"," :","N :"},
{"'F(T,Y)' entre comilla [Shift] [( ) N], T Y MAYUSCULAS",
"Ingrese limite inferior T=A",
"Ingrese limite superior T=B",
"Ingrese condicion inicial =Y(A)",
"N=Num. de particiones en T, Entero positivo"},
{quote('Y-T^2+1'),0,2,0.5,10})
THEN
E1:=fty;
CASE
IF TYPE(fty)==0 THEN
MSGBOX("Debe ingresar 'F(T,Y)' entre comilla

simple usando teclas [Shift] [( ) N]");


fty:='Y-T^2+1';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<0 OR IP(n)n THEN
MSGBOX("Se requiere: N ENTERO POSITIVO")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOEQDIFF1VAR(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
T:=a;
Y:=;
h:=(b-a)/n;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i","Ti","Wi"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
L9:={};
L9(1):=0;
L9(2):=T;
L9(3):=Y;
FOR colum FROM 1 TO SIZE(L9) DO
Spreadsheet.Cell(2,colum):= L9(colum);
END;
PRINT();
// i:=1;
FOR i FROM 1 TO n DO
MUESTRAitera(i);
Y:=Y+h*approx(E1);
T:=a+i*h;
L9:={};
L9(1):=i;
L9(2):=T;
L9(3):=Y;
FOR colum FROM 1 TO SIZE(L9) DO
Spreadsheet.Cell(i+2,colum):= L9(colum);

END;
END;
// agregando mas detalles al spreadsheet
Spreadsheet.Cell(n+4,2):= metodo;
Spreadsheet.Cell(n+4,3):= "N:"+n;
Spreadsheet.Cell(n+5,2):= "h: "+h;
MUESTRAresult();
END;
//
// EQ. DIFF. 1 VAR RK 2.
EQDIFF1VARRK2(metodo,nombrefunc)
BEGIN
LOCAL fty, a, b, , n;
LOCAL h,i,k1,k2,w,t;
LOCAL okdata, colum, itera;
fty:='Y-T^2+1'; a:=0; b:=2; :=0.5; n:=10; okdata:=0;
REPEAT
fty:=EXPR("''"+fty+"''");
IF INPUT({fty,a,b,,n},
" "+metodo+" V1.0 ",
{"F(T,Y):","A :","B :"," :","N :"},
{"'F(T,Y)' entre comilla [Shift] [( ) N], T Y MAYUSCULAS",
"Ingrese limite inferior T=A",
"Ingrese limite superior T=B",
"Ingrese condicion inicial =Y(A)",
"N=Num. de particiones en T, Entero positivo"},
{quote('Y-T^2+1'),0,2,0.5,10})
THEN
E1:=fty;
CASE
IF TYPE(fty)==0 THEN
MSGBOX("Debe ingresar 'F(T,Y)' entre comilla
simple usando teclas [Shift] [( ) N]");
fty:='Y-T^2+1';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<0 OR IP(n)n THEN
MSGBOX("Se requiere: N ENTERO POSITIVO")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOEQDIFF1VAR(metodo,nombrefunc);
okdata:=1;

RETURN(0);
END;
UNTIL okdata;
T:=a;
Y:=;
h:=(b-a)/n;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i","Ti","K1","K2","Wi"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
L9:={};
L9(1):=0;
L9(2):=T;
// L9(3):=Y;
FOR colum FROM 1 TO SIZE(L9) DO
Spreadsheet.Cell(2,colum):= L9(colum);
END;
Spreadsheet.Cell(2,5):=Y;
PRINT();
// i:=1;
FOR i FROM 1 TO n DO
MUESTRAitera(i);
w:=Y;
t:=T;
L9:={};
L9(1):=i;
// T:=a+i*h;
L9(2):=a+i*h;
k1:=h*approx(E1);
L9(3):=k1;
T:=t+3/2*h;
Y:=w+3/2*k1;
k2:=h*approx(E1);
L9(4):=k2;
Y:=w+2/3*k1+1/3*k2;
L9(5):=Y;
FOR colum FROM 1 TO SIZE(L9) DO
Spreadsheet.Cell(i+2,colum):= L9(colum);
END;
T:=a+i*h;
END;
// agregando mas detalles al spreadsheet

Spreadsheet.Cell(n+4,2):= metodo;
Spreadsheet.Cell(n+4,3):= "N:"+n;
Spreadsheet.Cell(n+5,2):= "h: "+h;
MUESTRAresult();
END;

//
// EQ. DIFF. 1 VAR RK 4.
EQDIFF1VARRK4(metodo,nombrefunc)
BEGIN
LOCAL fty, a, b, , n;
LOCAL h,i,k1,k2,k3,k4;
LOCAL w,t;
LOCAL okdata, colum, itera;
fty:='Y-T^2+1'; a:=0; b:=2; :=0.5; n:=10; okdata:=0;
REPEAT
fty:=EXPR("''"+fty+"''");
IF INPUT({fty,a,b,,n},
" "+metodo+" V1.0 ",
{"F(T,Y):","A :","B :"," :","N :"},
{"'F(T,Y)' entre comilla [Shift] [( ) N], T Y MAYUSCULAS",
"Ingrese limite inferior T=A",
"Ingrese limite superior T=B",
"Ingrese condicion inicial =Y(A)",
"N=Num. de particiones en T, Entero positivo"},
{quote('Y-T^2+1'),0,2,0.5,10})
THEN
E1:=fty;
CASE
IF TYPE(fty)==0 THEN
MSGBOX("Debe ingresar 'F(T,Y)' entre comilla
simple usando teclas [Shift] [( ) N]");
fty:='Y-T^2+1';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<0 OR IP(n)n THEN
MSGBOX("Se requiere: N ENTERO POSITIVO")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOEQDIFF1VAR(metodo,nombrefunc);
okdata:=1;
RETURN(0);

END;
UNTIL okdata;
T:=a;
Y:=;
h:=(b-a)/n;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i","Ti","K1","K2","K3","K4","Wi"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
L9:={};
L9(1):=0;
L9(2):=T;
// L9(3):=Y;
FOR colum FROM 1 TO SIZE(L9) DO
Spreadsheet.Cell(2,colum):= L9(colum);
END;
Spreadsheet.Cell(2,7):=Y;
PRINT();
// i:=1;
FOR i FROM 1 TO n DO
MUESTRAitera(i);
w:=Y;
t:=T;
L9:={};
L9(1):=i;
// T:=a+i*h;
L9(2):=a+i*h;
k1:=h*approx(E1);
L9(3):=k1;
T:=t+h/2;
Y:=w+k1/2;
k2:=h*approx(E1);
L9(4):=k2;
Y:=w+k2/2;
k3:=h*approx(E1);
L9(5):=k3;
T:=t+h;
Y:=w+k3;
k4:=h*approx(E1);
L9(6):=k4;
Y:=w+(k1+2*k2+2*k3+k4)/6;
L9(7):=Y;

FOR colum FROM 1 TO SIZE(L9) DO


Spreadsheet.Cell(i+2,colum):= L9(colum);
END;
T:=a+i*h;
END;
// agregando mas detalles al spreadsheet
Spreadsheet.Cell(n+4,2):= metodo;
Spreadsheet.Cell(n+4,3):= "N:"+n;
Spreadsheet.Cell(n+5,2):= "h: "+h;
MUESTRAresult();
END;

//
// EQ. DIFF. 1 VAR PREDICT.CORRECT.
EQDIFF1VARPREDCORR(metodo,nombrefunc)
BEGIN
LOCAL fty, a, b, , n;
LOCAL h,i,k1,k2,k3,k4;
LOCAL w,t,f;
LOCAL okdata, colum, itera;
fty:='Y-T^2+1'; a:=0; b:=2; :=0.5; n:=10; okdata:=0;
REPEAT
fty:=EXPR("''"+fty+"''");
IF INPUT({fty,a,b,,n},
" "+metodo+" V1.0 ",
{"F(T,Y):","A :","B :"," :","N :"},
{"'F(T,Y)' entre comilla [Shift] [( ) N], T Y MAYUSCULAS",
"Ingrese limite inferior T=A",
"Ingrese limite superior T=B",
"Ingrese condicion inicial =Y(A)",
"N=Num. de particiones en T, Entero positivo"},
{quote('Y-T^2+1'),0,2,0.5,10})
THEN
E1:=fty;
CASE
IF TYPE(fty)==0 THEN
MSGBOX("Debe ingresar 'F(T,Y)' entre comilla
simple usando teclas [Shift] [( ) N]");
fty:='Y-T^2+1';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF n<0 OR IP(n)n THEN
MSGBOX("Se requiere: N ENTERO POSITIVO")
END;

DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOEQDIFF1VAR(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
T:=a;
Y:=;
h:=(b-a)/n;
f:={};
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i","Ti","K1","K2","K3","K4","Wi"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
L9:={};
L9(1):=0;
L9(2):=T;
// L9(3):=Y;
FOR colum FROM 1 TO SIZE(L9) DO
Spreadsheet.Cell(2,colum):= L9(colum);
END;
Spreadsheet.Cell(2,7):=Y;
PRINT();
// i:=1;
FOR i FROM 1 TO 3 DO
MUESTRAitera(i);
w:=Y;
t:=T;
f(i):=approx(E1);
L9:={};
L9(1):=i;
// T:=a+i*h;
L9(2):=a+i*h;
k1:=h*approx(E1);
L9(3):=k1;
T:=t+h/2;
Y:=w+k1/2;
k2:=h*approx(E1);
L9(4):=k2;
Y:=w+k2/2;

k3:=h*approx(E1);
L9(5):=k3;
T:=t+h;
Y:=w+k3;
k4:=h*approx(E1);
L9(6):=k4;
Y:=w+(k1+2*k2+2*k3+k4)/6;
L9(7):=Y;
FOR colum FROM 1 TO SIZE(L9) DO
Spreadsheet.Cell(i+2,colum):= L9(colum);
END;
T:=a+i*h;
END;
f(4):=approx(E1);
L0:={"i","Ti","WiPredic","Wi.Correg"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1+5,colum):= L0(colum);
END;
FOR i FROM 4 TO n DO
MUESTRAitera(i);
T:=a+i*h;
w:=Y;
// t:=T;
L9:={};
L9(1):=i;
L9(2):=a+i*h;
Y:=w+h*(55*f(i)-59*f(i-1)+37*f(i-2)-9*f(i-3))/24;
L9(3):=Y;
Y:=w+h*(9*approx(E1)+19*f(i)-5*f(i-1)+f(i-2))/24;
L9(4):=Y;
f(i+1):=approx(E1);
FOR colum FROM 1 TO SIZE(L9) DO
Spreadsheet.Cell(i+3,colum):= L9(colum);
END;
END;
// agregando mas detalles al spreadsheet
Spreadsheet.Cell(n+4,2):= metodo;
Spreadsheet.Cell(n+4,3):= "N:"+n;
Spreadsheet.Cell(n+5,2):= "h: "+h;

MUESTRAresult();
END;
// SISTEMA DE EQ DIFF, RK SIST
EQDIFFSIST()
BEGIN
LOCAL metodo2;
IF
CHOOSE(metodo2,
"SIST. EQs DIFERENCIALES :",
"Runge-Kutta Sistemas")
THEN
CASE
IF metodo2==1 THEN
METODOEQDIFFSIST("Runge-Kutta 4. Sistemas", "EQDIFFSISTRK4");
END;
END;
ELSE EQDIFF();
END;
END;
// CODIGO SIGUIENTE NECESARIO PARA REGRESAR A MENU ANTERIOR.
METODOEQDIFFSIST(metodo,nombrefunc)
BEGIN
LOCAL accion;
IF
CHOOSE(accion, "METODO: "+metodo,
"Ejecutar "+metodo,
"Ver Tabla Resultados")
THEN
CASE
IF accion==1 THEN
EXPR(nombrefunc+"(metodo,
nombrefunc)") END;
IF accion==2 THEN
STARTAPP("Spreadsheet"); END;
// STARTAPP("Analisis Numerico") END;
END;
// RETURN accion;
ELSE EQDIFFSIST();
END;
END;
//
// EQ. DIFF. SISTEMAS // RUNGE KUTTA 4 PARA SISTEMAS.
EQDIFFSISTRK4(metodo,nombrefunc)
BEGIN
LOCAL fj, a, b, j, n;
LOCAL h,i,j,k1,k2,k3,k4;

LOCAL wj,t,uj,m;
LOCAL okdata, colum, itera;
fj:={EXPR("''"+'U2'+"''"),EXPR("''"+'EXP(2*T)*SIN(T)-2*U1+2*U2'+"''")};
a:=0; b:=1; j:={-0.4,-0.6}; n:=10; okdata:=0;
REPEAT
// fty:=EXPR("''"+fty+"''");
IF INPUT({fj,a,b,j,n},
" "+metodo+" V1.0 ",
{"{Fj(T,U1,..)}:","A :","B :","{j} :","N :"},
{"LISTA d Func {'dU1','dU2'..}, T U1 U2.. MAYUSCULAS",
"Ingrese limite inferior T=A",
"Ingrese limite superior T=B",
"Ingrese LISTA d condicion inicial {U1(A),U2(A)..}",
"N=Num. de particiones en T, Entero positivo"},
{{EXPR("''"+'U2'+"''"),EXPR("''"+'EXP(2*T)*SIN(T)-2*U1+2*U2'+"''")},0,1,{-0.4,0.6},10})
THEN
// {quote('Y-T^2+1'),0,2,0.5,10})
// E1:=fty;
CASE
IF SIZE(fj)SIZE(j) THEN
MSGBOX("Se requiere: A<B")
END;
IF ab THEN
MSGBOX("Se requiere:
Nro. de Funciones =
Nro. de Cond. Iniciales")
END;
IF n<0 OR IP(n)n THEN
MSGBOX("Se requiere: N ENTERO POSITIVO")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOEQDIFFSIST(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
m:=SIZE(j);
uj:={};
FOR i FROM 1 TO m DO
uj(i):=EXPR("'U"+i+"'");
END;
h:=(b-a)/n;
wj:={};
t:=a;
k1:=j;

k2:=j;
k3:=j;
k4:=j;
T:=a;
wj:=j;
Spreadsheet.Cell(0,0,1):=Spreadsheet.AA1000;
L0:={"i","Ti","j","Wji","K1j","K2j","K3j","K4j"};
FOR colum FROM 1 TO SIZE(L0)
DO
Spreadsheet.Cell(1,colum):= L0(colum);
END;
FOR j FROM 1 TO m DO
L9:={};
L9(1):=0;
L9(2):=T;
L9(3):=j;
L9(4):=wj(j);
FOR colum FROM 1 TO SIZE(L9) DO
Spreadsheet.Cell(2+j-1,colum):= L9(colum);
END;
END;
PRINT();
// i:=1;
FOR i FROM 1 TO n DO
MUESTRAitera(i);
t:=T;
//iniciando Uj
FOR j FROM 1 TO m DO
EXPR(uj(j)+":="+wj(j));
END;
// calcular K1j
FOR j FROM 1 TO m DO
k1(j):=h*approx(fj(j));
END;
T:=t+h/2;
// actualiza uj;
FOR j FROM 1 TO m DO
EXPR(uj(j)+":="+(wj(j)+k1(j)/2) );
END;
// calcular K2j
FOR j FROM 1 TO m DO
k2(j):=h*approx(fj(j));
END;
// actualiza uj;
FOR j FROM 1 TO m DO

EXPR(uj(j)+":="+(wj(j)+k2(j)/2) );
END;
// calcular K2j
FOR j FROM 1 TO m DO
k3(j):=h*approx(fj(j));
END;
T:=t+h;
// actualiza uj;
FOR j FROM 1 TO m DO
EXPR(uj(j)+":="+(wj(j)+k3(j)) );
END;
// calcular K2j
FOR j FROM 1 TO m DO
k4(j):=h*approx(fj(j));
END;
// CALCULAR Wj
FOR j FROM 1 TO m DO
wj(j):=wj(j)+(k1(j)+2*k2(j)+2*k3(j)+k4(j))/6;
END;
T:=a+i*h;
FOR j FROM 1 TO m DO
L9:={};
L9(1):=i;
L9(2):=T;
L9(3):=j;
L9(4):=wj(j);
L9(5):=k1(j);
L9(6):=k2(j);
L9(7):=k3(j);
L9(8):=k4(j);
FOR colum FROM 1 TO SIZE(L9) DO
Spreadsheet.Cell(i*m+2+j-1,colum):= L9(colum);
END;
END;
END;
// agregando mas detalles al spreadsheet
Spreadsheet.Cell(n*m+4,2):= metodo;
Spreadsheet.Cell(n*m+4,3):= "N:"+n;
Spreadsheet.Cell(n*m+5,2):= "h: "+h;
MUESTRAresult();
END;

// EQ DIFF DERIVADAS PARCIALES

EQDIFFDERPAR()
BEGIN
LOCAL metodo2;
IF
CHOOSE(metodo2,
"EQ DIFF Deriv.Parciales :",
"Eliptpcas/ Poison","Parablicas/ Eq.Calor","Hiperblicas/ Eq.Onda")
THEN
CASE
IF metodo2==1 THEN
METODOEQDIFFDERPAR("Eliptpcas/ Poison", "EQDIFFDERPARELIP");
END;
IF metodo2==2 THEN
METODOEQDIFFDERPAR("Parablicas/ Eq.Calor", "EQDIFFDERPARPARAB");
END;
IF metodo2==3 THEN
METODOEQDIFFDERPAR("Hiperblicas/ Eq.Onda","EQDIFFDERPARHIPER");
END;
END;
ELSE EQDIFF();
END;
END;
// CODIGO SIGUIENTE NECESARIO PARA REGRESAR A MENU ANTERIOR.
METODOEQDIFFDERPAR(metodo,nombrefunc)
BEGIN
LOCAL accion;
IF
CHOOSE(accion, "METODO: "+metodo,
"Ejecutar "+metodo,
"Ver Tabla Resultados")
THEN
CASE
IF accion==1 THEN
EXPR(nombrefunc+"(metodo,
nombrefunc)") END;
IF accion==2 THEN
STARTAPP("Spreadsheet"); END;
// STARTAPP("Analisis Numerico") END;
END;
// RETURN accion;
ELSE EQDIFFDERPAR();
END;
END;
//
// EQ. DIFF. DERIV. PARCIALES / ELIPTICAS.
EQDIFFDERPARELIP(metodo,nombrefunc)
BEGIN
LOCAL fxy, a, b, c, d;

LOCAL ga,gb,gc,gd, n, m, n1, m1;


LOCAL h,k,xi,yj,i,j;
LOCAL v1,v2,v3,v4,v5,v6,v7;
LOCAL fi,w,aa,,,eqdiff,bb;
LOCAL okdata, colum, itera,salir;
fxy:='X*EXP(Y)'; a:=0; b:=2; c:=0; d:=1;
ga:='0'; gb:='2*EXP(Y)'; gc:='X'; gd:='X*EXP(1)'; n:=6; m:=5; okdata:=0;
ga:=EXPR("''"+ga+"''");
gb:=EXPR("''"+gb+"''");
gc:=EXPR("''"+gc+"''");
gd:=EXPR("''"+gd+"''");
REPEAT
fxy:=EXPR("''"+fxy+"''");
IF INPUT({fxy,a,b,c,d,ga,gb,gc,gd,n,m},
" "+metodo+" V1.0 ",
{"F(X,Y):","A :","B :","C :","D :","GA :","GB :","GC :","GD :","N: ","M: "},
{"'F(X,Y)' entre comilla, Uxy/x+Uxy/y=F(X,Y)",
"Ingrese limite inferior en X",
"Ingrese limite superior en X",
"Ingrese limite inferior en Y",
"Ingrese limite superior en Y",
"Condicin Frontera en X=A, GA(X,Y)",
"Condicin Frontera en X=B, GB(X,Y)",
"Condicin Frontera en Y=C, GC(X,Y)",
"Condicin Frontera en Y=D, GD(X,Y)",
"N= Numero de particiones en X",
"M= Numero de particiones en Y"},
{quote('X*EXP(Y)'),0,2,0,1, quote('0'),quote('2*EXP(Y)'),
quote('X'),quote('X*EXP(1)'),6,5})
THEN
E1:=fxy;
CASE
IF TYPE(fxy)==0 THEN
MSGBOX("Debe ingresar 'F(X,Y)' entre comilla
simple usando teclas [Shift] [( ) N]");
fxy:='X*EXP(Y)';
END;
IF ab THEN
MSGBOX("Se requiere: A<B")
END;
IF cd THEN
MSGBOX("Se requiere: C<D")
END;
IF n<3 OR m<3 OR IP(n)n OR IP(m)m THEN
MSGBOX("Se requiere: ENTEROS N3 M3")
END;
DEFAULT okdata:=1;
END;

ELSE
MSGBOX( metodo + " CANCELADO...");
METODOEQDIFFDERPAR(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
n1:=n-1;
m1:=m-1;
h:=(b-a)/n;
k:=(d-c)/m;
// CALCULAR Xi
L1:=MAKELIST(a+h*I,I,1,n1,1);
M1:=list2mat(L1,SIZE(L1));
xi:=row(M1,1);
// CALCULAR Yj
L1:=MAKELIST(c+k*J,J,1,m1,1);
M1:=list2mat(L1,SIZE(L1));
yj:=row(M1,1);
// Evaluacin de fxy en los puntos de malla
fi:=MAKEMAT(0,m1,n1);
// resultados en puntos de malla
w:=fi;
// matriz de coeficientes aa
aa:=MAKEMAT(0,m1*n1,m1*n1);
//
:=h^2/k^2;
:=2*(+1);
// formando eq diff general
eqdiff:=""++"*Wi,j - (Wi+1,j + Wi-1,j)-"++"*(Wi,j+1 + Wi,j-1)=-"+
(h^2)+"*F(Xi,Yj)";
// creando y llenando bb
bb:=MAKEMAT(0,m1*n1,1);
FOR i FROM 1 TO n1*m1 DO
X:=xi(( (i-1) MOD n1 )+1);
Y:=yj(m1-IP((i-1)/n1));
bb(i,1):=0-h^2*approx(E1);
END;
// actualizar fi
FOR i FROM 1 TO m1 DO
FOR j FROM 1 TO n1 DO
fi(i,j):=bb((i-1)*n1+j,1);
END;
END;
FOR i FROM 1 TO n1*m1 DO
aa(i,i):=;
// EST AL BORDE DERECHO
IF (i MOD n1)==0

THEN
X:=b;
Y:=yj(m1-IP((i-1)/n1));
bb(i,1):=bb(i,1)+approx(gb);
ELSE
aa(i,i+1):=-1;
END;
// EST AL BORDE IZQUIERDO
IF (i MOD n1)==1
THEN
X:=a;
Y:=yj(m1-IP((i-1)/n1));
bb(i,1):=bb(i,1)+approx(ga);
ELSE
aa(i,i-1):=-1;
END;
// EST AL BORDE SUPERIOR
IF in1
THEN
X:=xi(( (i-1) MOD n1 )+1);
Y:=d;
bb(i,1):=bb(i,1)+*approx(gd);
ELSE
aa(i,i-n1):=-;
END;
// EST AL BORDE INFERIOR
IF i>(n1*m1-n1)
THEN
X:=xi(( (i-1) MOD n1 )+1);
Y:=c;
bb(i,1):=bb(i,1)+*approx(gc);
ELSE
aa(i,i+n1):=-;
END;
END; // end del for i n1*m1 para analizar bordes.
M1:=bb/aa;
FOR i FROM 1 TO m1 DO
FOR j FROM 1 TO n1 DO
w(i,j):=M1((i-1)*n1+j,1);
END;
END;
// RESULTADOS EN INPUT:
REPEAT
// fxy:=EXPR("''"+fxy+"''");
v1:=eqdiff;v2:=xi;v3:=yj;v4:=fi;
v5:=aa;v6:=bb;v7:=w;
INPUT({v1,v2,v3,v4,v5,v6,v7},
" "+metodo+" V1.0 RESULTADOS",

{"EqDiff:","Xi :","Yj :","F(Xi,Yj) :","A :","B :","W(Xi,Yj) :"},


{"Ecuacin de diferencias Wij",
"A+I*h I=1,2...n-1",
"C+J*k J=1,2...m-1",
"F(Xi,Yj) en los puntos de malla",
"Matriz de coeficientes de los Wij",
"Vector columna de constantes",
"W(Xi,Yj) en puntos de malla, ver M1= W COLUMNA"},
{eqdiff,xi,yj,fi,aa,bb,w});
IF CHOOSE(salir,"Accin?",
{"VER RESULTADOS OTRA VEZ","SALIR"})
THEN
END;
UNTIL salir-1;
END;

//
// EQ. DIFF. DERIV. PARCIALES / PARABOLICAS.
EQDIFFDERPARPARAB(metodo,nombrefunc)
BEGIN
LOCAL fx, l, T, , m, N;
LOCAL h,k,m1,i,j,w,w0,t;
LOCAL xi,,eqdiff,aa;
LOCAL v1,v2,v3,v4,v5,v6,v7;
LOCAL okdata, colum, itera, salir;
fx:='SIN(*X)'; l:=1; T:=0.5; :=1; m:=10; N:=50; okdata:=0;
//ga:=EXPR("''"+ga+"''");
//gb:=EXPR("''"+gb+"''");
REPEAT
fx:=EXPR("''"+fx+"''");
IF INPUT({fx,l,T,,m,N},
" "+metodo+" V1.0 ",
{"U(X,t=0):","l :","T :"," :","m :","N :"},
{"'U(X)' entre comilla, Uxt/t-*Uxt/x=0",
"Ingrese punto extremo l o longitud, h=l/m",
"Ingrese tiempo maximo, k=T/N",
"Ingrese constante alpha",
"Ingrese m 3 particiones en l(X), h=l/m ",
"Ingrese N 1 particiones en T, k=T/N"},
{quote('SIN(*X)'),1,0.5,1,10,50})
THEN
F1:=fx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X,Y)' entre comilla

simple usando teclas [Shift] [( ) N]");


fx:='SIN(*X)';
END;
IF m<3 OR N<1 OR IP(N)N OR IP(m)m THEN
MSGBOX("Se requiere: ENTEROS N1 m3")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOEQDIFFDERPAR(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
m1:=m-1;
h:=l/m;
k:=T/N;
// CALCULAR Xi
L1:=MAKELIST(h*I,I,1,m1,1);
M1:=list2mat(L1,SIZE(L1));
xi:=row(M1,1);
// CALCULAR FXi
w0:=MAKEMAT(0,m1,1);
// Evaluacin de fxi w0
FOR i FROM 1 TO m1 DO
X:=xi(i);
w0(i,1):=approx(F1(X));
END;
// copiar w0 a w, matriz m1x1
w:=w0;
//
:=^2*k/h^2;
l:=2*+1;
// formando eq diff general
eqdiff:=""+l+"*Wi,j - "++"*Wi+1,j - "++"*Wi-1,j = Wi,j-1";
// creando y llenando bb
aa:=MAKEMAT(0,m1,m1);
FOR i FROM 1 TO m1 DO
aa(i,i):=l;
// bb(i,1):=0-h^2*approx(E1);
END;
FOR i FROM 1 TO m1-1 DO
aa(i,i+1):=-;
END;
FOR i FROM 2 TO m1 DO
aa(i,i-1):=-;
END;

//MOSTRAR N VECES RESULTADO PARA CADA Ti


FOR j FROM 1 TO N DO
t:=j*k;
w:=w0/aa;
// RESULTADOS EN INPUT:
REPEAT
v1:=eqdiff;v2:=xi;v3:=t;v4:=aa;
v5:=w0;v6:=w;
INPUT({v1,v2,v3,v4,v5,v6},
" "+metodo+" V1.0 RESULT:"+j+"/"+N,
{"EqDiff:","Xi :","T"+j+" :","A :","Wi,j-1 :","Wi,j :"},
{"Ecuacin de diferencias Wij",
"I*h I=1,2...m-1",
"Tiempo en J="+j,
"Matriz de coeficientes de los Wij",
"Vector Wi en T=j-1 (anterior),j0 Wi=F(Xi)",
"Vector Wi en T=j (actual)"},
{eqdiff,xi,t,aa,w0,w});
w0:=w;
IF CHOOSE(salir,"Accin?",
{"VER OTRA VEZ T="+t,"AVANZAR","TERMINAR"})
THEN
IF salir==3 THEN j:=50; END;
END;
UNTIL salir-1;
END; // DEL FOR 1 N, N particiones en T,
MSGBOX(" FIN ");
END;

//
// EQ. DIFF. DERIV. PARCIALES / HIPERBOLICAS.
EQDIFFDERPARHIPER(metodo,nombrefunc)
BEGIN
LOCAL fx,gx, l, T, , m, N;
LOCAL h,k,m1,i,j,w,w0,t;
LOCAL xi,2,eqdiff,aa,w1;
LOCAL v1,v2,v3,v4,v5,v6,v7;
LOCAL okdata, colum, itera, salir;
fx:='SIN(*X)'; gx:='0'; l:=1; T:=1; :=2; m:=10; N:=20; okdata:=0;
gx:=EXPR("''"+gx+"''");
//gb:=EXPR("''"+gb+"''");
REPEAT
fx:=EXPR("''"+fx+"''");
// gx:=EXPR("''"+gx+"''");
IF INPUT({fx,gx,l,T,,m,N},

" "+metodo+" V1.0 ",


{"F(X):","G(X):","l :","T :"," :","m :","N :"},
{"U(X,0)='F(X)' con comilla, Uxt/t-*Uxt/x=0",
"Ingrese Funcin G(X), U(X,0)/t=G(X)",
"Ingrese punto extremo l o longitud, h=l/m",
"Ingrese tiempo maximo, k=T/N",
"Ingrese constante alpha",
"Ingrese m 3 particiones en l(X), h=l/m ",
"Ingrese N 1 particiones en T, k=T/N"},
{quote('SIN(*X)'),quote('0'),1,1,2,10,20})
THEN
F1:=fx;
F2:=gx;
CASE
IF TYPE(fx)==0 THEN
MSGBOX("Debe ingresar 'F(X)' entre comilla
simple usando teclas [Shift] [( ) N]");
fx:='SIN(*X)';
END;
IF m<2 OR N<2 OR IP(N)N OR IP(m)m THEN
MSGBOX("Se requiere: ENTEROS N2 m2")
END;
DEFAULT okdata:=1;
END;
ELSE
MSGBOX( metodo + " CANCELADO...");
METODOEQDIFFDERPAR(metodo,nombrefunc);
okdata:=1;
RETURN(0);
END;
UNTIL okdata;
m1:=m-1;
h:=l/m;
k:=T/N;
// CALCULAR Xi
L1:=MAKELIST(h*I,I,1,m1,1);
M1:=list2mat(L1,SIZE(L1));
xi:=row(M1,1);
// CALCULAR FXi
w0:=MAKEMAT(0,m1,1);
// iniciar en 0 w1 y w, matriz m1x1
w1:=w0;
// Evaluacin de fxi w0
FOR i FROM 1 TO m1 DO
X:=xi(i);
w0(i,1):=approx(F1(X));
END;
w:=w0;
// :=^2*k/h^2; // DE PARABOLICAS

2:=(*k/h)^2;
l:=2*(1-2);
// formando eq diff general
eqdiff:="Wi,j = "+(l/2)+"*F(Xi) + "+(2/2)+"+F(Xi+1) + "+(2/2)+"+F(Xi-1) +
"+k+"*G(Xi) ";
// creando y llenando aa
aa:=MAKEMAT(0,m1,m1);
FOR i FROM 1 TO m1 DO
aa(i,i):=l;
// bb(i,1):=0-h^2*approx(E1);
END;
FOR i FROM 1 TO m1-1 DO
aa(i,i+1):=2;
END;
FOR i FROM 2 TO m1 DO
aa(i,i-1):=2;
END;
// evaluando f(xi) f(xi-1) k gx
FOR i FROM 1 TO m1 DO
X:=i*h;
w1(i,1):=k*approx(gx)+l/2*approx(F1(X))+2/2*(approx(F1(X+h))+approx(F1(X-h)));
// X:=X+h;
// w1(i,1):=w(i,1)+2/2*approx(F1(X));
// X:=X-2*h;
// w1(i,1):=w(i,1)+2/2*approx(F1(X));
END;
//MOSTRAR N VECES RESULTADO PARA CADA Ti
FOR j FROM 2 TO N DO
t:=j*k;
w:=aa*w1-w0;
// RESULTADOS EN INPUT:
REPEAT
v1:=eqdiff;v2:=xi;v3:=t;v4:=aa;
v5:=w1;v6:=w0;v7:=w;
INPUT({v1,v2,v3,v4,v5,v6,v7},
" "+metodo+" V1.0 RESULT:"+j+"/"+N,
{"EqDiff:","Xi :","T"+j+" :","A :","Wi,j-1 :","Wi,j-2 :","Wi,j :"},
{"Ecuacin de diferencias Wij",
"I*h I=1,2...m-1",
"Tiempo en J="+j,
"Matriz de coeficientes de los Wij",
"Vector Wi en T=j-1 (anterior),j1 EqDiff",
"Vector Wi en T=j-2 (anterior-1),j0 Wi=F(Xi)",
"Vector Wi en T=j (actual)"},
{eqdiff,xi,t,aa,w1,w0,w});
w0:=w1;
w1:=w;
IF CHOOSE(salir,"Accin?",
{"VER OTRA VEZ T="+t,"AVANZAR","TERMINAR"})

THEN
IF salir==3 THEN j:=N; END;
END;
UNTIL salir-1;
END; // DEL FOR 1 N, N particiones en T,
MSGBOX(" FIN ");
END;
// FIN DE EQs DIFF
VIEW "Informacin y Autora",INFOAUT()
BEGIN
STARTVIEW(6,1);
END;
//////////////////////////////////////
// Funciones varias
//////////////////////////////////////
MUESTRAitera(ii)
BEGIN
LOCAL itera;
itera:=" Calculando iteracin: "+ii+" ";
TEXTOUT_P(" Calculando iteracin: 12",
10,4,4,#99CC33h,300,#99CC33h);
TEXTOUT_P(" Calculando iteracin: 12",
10,36,4,#99CC33h,300,#99CC33h);
TEXTOUT_P(" Calculando iteracin: 12",
10,20,4,#99CC33h,300,#99CC33h);
TEXTOUT_P(itera,G0,10,20,4,#000000h,
300,#99CC33h); wait(0.1);
END;
PINTAraiz(ii,colraiz)
BEGIN
LOCAL txtfin:="Fin", txtraiz:="Raiz ";
// EXPR("Spreadsheet.A"+(ii+2)
// +":"+CHAR(96+ncols)
// +(ii+2)+":=txtfin");
// EXPR("Spreadsheet."+CHAR(97+ncols)
// +"1:"+CHAR(97+ncols)+(ii+2)
// +":=txtfin");
EXPR("Spreadsheet.Cell("+(ii+2)
+",colraiz):=txtraiz");
EXPR("Spreadsheet.Cell(0,0,7):=1");
EXPR("Spreadsheet.Cell("+(ii+1)
+",colraiz,7):=512");
END;
MUESTRAresult()

BEGIN
MSGBOX("Se MOSTRAR las iteraciones
en la HOJA DE CALCULO, Para EJECUTAR
OTRA VEZ use [Apps]/Analisi Numerico");
STARTAPP("Spreadsheet");
END;

You might also like