viernes, 4 de mayo de 2007

Producto de matrices.

Producto de matrices.


Comienzo por esto por dos motivos el primero es lo más fácil de entender y explicar y segundo tiene importancia ya que para encontrar la solución a un sistema de ecuaciones lineales de NxN basta multiplicar la inversa de la matriz de las ecuaciones por el vector de los términos independientes.


Multiplicar matrices no es como multiplicar números, por algunos motivos no siempre dos matrices se pueden multiplicar (con los números no nos encontramos con este problema, ni con la multiplicación de una matriz con un numero o escalar, pero este ultimo caso no sera tratado aquí), en caso que esta operación se pueda realizar el resultado no es conmutativo es decir si tenemos dos matrices A y B, A x B <> B x A, es más se pueden presentar casos que si podemos hacer A x B, B x A puede resultar imposible de realizar. Seguramente si aprobaron algún curso de matemática esto no les va a quitar el sueño, pero si no lo aprobaron, lo están cursando y no llegaron a este punto puede ser una sorpresa.


Cual es el motivo de todo esto bueno son las distintas dimensiones de las matrices, es decir la cantidad de filas y columnas que tiene cada matriz es la que decide si se puede hacer o no la operación de multiplicación.


En general tenemos esto C = A x B con un determinado numero de filas y columnas para que se pueda realizar una multiplicación las cosas deben ser así:


C [m,p]= A[m,n] x B[n,p] Como podemos ver si la matriz A no tiene el mismo numero de columnas que filas la matriz B, la operación no podrá ser realizada. No por capricho simplemente por la definición de multiplicación matricial. Como vemos no solo no es conmutativo sino que cada matriz interviniente en la operación puede tener dimensiones distintas.


Bueno y cual es la definición de la multiplicación entre matrices.

C [i,j] = A[i,1] x B[1,j] + A[i,2] x B[2,j] + ................ + A[i, n] x B[n, j]


Ahora queda un poco más claro el propósito del código:

0050 FOR JS=0 TO N1; FOR IS=0 TO M1; FOR TS=0 TO M; LET P[TS,JS]=P[TS,JS]+S[IS,JS]*R[TS,IS]

0060 NEXT TS; NEXT IS; NEXT JS

Que puse en otro post sobre este tema. Donde Ts y Js representan los elementos de la matriz resultado.

jueves, 3 de mayo de 2007

Donde Buscar?

En cuanto a los temas preguntados en general es debido al desconocimiento de los métodos de calculo. Ya sea la forma adecuada de programarlos (cosa normal la primera ves que nos enfrentamos a un desarrollo) y también por desconocer completamente los métodos de resolución. Se pueden hacer unas simples consultas en el Google (o incluso en la Wikipedia que también hay bastante información) sobre este tema.

Sugiero hacer unas búsquedas sobre lo siguiente.

  • Método Gauss – Jordan
  • Método División L U
  • Método de Chio
  • Regla de Sarrus

Con solo hacer estas cuatro búsquedas básicas en Internet podremos acceder a mucha información que nos resulte de utilidad para poder realizar un programa (o toda una serie de ellos) que puedan resolver este tipo de situaciones.

Codificación Parte II

Acá les envio el código de los sub programas o rutinas externas o modulos como quieran llamarlos
------------------------------------------------------------------------------------------------

0010 REM "MATCHI"
0020 REM "SUBPROGRAMA DE MATRIX"
0030 REM "RESULUCION POR CHIO"
0040 ENTER CO,N,M,X,R[ALL],E,CH
0050 LET CH=0
0060 IF CO<>2 THEN GOTO 0100
0070 FOR I=0 TO N; FOR J=X TO M; IF I+X<>J THEN GOTO 0090
0080 LET R[I,J]=1
0090 NEXT J; NEXT I
0100 LET E=1; FOR A=0 TO N; LET IC=A; IF A=N THEN GOTO 0180
0110 LET AM=ABS(R[A,A]); FOR J=A+1 TO N; IF AM>=ABS(R[J,A]) THEN GOTO 0130
0120 LET AM=ABS(R[J,A]); LET IC=J
0130 NEXT J; IF AM<>0 THEN GOTO 0160
0140 IF CO>0 THEN LET CH=1; GOTO 0230
0150 LET E=0; GOTO 0230
0160 IF IC=A THEN GOTO 0190
0170 LET E=-E; FOR J=A TO M; LET AM=R[A,J]; LET R[A,J]=R[IC,J]; LET R[IC,J]=AM; NEXT J; GOTO 0190
0180 IF R[N,N]=0 THEN GOTO 0140
0190 LET L=R[A,A]; LET E=E*L; FOR I=A TO M; LET R[A,I]=R[A,I]/L; NEXT I
0200 FOR I=0 TO N; FOR J=A TO M; IF I=A OR J=A THEN GOTO 0220
0210 LET R[I,J]=R[I,J]-R[A,J]*R[I,A]
0220 NEXT J; NEXT I; NEXT A
0230 EXIT
------------------------------------------------------------------------------------------------

