Changeset e9124e in git for Singular/LIB/linalg.lib


Ignore:
Timestamp:
Mar 6, 2002, 5:39:09 PM (22 years ago)
Author:
Mathias Schulze <mschulze@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
101cd892be49d477f3f2ab71d77dbfe943baa01b
Parents:
fee17e544a54ec29e804c68a244e859ae9a1bfd3
Message:
*mschulze: check system-with for eigenval, gms


git-svn-id: file:///usr/local/Singular/svn/trunk@5952 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/LIB/linalg.lib

    rfee17e re9124e  
    11//GMG last modified: 04/25/2000
    22//////////////////////////////////////////////////////////////////////////////
    3 version="$Id: linalg.lib,v 1.25 2002-02-16 18:26:08 mschulze Exp $";
     3version="$Id: linalg.lib,v 1.26 2002-03-06 16:38:54 mschulze Exp $";
    44category="Linear Algebra";
    55info="
     
    2525 U_D_O(A);            P*A=U*D*O, P,D,U,O=permutaion,diag,lower-,upper-triang
    2626 pos_def(A,i);        test symmetric matrix for positive definiteness
     27 hessenberg(M);       Hessenberg form of M
     28 evnf(e[,m]);         eigenvalues normal form of (e[,m])
    2729 eigenvals(M);        eigenvalues and multiplicities of M
    2830 jordan(M);           Jordan data of M
     
    12351237///////////////////////////////////////////////////////////////////////////////
    12361238
     1239static proc rowcolswap(matrix M,int i,int j)
     1240{
     1241  if(i==j)
     1242  {
     1243    return(M);
     1244  }
     1245  poly p;
     1246  for(int k=1;k<=nrows(M);k++)
     1247  {
     1248    p=M[i,k];
     1249    M[i,k]=M[j,k];
     1250    M[j,k]=p;
     1251  }
     1252  for(k=1;k<=ncols(M);k++)
     1253  {
     1254    p=M[k,i];
     1255    M[k,i]=M[k,j];
     1256    M[k,j]=p;
     1257  }
     1258  return(M);
     1259}
     1260//////////////////////////////////////////////////////////////////////////////
     1261
     1262static proc rowelim(matrix M,int i,int j,int k)
     1263{
     1264  if(jet(M[i,k],0)==0||jet(M[j,k],0)==0)
     1265  {
     1266    return(M);
     1267  }
     1268  number n=number(jet(M[i,k],0))/number(jet(M[j,k],0));
     1269  for(int l=1;l<=ncols(M);l++)
     1270  {
     1271    M[i,l]=M[i,l]-n*M[j,l];
     1272  }
     1273  for(l=1;l<=nrows(M);l++)
     1274  {
     1275    M[l,j]=M[l,j]+n*M[l,i];
     1276  }
     1277  return(M);
     1278}
     1279///////////////////////////////////////////////////////////////////////////////
     1280
     1281static proc colelim(matrix M,int i,int j,int k)
     1282{
     1283  if(jet(M[k,i],0)==0||jet(M[k,j],0)==0)
     1284  {
     1285    return(M);
     1286  }
     1287  number n=number(jet(M[k,i],0))/number(jet(M[k,j],0));
     1288  for(int l=1;l<=nrows(M);l++)
     1289  {
     1290    M[l,i]=M[l,i]-n*M[l,j];
     1291  }
     1292  for(l=1;l<=ncols(M);l++)
     1293  {
     1294    M[j,l]=M[j,l]+n*M[i,l];
     1295  }
     1296  return(M);
     1297}
     1298///////////////////////////////////////////////////////////////////////////////
     1299
     1300proc hessenberg(matrix M)
     1301"USAGE:   hessenberg(M); matrix M
     1302ASSUME:  M constant square matrix
     1303RETURN:  matrix H;  Hessenberg form of M
     1304EXAMPLE: example hessenberg; shows examples
     1305"
     1306{
     1307  if(system("with","eigenval"))
     1308  {
     1309   return(system("hessenberg",M));
     1310  }
     1311
     1312  int n=ncols(M);
     1313  int i,j;
     1314  for(int k=1;k<n-1;k++)
     1315  {
     1316    j=k+1;
     1317    while(j<n&&jet(M[j,k],0)==0)
     1318    {
     1319      j++;
     1320    }
     1321    if(jet(M[j,k],0)!=0)
     1322    {
     1323      M=rowcolswap(M,j,k+1);
     1324      for(i=j+1;i<=n;i++)
     1325      {
     1326        M=rowelim(M,i,k+1,k);
     1327      }
     1328    }
     1329  }
     1330  return(M);
     1331}
     1332example
     1333{ "EXAMPLE:"; echo=2;
     1334  ring R=0,x,dp;
     1335  matrix M[3][3]=3,2,1,0,2,1,0,0,3;
     1336  print(M);
     1337  print(hessenberg(M));
     1338}
     1339///////////////////////////////////////////////////////////////////////////////
     1340
     1341proc evnf(ideal e,list #)
     1342"USAGE:   evnf(e[,m]); ideal e, intvec m
     1343ASSUME:  ncols(e)==size(m)
     1344RETURN:  order eigenvalues e with multiplicities m
     1345EXAMPLE: example evnf; shows examples
     1346"
     1347{
     1348  int n=ncols(e);
     1349  intvec m;
     1350  int i,j;
     1351  while(i<size(#))
     1352  {
     1353    i++;
     1354    if(typeof(#[i])=="intvec")
     1355    {
     1356      m=#[i];
     1357    }
     1358  }
     1359  if(m==0)
     1360  {
     1361    for(i=n;i>=1;i--)
     1362    {
     1363      m[i]=1;
     1364    }
     1365  }
     1366
     1367  int k;
     1368  ideal e0;
     1369  intvec m0;
     1370  number e1;
     1371  int m1;
     1372  for(i=n;i>=1;i--)
     1373  {
     1374    if(m[i]!=0)
     1375    {
     1376      for(j=i-1;j>=1;j--)
     1377      {
     1378        if(m[j]!=0)
     1379        {
     1380          if(number(e[i])>number(e[j]))
     1381          {
     1382            e1=number(e[i]);
     1383            e[i]=e[j];
     1384            e[j]=e1;
     1385            m1=m[i];
     1386            m[i]=m[j];
     1387            m[j]=m1;
     1388          }
     1389          if(number(e[i])==number(e[j]))
     1390          {
     1391            m[i]=m[i]+m[j];
     1392            m[j]=0;
     1393          }
     1394        }
     1395      }
     1396      k++;
     1397      e0[k]=e[i];
     1398      m0[k]=m[i];
     1399    }
     1400  }
     1401
     1402  list l;
     1403  if(k>0)
     1404  {
     1405    l=e0,m0;
     1406  }
     1407  return(l);
     1408}
     1409example
     1410{ "EXAMPLE:"; echo=2;
     1411}
     1412///////////////////////////////////////////////////////////////////////////////
     1413
    12371414proc eigenvals(matrix M)
    12381415"USAGE:   eigenvals(M); matrix M
     
    12491426"
    12501427{
    1251   return(system("eigenvals",M));
     1428  if(system("with","eigenval"))
     1429  {
     1430   return(system("eigenvals",M));
     1431  }
     1432
     1433  M=jet(hessenberg(M),0);
     1434  int n=ncols(M);
     1435  int k;
     1436  ideal e;
     1437  intvec m;
     1438  number e0;
     1439  intvec v;
     1440  list l;
     1441  int i,j;
     1442  j=1;
     1443  while(j<=n)
     1444  {
     1445    v=j;
     1446    j++;
     1447    if(j<=n)
     1448    {
     1449      while(j<n&&M[j,j-1]!=0)
     1450      {
     1451        v=v,j;
     1452        j++;
     1453      }
     1454      if(M[j,j-1]!=0)
     1455      {
     1456        v=v,j;
     1457        j++;
     1458      }
     1459    }
     1460    if(size(v)==1)
     1461    {
     1462      k++;
     1463      e[k]=M[v,v];
     1464      m[k]=1;
     1465    }
     1466    else
     1467    {
     1468      l=factorize(det(submat(M,v,v)-var(1)));
     1469      for(i=size(l[1]);i>=1;i--)
     1470      {
     1471        e0=number(jet(l[1][i]/var(1),0));
     1472        if(e0!=0)
     1473        {
     1474          k++;
     1475          e[k]=(e0*var(1)-l[1][i])/e0;
     1476          m[k]=l[2][i];
     1477        }
     1478      }
     1479    }
     1480  }
     1481  return(evnf(e,m));
    12521482}
    12531483example
     
    15171747  print(jordannf(M));
    15181748}
     1749
    15191750///////////////////////////////////////////////////////////////////////////////
    15201751
Note: See TracChangeset for help on using the changeset viewer.