[BACK]Return to ts_cmpmat.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Matrices

Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Matrices/ts_cmpmat.adb, Revision 1.1.1.1

1.1       maekawa     1: with text_io,integer_io;                 use text_io,integer_io;
                      2: with Standard_Natural_Vectors;
                      3: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
                      4: with Standard_Floating_Numbers_io;       use Standard_Floating_Numbers_io;
                      5: with Standard_Complex_Numbers;
                      6: with Standard_Complex_Vectors;
                      7: with Standard_Complex_Vectors_io;
                      8: with Standard_Complex_Matrices;
                      9: with Standard_Complex_Matrices_io;
                     10: with Standard_Complex_VecMats;
                     11: with Standard_Complex_VecMats_io;
                     12: with Standard_Complex_Linear_Solvers;    use Standard_Complex_Linear_Solvers;
                     13: with Standard_Complex_Norms_Equals;      use Standard_Complex_Norms_Equals;
                     14: with Standard_Random_Vectors;            use Standard_Random_Vectors;
                     15: with Multprec_Random_Vectors;            use Multprec_Random_Vectors;
                     16: with Multprec_Floating_Numbers;          use Multprec_Floating_Numbers;
                     17: with Multprec_Floating_Numbers_io;       use Multprec_Floating_Numbers_io;
                     18: with Multprec_Complex_Numbers;
                     19: with Multprec_Complex_Vectors;
                     20: with Multprec_Complex_Vectors_io;
                     21: with Multprec_Complex_Matrices;
                     22: with Multprec_Complex_Matrices_io;
                     23: with Multprec_Complex_Linear_Solvers;    use Multprec_Complex_Linear_Solvers;
                     24: with Multprec_Complex_Norms_Equals;      use Multprec_Complex_Norms_Equals;
                     25:
                     26: procedure ts_cmpmat is
                     27:
                     28: -- DESCRIPTION :
                     29: --   Tests the matrix packages of standard and multi-precision complex numbers.
                     30:
                     31:   procedure Test_Standard_io is
                     32:
                     33:     use Standard_Complex_Matrices,Standard_Complex_Matrices_io;
                     34:
                     35:     n,m : natural;
                     36:
                     37:   begin
                     38:     put("Give the number of rows : "); get(n);
                     39:     put("Give the number of columns : "); get(m);
                     40:     declare
                     41:       mat : Matrix(1..n,1..m);
                     42:     begin
                     43:       put("Give "); put(n,1); put("x"); put(m,1);
                     44:       put_line(" complex matrix : "); get(mat);
                     45:       put_line("Your matrix : "); put(mat); new_line;
                     46:     end;
                     47:   end Test_Standard_io;
                     48:
                     49:   procedure Test_Standard_VecMat_io is
                     50:
                     51:     use Standard_Complex_Matrices,Standard_Complex_Matrices_io;
                     52:     use Standard_Complex_VecMats,Standard_Complex_VecMats_io;
                     53:
                     54:     n,n1,n2 : natural;
                     55:     lv : Link_to_VecMat;
                     56:
                     57:   begin
                     58:     put("Give the number of matrices : "); get(n);
                     59:     put("Give #rows : "); get(n1);
                     60:     put("Give #columns : "); get(n2);
                     61:     put("Give "); put(n,1); put(" "); put(n1,1); put("-by-"); put(n2,1);
                     62:     put_line(" integer matrices : ");
                     63:     get(n,n1,n2,lv);
                     64:     put_line("The vector of matrices :"); put(lv);
                     65:   end Test_Standard_VecMat_io;
                     66:
                     67:   procedure Test_Multprec_io is
                     68:
                     69:     use Multprec_Complex_Matrices,Multprec_Complex_Matrices_io;
                     70:
                     71:     n,m : natural;
                     72:
                     73:   begin
                     74:     put("Give the number of rows : "); get(n);
                     75:     put("Give the number of columns : "); get(m);
                     76:     declare
                     77:       mat : Matrix(1..n,1..m);
                     78:     begin
                     79:       put("Give "); put(n,1); put("x"); put(m,1);
                     80:       put_line(" complex matrix : "); get(mat);
                     81:       put_line("Your matrix : "); put(mat); new_line;
                     82:     end;
                     83:   end Test_Multprec_io;
                     84:
                     85:   function Vdm_Matrix ( v : Standard_Complex_Vectors.Vector )
                     86:                       return Standard_Complex_Matrices.Matrix is
                     87:
                     88:     use Standard_Complex_Numbers;
                     89:     use Standard_Complex_Matrices;
                     90:
                     91:     n : constant natural := v'length;
                     92:     res : Matrix(1..n,1..n);
                     93:
                     94:   begin
                     95:     for i in res'range(1) loop
                     96:       for j in res'range(2) loop
                     97:         res(i,j) := v(i)**(j-1);
                     98:       end loop;
                     99:     end loop;
                    100:     return res;
                    101:   end Vdm_Matrix;
                    102:
                    103:   procedure lufac_Solve ( n : in natural;
                    104:                           mat : in Standard_Complex_Matrices.Matrix;
                    105:                           rhs : in Standard_Complex_Vectors.Vector ) is
                    106:
                    107:     use Standard_Complex_Vectors;
                    108:     use Standard_Complex_Vectors_io;
                    109:     use Standard_Complex_Matrices;
                    110:     use Standard_Complex_Matrices_io;
                    111:
                    112:     wrk : Matrix(mat'range(1),mat'range(2));
                    113:     piv : Standard_Natural_Vectors.Vector(mat'range(2));
                    114:     info : natural;
                    115:     res,sol,acc : Vector(rhs'range);
                    116:     nrm : double_float;
                    117:
                    118:   begin
                    119:     put_line("Solving the linear system with lufac.");
                    120:     wrk := mat;
                    121:     lufac(wrk,n,piv,info);
                    122:     put("info : "); put(info,1); new_line;
                    123:     sol := rhs;
                    124:     lusolve(wrk,n,piv,sol);
                    125:     put_line("The solution vector :"); put(sol); new_line;
                    126:     acc := mat*sol;
                    127:     res := rhs - acc;
                    128:     put_line("The residual : "); put(res); new_line;
                    129:     nrm := Max_Norm(res);
                    130:     put("Max norm of residual : "); put(nrm); new_line;
                    131:     nrm := Sum_Norm(res);
                    132:     put("Sum norm of residual : "); put(nrm); new_line;
                    133:   end lufac_Solve;
                    134:
                    135:   procedure lufco_Solve ( n : in natural;
                    136:                           mat : in Standard_Complex_Matrices.Matrix;
                    137:                           rhs : in Standard_Complex_Vectors.Vector ) is
                    138:
                    139:     use Standard_Complex_Vectors;
                    140:     use Standard_Complex_Vectors_io;
                    141:     use Standard_Complex_Matrices;
                    142:     use Standard_Complex_Matrices_io;
                    143:
                    144:     wrk : Matrix(mat'range(1),mat'range(2)) := mat;
                    145:     piv : Standard_Natural_Vectors.Vector(mat'range(2));
                    146:     rcond,nrm : double_float;
                    147:     res,sol : Vector(rhs'range);
                    148:
                    149:   begin
                    150:     put_line("Solving the linear system with lufco.");
                    151:     lufco(wrk,n,piv,rcond);
                    152:     put("inverse condition : "); put(rcond); new_line;
                    153:     sol := rhs;
                    154:     lusolve(wrk,n,piv,sol);
                    155:     put_line("The solution vector :"); put(sol); new_line;
                    156:     res := rhs - mat*sol;
                    157:     put_line("The residual : "); put(res); new_line;
                    158:     nrm := Max_Norm(res);
                    159:     put("Max norm of residual : "); put(nrm); new_line;
                    160:     nrm := Sum_Norm(res);
                    161:     put("Sum norm of residual : "); put(nrm); new_line;
                    162:   end lufco_Solve;
                    163:
                    164:   procedure Random_Test_Standard_Linear_Solvers is
                    165:
                    166:     use Standard_Complex_Vectors;
                    167:     use Standard_Complex_Vectors_io;
                    168:     use Standard_Complex_Matrices;
                    169:     use Standard_Complex_Matrices_io;
                    170:
                    171:     n,nb : natural;
                    172:
                    173:   begin
                    174:     new_line;
                    175:     put_line("Testing of solving random standard linear systems.");
                    176:     new_line;
                    177:     put("Give the dimension : "); get(n);
                    178:     put("Give the number of tests : "); get(nb);
                    179:     for i in 1..nb loop
                    180:       declare
                    181:         mat : Matrix(1..n,1..n);
                    182:         rhs : Vector(1..n);
                    183:       begin
                    184:         mat := Vdm_Matrix(Random_Vector(1,n));
                    185:         rhs := Random_Vector(1,n);
                    186:         lufac_Solve(n,mat,rhs);
                    187:         lufco_Solve(n,mat,rhs);
                    188:       end;
                    189:     end loop;
                    190:   end Random_Test_Standard_Linear_Solvers;
                    191:
                    192:   function Vdm_Matrix ( v : Multprec_Complex_Vectors.Vector )
                    193:                       return Multprec_Complex_Matrices.Matrix is
                    194:
                    195:     use Multprec_Complex_Numbers;
                    196:     use Multprec_Complex_Matrices;
                    197:
                    198:     n : constant natural := v'length;
                    199:     res : Matrix(1..n,1..n);
                    200:
                    201:   begin
                    202:     for i in res'range(1) loop
                    203:       for j in res'range(2) loop
                    204:         res(i,j) := v(i)**(j-1);
                    205:       end loop;
                    206:     end loop;
                    207:     return res;
                    208:   end Vdm_Matrix;
                    209:
                    210:   procedure lufac_Solve ( n : in natural;
                    211:                           mat : in Multprec_Complex_Matrices.Matrix;
                    212:                           rhs : in Multprec_Complex_Vectors.Vector ) is
                    213:
                    214:     use Multprec_Complex_Vectors;
                    215:     use Multprec_Complex_Vectors_io;
                    216:     use Multprec_Complex_Matrices;
                    217:     use Multprec_Complex_Matrices_io;
                    218:
                    219:     wrk : Matrix(mat'range(1),mat'range(2)) := +mat;
                    220:     piv : Standard_Natural_Vectors.Vector(mat'range(2));
                    221:     info : natural;
                    222:     res,sol,acc : Vector(rhs'range);
                    223:     nrm : Floating_Number;
                    224:
                    225:   begin
                    226:     put_line("Solving the linear system with lufac.");
                    227:     lufac(wrk,n,piv,info);
                    228:     put("info : "); put(info,1); new_line;
                    229:     sol := +rhs;
                    230:     lusolve(wrk,n,piv,sol);
                    231:     put_line("The solution vector :"); put(sol); new_line;
                    232:     acc := mat*sol;
                    233:     res := rhs - acc;
                    234:     put_line("The residual : "); put(res); new_line;
                    235:     nrm := Max_Norm(res);
                    236:     put("Max norm of residual : "); put(nrm); new_line;
                    237:     Clear(nrm);
                    238:     nrm := Sum_Norm(res);
                    239:     put("Sum norm of residual : "); put(nrm); new_line;
                    240:     Clear(nrm);
                    241:     Clear(wrk); Clear(acc); Clear(res); Clear(sol);
                    242:   end lufac_Solve;
                    243:
                    244:   procedure lufco_Solve ( n : in natural;
                    245:                           mat : in Multprec_Complex_Matrices.Matrix;
                    246:                           rhs : in Multprec_Complex_Vectors.Vector ) is
                    247:
                    248:     use Multprec_Complex_Vectors;
                    249:     use Multprec_Complex_Vectors_io;
                    250:     use Multprec_Complex_Matrices;
                    251:     use Multprec_Complex_Matrices_io;
                    252:
                    253:     wrk : Matrix(mat'range(1),mat'range(2)) := +mat;
                    254:     piv : Standard_Natural_Vectors.Vector(mat'range(2));
                    255:     rcond,nrm : Floating_Number;
                    256:     res,sol,acc : Vector(rhs'range);
                    257:
                    258:   begin
                    259:     put_line("Solving the linear system with lufco.");
                    260:     lufco(wrk,n,piv,rcond);
                    261:     put("inverse condition : "); put(rcond); new_line;
                    262:     sol := +rhs;
                    263:     lusolve(wrk,n,piv,sol);
                    264:     put_line("The solution vector :"); put(sol); new_line;
                    265:     acc := mat*sol;
                    266:     res := rhs - acc;
                    267:     put_line("The residual : "); put(res); new_line;
                    268:     nrm := Max_Norm(res);
                    269:     put("Max norm of residual : "); put(nrm); new_line;
                    270:     Clear(nrm);
                    271:     nrm := Sum_Norm(res);
                    272:     put("Sum norm of residual : "); put(nrm); new_line;
                    273:     Clear(wrk); Clear(acc); Clear(res); Clear(sol);
                    274:     Clear(nrm); Clear(rcond);
                    275:   end lufco_Solve;
                    276:
                    277:   procedure Random_Test_Multprec_Linear_Solvers is
                    278:
                    279:     use Multprec_Complex_Vectors;
                    280:     use Multprec_Complex_Vectors_io;
                    281:     use Multprec_Complex_Matrices;
                    282:     use Multprec_Complex_Matrices_io;
                    283:
                    284:     n,sz,nb : natural;
                    285:
                    286:   begin
                    287:     new_line;
                    288:     put_line("Testing of solving random multi-precision linear systems.");
                    289:     new_line;
                    290:     put("Give the dimension : "); get(n);
                    291:     put("Give the size of the numbers : "); get(sz);
                    292:     put("Give the number of tests : "); get(nb);
                    293:     for i in 1..nb loop
                    294:       declare
                    295:         rnd : Vector(1..n) := Random_Vector(1,n,sz);
                    296:         mat : Matrix(1..n,1..n) := Vdm_Matrix(rnd);
                    297:         rhs : Vector(1..n) := Random_Vector(1,n,sz);
                    298:       begin
                    299:         lufac_Solve(n,mat,rhs);
                    300:        -- lufco_Solve(n,mat,rhs);
                    301:         Clear(rnd); Clear(mat); Clear(rhs);
                    302:       end;
                    303:     end loop;
                    304:   end Random_Test_Multprec_Linear_Solvers;
                    305:
                    306:   procedure Main is
                    307:
                    308:     ans : character;
                    309:
                    310:   begin
                    311:     new_line;
                    312:     put_line("Interactive testing of matrices of complex numbers");
                    313:     loop
                    314:       new_line;
                    315:       put_line("Choose one of the following :                               ");
                    316:       put_line("  0. exit this program.                                     ");
                    317:       put_line("  1. io of matrices of standard complex numbers.            ");
                    318:       put_line("  2. io of vectors of matrices of standard complex numbers. ");
                    319:       put_line("  3. test on solving random standard linear systems.        ");
                    320:       put_line("  4. io of matrices of multi-precision complex numbers.     ");
                    321:       put_line("  5. test on solving random multi-precision complex numbers.");
                    322:       put("Make your choice (0,1,2,3,4 or 5) : "); get(ans);
                    323:       exit when (ans = '0');
                    324:       case ans is
                    325:         when '1' => Test_Standard_io;
                    326:         when '2' => Test_Standard_VecMat_io;
                    327:         when '3' => Random_Test_Standard_Linear_Solvers;
                    328:         when '4' => Test_Multprec_io;
                    329:         when '5' => Random_Test_Multprec_Linear_Solvers;
                    330:         when others => null;
                    331:       end case;
                    332:     end loop;
                    333:   end Main;
                    334:
                    335: begin
                    336:   Main;
                    337: end ts_cmpmat;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>