0010 REM "MATDLU"
0020 REM "SUBPROGRAMA DE MATRIX"
0030 REM "CALCULA POR DIVISION L/U"
0040 ENTER CO,N,M,X,R[ALL],E,CH
0050 LET CH=0,E=1
0060 IF CO<>2 THEN GOTO 0100
0070 FOR I=0 TO N; FOR J=X TO M; IF I+X<>J THEN GOTO 0090
0080 LET R[I,J]=1
0090 NEXT J; NEXT I
0100 FOR A=0 TO N; LET IC=A; IF A=N THEN GOTO 0160
0110 LET AM=ABS(R[A,A]); FOR J=A+1 TO N; IF AM>=ABS(R[J,A]) THEN GOTO 0130
0120 LET AM=ABS(R[J,A]); LET IC=J
0130 NEXT J; IF AM<>0 THEN GOTO 0170
0140 IF CO>0 THEN LET CH=1; GOTO 0280
0150 LET E=0; GOTO 0280
0160 IF R[N,N]=0 THEN GOTO 0140
0170 IF IC=A THEN GOTO 0190
0180 LET E=-E; FOR J=A TO M; LET AM=R[A,J],R[A,J]=R[IC,J],R[IC,J]=AM; NEXT J
0190 LET E=E*R[A,A]; IF A=N THEN GOTO 0230
0200 FOR I=A+1 TO N; IF R[I,A]=0 THEN GOTO 0220
0210 LET G=R[A,A]/R[I,A],E=E/G; FOR J=A TO M; LET R[I,J]=R[I,J]*G-R[A,J]; NEXT J
0220 NEXT I
0230 NEXT A
0240 IF CO=0 THEN GOTO 0280
0250 FOR B=N+1 TO M; LET R[N,B]=R[N,B]/R[N,N]; NEXT B
0260 FOR A=N-1 TO 0 STEP -1; FOR I=N+1 TO M; FOR J=N TO A+1 STEP -1
0270 LET R[A,I]=R[A,I]-R[A,J]*R[J,I]; NEXT J; LET R[A,I]=R[A,I]/R[A,A]; NEXT I; NEXT A
0280 EXIT
------------------------------------------------------------------------------------------------

0010 REM "MATPRO"
0020 REM "SUBPROGRAMA DE MATRIX"
0030 REM "PRODUCTO MATRICIAL"
0040 ENTER M,M1,N1,R[ALL],S[ALL],P[ALL]
0050 FOR JS=0 TO N1; FOR IS=0 TO M1; FOR TS=0 TO M; LET P[TS,JS]=P[TS,JS]+S[IS,JS]*R[TS,IS]
0060 NEXT TS; NEXT IS; NEXT JS
0070 EXIT
------------------------------------------------------------------------------------------------

Bueno acá esta todo lo que faltaba para que el programa funcione.
Tengan en cuenta los distintos dialectos del Basic. Sean pacientes y no deseperen que ire explicando todo en cuanto y a medida que tenga tiempo disponible.
Suerte y por favor si sos estudiante no creas que todo esto se puede hacer o enterder en un rato o noche lleva un poco mas de tiempo.

Codificacion Parte I

Como para ir tratando algo de este tema acá les paso el código del programa principal que les comente. Cuidado esta realizado en un Basic muy añejo Así que con cuidado no le entren muy fuerte a menos que sean veteranos en el tema.

