Changeset e8916d6 in tol
- Timestamp:
- Nov 7, 2009, 4:24:13 PM (17 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- 4006126
- Parents:
- f7b99ac
- File:
-
- 1 edited
-
tol/btol/bmodel/modcalc.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tol/btol/bmodel/modcalc.cpp
rf7b99ac re8916d6 1428 1428 CI = MinimumResidualsSolve(PIW_,-A_, CI); 1429 1429 BBool CI_isKnown = FrobeniusNormU(CI.Data()).IsKnown(); 1430 BMat err = PIW_.T()*(PIW_*CI+A_); 1431 BDat test = err.MaxAbsNorm(); 1432 if(!CI_isKnown ||(test>Sqrt(BDat::Tolerance()))) 1433 { 1434 //Std(BText("\nBModel::CleanInterruptions test>Sqrt(BDat::Tolerance())")); 1430 BMat CI_res = PIW_.T()*(PIW_*CI+A_); 1431 BDat CI_maxAbsErr = CI_res.MaxAbsNorm(); 1432 BMat CI_U(N,I), CI_V(I,I); 1433 BDiagMatrix<BDat> CI_D(I,1.0), CI_Dp; 1434 if(!CI_isKnown ||(CI_maxAbsErr>Sqrt(BDat::Tolerance()))) 1435 { 1436 Warning(I2("Cannot calculate values for interruptions due " 1437 "to a numerical error solving related linear programming " 1438 "problem by means of minimum residuals method.\n" 1439 "Singular value decomposition method will be tried." 1440 "This is a more robust but much slower method.", 1441 "No se pudieron calcular los valores de las interrupciones " 1442 "debido a un error de tipo numérico resolviendo el " 1443 "problema de programación lineal correspondiente " 1444 "mediante el método de mínimos residuos.\n" 1445 "Se intentará resolver mediante descomposición de valor " 1446 "singular que es más robusto pero mucho más lento.")+ 1447 "\n Max(|PIW'(PIW*CI+A_)|)="<<CI_maxAbsErr); 1435 1448 BText method = BText("Golub_Reinsch_Mod"); 1436 BMat U(N,I), V(I,I); 1437 BDiagMatrix<BDat> D(I,1.0), Dp; 1438 gsl_SingularValueDecomposition(PIW_,U,D,V, method); 1439 Dp=D.P(Sqrt(DEpsilon())); 1440 CI=V*Dp*(A_.T()*U).T(); 1441 } 1442 CI_isKnown = FrobeniusNormU(CI.Data()).IsKnown(); 1443 if(CI_isKnown) 1449 gsl_SingularValueDecomposition(PIW_,CI_U,CI_D,CI_V, method); 1450 CI_Dp=CI_D.P(Sqrt(DEpsilon())); 1451 CI=CI_V*CI_Dp*(A_.T()*CI_U).T(); 1452 CI_isKnown = FrobeniusNormU(CI.Data()).IsKnown(); 1453 CI_res = PIW_.T()*(PIW_*CI+A_); 1454 CI_maxAbsErr = CI_res.MaxAbsNorm(); 1455 } 1456 if(!CI_isKnown ||(CI_maxAbsErr>Sqrt(BDat::Tolerance()))) 1457 { 1458 Error(I2("Cannot calculate values for interruptions due " 1459 "to a numerical error solving related linear programming " 1460 "problem by means of singular value decomposition method.", 1461 "No se pudieron calcular los valores de las interrupciones " 1462 "debido a un error de tipo numérico resolviendo el " 1463 "problema de programación lineal correspondiente " 1464 "mediante el método de descomposición de valor singular.")+ 1465 "\n Max(|PIW'(PIW*CI+A_)|)="<<CI_maxAbsErr); 1466 A_ = A*BDat::PosInf(); 1467 } 1468 else 1444 1469 { 1445 1470 for(j=0; j<I; j++) { interruptionValue_[interruptionIndex_[j]] = CI(j,0); } … … 1460 1485 } 1461 1486 } 1462 }1463 else1464 {1465 Warning(I2("Cannot calculate values for interruptions, probably due "1466 "to a numerical problem in SVD of partial PI-weights matrix.",1467 "No se pudieron calcular los valores de las interrupciones "1468 "debido probablemente a un error de tipo numérico en la "1469 "SVD de la matriz parcial de los PI-weights."));1470 A_ = A*BDat::PosInf();1471 1487 } 1472 1488 }
Note: See TracChangeset
for help on using the changeset viewer.
