Changeset e9124e in git for Singular/LIB/linalg.lib
- Timestamp:
- Mar 6, 2002, 5:39:09 PM (22 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 101cd892be49d477f3f2ab71d77dbfe943baa01b
- Parents:
- fee17e544a54ec29e804c68a244e859ae9a1bfd3
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/linalg.lib
rfee17e re9124e 1 1 //GMG last modified: 04/25/2000 2 2 ////////////////////////////////////////////////////////////////////////////// 3 version="$Id: linalg.lib,v 1.2 5 2002-02-16 18:26:08mschulze Exp $";3 version="$Id: linalg.lib,v 1.26 2002-03-06 16:38:54 mschulze Exp $"; 4 4 category="Linear Algebra"; 5 5 info=" … … 25 25 U_D_O(A); P*A=U*D*O, P,D,U,O=permutaion,diag,lower-,upper-triang 26 26 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]) 27 29 eigenvals(M); eigenvalues and multiplicities of M 28 30 jordan(M); Jordan data of M … … 1235 1237 /////////////////////////////////////////////////////////////////////////////// 1236 1238 1239 static 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 1262 static 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 1281 static 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 1300 proc hessenberg(matrix M) 1301 "USAGE: hessenberg(M); matrix M 1302 ASSUME: M constant square matrix 1303 RETURN: matrix H; Hessenberg form of M 1304 EXAMPLE: 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 } 1332 example 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 1341 proc evnf(ideal e,list #) 1342 "USAGE: evnf(e[,m]); ideal e, intvec m 1343 ASSUME: ncols(e)==size(m) 1344 RETURN: order eigenvalues e with multiplicities m 1345 EXAMPLE: 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 } 1409 example 1410 { "EXAMPLE:"; echo=2; 1411 } 1412 /////////////////////////////////////////////////////////////////////////////// 1413 1237 1414 proc eigenvals(matrix M) 1238 1415 "USAGE: eigenvals(M); matrix M … … 1249 1426 " 1250 1427 { 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)); 1252 1482 } 1253 1483 example … … 1517 1747 print(jordannf(M)); 1518 1748 } 1749 1519 1750 /////////////////////////////////////////////////////////////////////////////// 1520 1751
Note: See TracChangeset
for help on using the changeset viewer.