0010 REM "MATRIX"
0020 REM "ALGEBRA MATRICIAL"
0030 REM "LISTADO DE SUBPROGRAMAS"
0040 REM "MATCHI"
0050 REM "MATPRO"
0060 REM "MATDLU"
0070 BEGIN ; PRINT 'CS'
0080 REM "PRIMERA PANTALLA"
0090 LET CH$="MATRIX"; GOSUB 1960; PRINT @(CH,9),CH$,@(GH,10),GH$,@(GH,8),GH$, @(GH,9),"*",@(GF,9),"*"
0100 LET CH$="PULSE UNA TECLA PARA CONTINUAR"; GOSUB 1960; PRINT @(CH,21),CH$, @(GH,20),GH$,@(GH,22),GH$,@(GH,21),"*",@(GF,21),"*"
0110 INPUT (0,ERR=0110,SIZ=1)@(79,22),CH$
0120 PRINT 'CS'
0130 INPUT (0,ERR=0130)@(10,10),"SU NOMBRE ?",N$; IF N$<>"JAVIER" THEN GOTO 0170
0140 INPUT (0,ERR=0140)@(10,11),"SU APELLIDO ?",A$; IF A$="LEIRO" THEN GOTO 0160
0150 IF A$="SOUTO" THEN LET N$="TIO"; GOTO 0170
0160 LET N$="PAPI"
0170 LET UFA$=STBL("QUIEN",N$); PRINT @(10,13),"HOLA ",STBL("QUIEN"); WAIT 1
0180 REM "MENU UNO"
0190 PRINT 'CS'; PRECISION 14; LET CA=0
0200 LET Z$="***************************"; PRINT @(29,2),Z$,@(29,17),Z$,@(29,19),Z$
0210 FOR I=2 TO 19; PRINT @(28,I),"*",@(56,I),"*"; NEXT I
0220 PRINT @(32,3),'BU',"MENU DE OPERACION",'EU',@(32,7),"1-Determinantes",@(3 2,9),"2-Ecuaciones",@(32,11),"3-Inversion matricial",@(32,13),"4-Producto
0220: matricial",@(32,15),"5-Chau !!!"
0230 INPUT (0,ERR=0230)@(32,18),"OPCION ?",CO:(5); IF CO=0 THEN GOTO 0230
0240 IF CO=5 THEN GOTO 0290
0250 IF CO<>2 AND CO<>3 THEN GOTO 0310
0260 PRINT 'CS',@(32,0),'BU',"AUTOCOMPROBACION",'EU',@(5,5),"1-NO",@(5,7),"2-SI"
0270 INPUT (0,ERR=0270)@(10,10),"OPCION ? ",AU:(2); IF AU=0 THEN GOTO 0270
0280 LET AU=AU-1; GOTO 0310
0290 PRINT 'CS'; END
0300 REM "MENU DOS"
0310 PRINT 'CS','SB',@(31,0),'BR',"QUE HACEMOS ",STBL("QUIEN"),'ER'; LET GK=0
0320 LET Z$="**********************"; PRINT 'SB',@(29,3),Z$,@(29,16),Z$,@(29,18),Z$
0330 FOR I=3 TO 18; PRINT @(28,I),"*",@(51,I),"*",; NEXT I
0340 PRINT @(31,4),'BU',"MENU DE EJECUCION",'EU',@(31,7),"1-INGRESO DATOS",@(31,9),"2-LISTADO PANTALLA",@(31,11),"3-CORRECCION",@(31,13),"4-EJECUTE OPC
0340:ION",@(31,15),"5-MENU OPCIONES"
0350 INPUT (0,ERR=0350)@(32,17),"COMANDO ?",CE:(5); IF CE=0 THEN GOTO 0350
0360 IF GK=1 AND CE=1 THEN GOTO 0770
0370 IF CE=5 THEN BEGIN ; GOTO 0190
0380 IF CO=4 OR GK=1 THEN GOTO 0420
0390 PRINT 'CS',@(26,0),'BU',"ELIJA UN METODO DE CALCULO",'EU'
0400 PRINT @(26,3),"1-METODO DE CHIO (MATCHI)",@(26,5),"2-METODO L/U (MATDLU)"
0410 INPUT (0,ERR=0410)@(26,7),"QUE METODO USA ? ",CM:(2); IF CM=0 THEN GOTO 0410
0420 LET CE=CE-1
0430 ON CE GOTO 0450,0820,0890,1240
0440 REM "CARGA DE DATOS"
0450 LET GK=1
0460 LET I=INT((80-LEN(STBL("QUIEN"))-23)/2+.5)
0470 PRINT 'CS',@(I,0),"ESTAS EN CARGA DATOS ",STBL("QUIEN")
0480 IF CO=4 THEN GOTO 0560
0490 INPUT (0,ERR=0490)@(0,3),"GRADO ? ",X:(99); IF X<2 co="CO-1" n="X-1;" v="N;" m="N;" m="X;" m="2*X-1" co="CO-1" err="0570)@(0,3),'CL'," err="0580)@(0,4),'CL'," err="0590)@(0,5),'CL'," m="M-1;" m1="M1-1;" n1="N1-1" n="M;" v="M1">2 THEN GOTO 0660
0630 FOR I=0 TO N; FOR J=X TO M; IF I+X<>J THEN GOTO 0650
0640 LET RM[I,J]=1
0650 NEXT J; NEXT I
0660 LET A$="A"; FOR I=0 TO N; FOR J=0 TO V; GOSUB 1550
0670 PRINT 'CS','CH'
0680 PRINT B$; INPUT (0,ERR=0680)@(10),R[I,J]; IF CO=3 THEN GOTO 0700
0690 LET RM[I,J]=R[I,J]
0700 NEXT J; NEXT I
0710 IF CO<>1 AND CO<>3 THEN PRINT 'CS'; GOTO 0320
0720 IF CO=3 THEN GOTO 0730 ELSE GOTO 0750
0730 LET A$="B"; FOR I=0 TO M1; FOR J=0 TO N1; GOSUB 1550; PRINT 'CS','CH'
0740 PRINT B$; INPUT (0,ERR=0740)@(10),S[I,J]; NEXT J; NEXT I; PRINT 'CS'; GOTO 0320
0750 LET A$="C"; FOR I=0 TO N; GOSUB 1560; PRINT 'CS','CH'
0760 PRINT B$; INPUT (0,ERR=0760)@(10),R[I,X]; LET RM[I,X]=R[I,X]; NEXT I; PRI
0760:NT 'CS'; GOTO 0320
0770 PRINT @(0,21),'SF','BR',"NO TE PASES DE LISTO ",STBL("QUIEN"),@(0,22),"YA CARGASTE LOS DATOS ELEGI OTRA OPCION",'SB','ER'
0780 WAIT 2; GOTO 0350
0790 PRINT @(0,21),'SF','BR',"A OTRO PERRO CON ESE HUESO ",STBL("QUIEN"),@(0,22),"PRIMERO VAS A TENER QUE CARGAR LOS DATOS",'SB','ER'
0800 WAIT 2; GOTO 0450
0810 REM "LISTADO DE DATOS CARGADOS POR PANTALLA"
0820 IF GK=0 THEN GOTO 0790
0830 PRINT 'CS',"LISTADO"
0840 LET A$="A"; FOR I=0 TO N; FOR J=0 TO V; GOSUB 1550; PRINT @(0),B$,R[I,J]; NEXT J; GOSUB 1640; NEXT I; IF CO=3 THEN GOTO 0870
0850 IF CO<>1 THEN PRINT 'CS'; GOTO 0320
0860 LET A$="C"; FOR I=0 TO N; GOSUB 1560; PRINT @(0),B$,R[I,X]; NEXT I; GOSUB 1640; PRINT 'CS'; GOTO 0320
0870 LET A$="B"; FOR I=0 TO M1; FOR J=0 TO N1; GOSUB 1550; PRINT @(0),B$,S[I,J]; NEXT J; GOSUB 1640; NEXT I; PRINT 'CS'; GOTO 0320
0880 REM "CORRECCION DE ERRORES"
0890 IF GK=0 THEN GOTO 0790
0900 LET I=INT((57-LEN(STBL("QUIEN")))/2+.5)
0910 PRINT 'CS',@(I,0),"EN QUE TE EQUIVOCASTE ",STBL("QUIEN"); LET OF=0
0920 IF CO<>1 THEN GOTO 0960
0930 PRINT @(34,2),"QUE CAMBIAS",@(0,4),"1-COEFICIENTES MATRICIALES",@(0,5),"2 -TERMINOS INDEPENDIENTES"
0940 INPUT (0,ERR=0940)@(0,7),"?",OF:(2); IF OF=0 THEN GOTO 0940
0950 FOR I=2 TO 7; PRINT @(0,I),'CL'; NEXT I
0960 INPUT (0,ERR=0960)@(0,2),"INGRESE FILA ",I:(99); IF I<1 of="2" err="0980)@(0,3),">3 THEN LET A=1; GOTO 1030
1000 PRINT @(0,5),"1-MATRIZ A",@(0,6),"2-MATRIZ B"
1010 INPUT (0,ERR=1010,SIZ=1)@(0,7),"?",A:(2)
1020 FOR F=5 TO 7; PRINT @(0,F),'CL'; NEXT F
1030 LET I=I-1; LET J=J-1; IF OF=2 THEN GOTO 1090
1040 ON A GOTO 1010,1080,1050
1050 IF J>N1 THEN GOTO 0960
1060 IF I>M1 THEN GOTO 0960
1070 GOTO 1200
1080 IF J>V THEN GOTO 0960
1090 IF I>N THEN GOTO 0960
1100 LET A$="A"; IF OF=2 THEN LET A$="C"
1110 GOSUB 1700
1120 IF OF=2 THEN GOSUB 1560; LET J=X; GOTO 1140
1130 GOSUB 1550
1140 PRINT @(0,2),B$,R[I,J]," ERROR"
1150 INPUT (0,ERR=1150)@(0,3),"CORRECION =? ",R[I,J]
1160 IF CO=3 THEN GOTO 1180
1170 LET RM[I,J]=R[I,J]
1180 INPUT (0,ERR=1180)@(0,4),"Otro error (S/N)? ",A$:("S"=0910,"N"=1190)
1190 PRINT 'CS'; GOTO 0320
1200 LET A$="B$"; GOSUB 1700; PRINT @(0,2),B$,S[I,J]," ERROR"
1210 INPUT (0,ERR=1150)@(0,3),"CORRECION =? ",S[I,J]
1220 GOTO 1180
1230 REM "CALCULO MATRICIAL"
1240 IF GK=0 THEN GOTO 0790
1250 LET Z$="************************"; PRINT 'CS',@(28,13),Z$,@(28,11),Z$; FOR U=11 TO 13; PRINT @(27,U),"*",@(52,U),"*"; NEXT U
1260 PRINT @(29,12),"ESPERE UN MOMENTO ...."
1270 IF CO=3 THEN GOTO 1420
1280 SETERR 1850
1290 ON CM GOTO 1300,1300,1310
1300 LET SP=1; CALL "MATCHI",CO,N,M,X,R[ALL],E,CH; GOTO 1320
1310 LET SP=2; CALL "MATDLU",CO,N,M,X,R[ALL],E,CH
1320 IF CO>0 AND CH=1 THEN GOTO 1400
1330 IF CO>0 THEN GOTO 1350
1340 LET RN=E; GOSUB 1580; GOSUB 1600; PRINT 'CS',@(0,12),'RB','BU',"Determinante =",'BR',RN,'ER','EU'; GOSUB 1570; GOSUB 1610; IF E$="S" THEN GOTO 1340 ELSE GOTO 1660
1350 GOSUB 1490; GOSUB 1580; PRINT 'CS',"LISTADO DE RESULTADOS"; FOR I=0 TO N; FOR K=X TO M; LET J=K-X
1360 IF CO=1 THEN LET A$="X"; GOSUB 1560; GOTO 1380
1370 LET A$="R"; GOSUB 1550
1380 LET RN=R[I,K]; GOSUB 1600; PRINT @(0),B$,RN; NEXT K; GOSUB 1640; NEXT I;
1380:IF AU=1 THEN GOTO 1720
1390 GOSUB 1610; IF E$="S" THEN GOTO 1350 ELSE GOTO 1670
1400 LET B$=""; LET B$="* No puedo hacerlo "+STBL("QUIEN")+" *"; LET AU=LEN(B$); DIM Z1$(AU,"*"); LET AU=INT((79-AU)/2); PRINT @(AU,11),Z1$,@(AU,12),B$,@(AU,13),Z1$; GOSUB 1570; GOTO 1660
1410 REM "CALCULO DEL PRODUCTO MATRICIAL"
1420 LET A$="S"
1430 SETERR 1850
1440 LET SP=0; CALL "MATPRO",M,M1,N1,R[ALL],S[ALL],P[ALL]
1450 PRINT 'CS'; GOSUB 1590; PRINT 'CS','BR',"RESULTADO DEL PRODUCTO",'ER'
1460 FOR I=0 TO M; FOR J=0 TO N1; LET RN=P[I,J]; GOSUB 1600; GOSUB 1550; PRINT @(0),B$,RN; NEXT J; GOSUB 1640; NEXT I
1470 GOSUB 1610; IF E$="N" THEN GOTO 1660 ELSE GOTO 1450
1480 REM "SUBRUTINAS Y PORQUERIAS VARIAS"
1490 PRINT 'CS'; LET RE=9; LET RN=E; GOSUB 1600; IF RN<>0 OR CA=1 THEN GOTO 1540
1500 PRINT @(36,3),'BU','BB',"CUIDADO",'EU','EB'
1510 PRINT @(12,7),"El progama MATRIX opera con metodos algebraicos",@(12,9),'
1510:BU','SF',"Siempre se debe tener en cuenta el error de truncamiento",'EU'
1520 PRINT @(12,13),'BR',"El presente calculo puede dar errores inaceptables",'ER',@(12,15),"El valor real del determinante es : ",E,@(12,17),'BU',"Tengalo presente al considerar los resultados obtenidos ",'EU'
1530 LET CA=1; GOSUB 1570
1540 RETURN
1550 LET B$=A$+"("+STR(I+1)+","+STR(J+1)+")="; RETURN
1560 LET B$=A$+"("+STR(I+1)+")="; RETURN
1570 INPUT (0,ERR=1570,SIZ=1)@(70,0),G$; IF G$<>" " THEN GOTO 1570 ELSE RETURN
1580 PRINT 'CS'
1590 INPUT (0,ERR=1590,SIZ=1)@(0,5),"CON CUANTOS DECIMALES=? ",RE:(9); RETURN
1600 LET R1=SGN(RN); LET RN=ABS(RN); LET RT=10^RE; LET RN=RN*RT+.5; LET RN=INT (RN)/RT*R1; RETURN
1610 PRINT @(35,12),"RESULTADO CON OTROS DECIMALES (S/N)"
1620 INPUT (0,ERR=1620,SIZ=1)@(35,13),"?",E$; IF E$<>"S" AND E$<>"N" THEN GOTO 1620
1630 RETURN
1640 INPUT (0,ERR=1640,SIZ=1)@(0),G$; IF G$<>" " THEN GOTO 1640
1650 RETURN
1660 BEGIN ; GOTO 0190
1670 PRINT @(35,12),"DESEA EL VALOR DEL DETERMINANTE (S/N)"
1680 INPUT (0,ERR=1680,SIZ=1)@(35,13),"?",E$; IF E$<>"S" AND E$<>"N" THEN GOTO 1680
1690 IF E$="S" THEN GOTO 1340 ELSE GOTO 1660
1700 FOR F=2 TO 4; PRINT @(0,F),'CL'; NEXT F; RETURN
1710 REM "RUTINA DE AUTOCOMPROBACION"
1720 DIM Z1$(19,"*"); PRINT 'CS',@(30,11),Z1$,@(30,12),"* AUTOCOMPROBANDO *",@(30,13),Z1$
1730 IF CO=2 THEN GOTO 1750
1740 DIM S[N,0],P[N,0]; FOR K=0 TO N; LET S[K,0]=R[K,M]; NEXT K; LET F=0; GOTO 1760
1750 DIM S[N,N],P[N,N]; FOR K=0 TO N; FOR L=X TO M; LET J=L-X; LET S[K,J]=R[K,L]; NEXT L; NEXT K; LET F=N
1760 LET G=N
1770 SETERR 1850
1780 LET SP=0; CALL "MATPRO",N,G,F,RM[ALL],S[ALL],P[ALL]
1790 PRINT 'CS',@(26),'BU',"LISTADO DE AUTOCOMPROBACION",'EU'; PRINT 'CL'
1800 IF CO=2 THEN GOTO 1820
1810 FOR K=0 TO N; LET A$="X"; LET I=K; GOSUB 1560; LET C$=B$; LET A$="V"; GOSUB 1560; PRINT @(0),C$,P[K,0],@(40),B$,RM[K,M]; GOSUB 1640; NEXT K; GOTO 1830
1820 FOR K=0 TO N; FOR L=X TO M; LET I=K,J=L-X,A$="R"; GOSUB 1550; LET C$=B$;LET A$="V"; GOSUB 1550; PRINT @(0),C$,P[K,J],@(40),B$,RM[K,L]; NEXT L; GOSUB 1640; NEXT K
1830 PRINT 'CS'; GOTO 1670
1840 REM "ERROR FALTA O DEFECTO EN SUB-PROGRAMAS"
1850 PRINT 'CS'
1860 PRINT @(36,1),'BB','BR',"*CUIDADO*",'EB','ER'
1870 IF ERR=12 THEN GOTO 1880 ELSE GOTO 1940
1880 PRINT @(5,6),"No encuentro en la memoria al Sub-Programa : "
1890 ON SP GOTO 1900,1910,1920
1900 LET A$="MATPRO"; GOTO 1930
1910 LET A$="MATCHI"; GOTO 1930
1920 LET A$="MATDLU"
1930 PRINT @(10,8),'BU',A$,'EU',@(5,10),"Por favor ",STBL("QUIEN")," damelo",@(5,11),"si no lo tengo no puedo hacer lo que me pediste"; GOSUB 1570; GOTO 1950
1940 PRINT @(5,6),"Ha ocurrido un error =",ERR,@(5,8),"durante la ejecucion del calculo",@(5,10),"Por favor ",STBL("QUIEN")," verificalo"; GOSUB 1570
1950 GOTO 0290
1960 LET GH$=""; LET CH=LEN(CH$); FOR V=0 TO CH+3; LET GH$=GH$+"*"; NEXT V; LET GF=CH
1970 LET CH=INT((79-CH)/2); LET GH=CH-2; LET GF=GF+CH+1
1980 RETURN

Algebra Maticial

Todo en la vida retorna, incluso temas que uno creía olvidados para siempre les voy a dar un ejemplo de esto.

En un lugar lejano y hace mucho tiempo cuando estaba estudiando en la facultad de ingeniería allá por los antiguos '80 me encontré con un problema simple pero interesante, que fue como solucionar sistemas de ecuaciones lineales de NxN.

Así que para eso y hacerlo de una manera fácil compre mi primera calculadora programable, pero como andaba corto de presupuesto no pude comprar una HP que venia con los módulos de matemáticas solo alcance a comprar una Casio que si bien se podía programar tenias que hacerlo todo uno mismo.

Con mi calculadora programable en mano entre de improviso en el interesante mundo de la programación. Un comentario aparte nunca termine mi carrera de ingeniería (dentro de la rama industrial) pero entre a trabajar en una empresa primero como data entry y despues como programador todo por tener que arreglármelas con una calculadora que no tenia todo resuelto.

Realice, no sin esfuerzo un programa que invertía matrices, solucionaba sistemas de ecuaciones lineales y como bonus te daba el valor del determinante de la matriz.

Cuando entre a trabajar en la empresa como empleado del area de sistemas, lo primero de programación que realice para familiarizarme con el idioma basic que se estaba usando fue precisamente una traducción del programa de la calculadora a una computadora. Logre hacerlo pero la verdad el programa no fue usado en la empresa.

Por lo tanto me olvide rápidamente de el. Hasta que entramos en Internet y pude anotarme en varias páginas de programación (obiamente por otros temas) e intercambiar datos entre otros programadores. No se en que momento del siglo pasado se me ocurrió mencionar que había realizado un programa de este tipo. Durante un par de años tampoco hubo mayor interés por el tema.

Pero luego de unos años se nota que alguien encontró eso que inocentemente escribí y mas precisamente debió ser un estudiante de Sistemas que le encargaron como ejercicio algún programa de álgebra matricial y ahí primero tímidamente y después un poco mas comencé a recibir consultas sobre el tema y pedidos que hiciera el programa en VB6 y les diera el código y cosas así.

Hace unos días atrás entro en mi mensajero un estudiante no de mi país (Argentina) si no de España, bueno imaginen la sorpresa no solo conteste consultas locales sino que ahora internacionales y de otro continente. Así que deicidí que es momento de hacer algo antes que la cosa se salga de control.

Mi intención es ir poniendo notas sobre este tema en el blog. Seguramente no serán muy rigurosas ni matemática, ni muy depuradas en cuanto a la programación pero intentare aportar mi grano de arena a la confusión general de aquí en adelante.
Como en todos los casos hago la siguiente aclaración solo es para un tema de estudio y cada cual tendra que investigar si estos programas realmente le sirven, no se acepataran reclamos de ningun tipo por los errores que pudiera tener el programa en si, o cualquier perjuicio de usar la información que pongo en el blog sin pensarla modificarla y adaptarla o lo que sea previamente por los interesados. Aunque si acepto gustoso colaboraciones espontaneas o correcciones si las consideran necesarias. Si las grandes empresas de Soft a veces no se hacen responsables de lo que hacen sus programas menos me voy hacer yo responsable por cosas parecidas.