Changeset 8033a6d in tol
- Timestamp:
- May 3, 2010, 6:43:55 AM (16 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- d5cd750
- Parents:
- cbeb848
- File:
-
- 1 edited
-
tol/btol/bmodel/modcalc.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tol/btol/bmodel/modcalc.cpp
rcbeb848 r8033a6d 1428 1428 CI = MinimumResidualsSolve(PIW_,-A_, CI); 1429 1429 BBool CI_isKnown = FrobeniusNormU(CI.Data()).IsKnown(); 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); 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())")); 1448 1435 BText method = BText("Golub_Reinsch_Mod"); 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()))) 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 err = PIW_.T()*(PIW_*CI+A_); 1442 test = err.MaxAbsNorm(); 1443 } 1444 CI_isKnown = FrobeniusNormU(CI.Data()).IsKnown(); 1445 if(!CI_isKnown ||(test>Sqrt(BDat::Tolerance()))) 1457 1446 { 1458 1447 Warning(I2("Cannot calculate values for interruptions due " … … 1463 1452 "problema de programación lineal correspondiente " 1464 1453 "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 1454 "\n Max(|PIW'(PIW*CI+A_)|)="+test); 1455 } 1456 if(CI_isKnown) 1469 1457 { 1470 1458 for(j=0; j<I; j++) { interruptionValue_[interruptionIndex_[j]] = CI(j,0); }
Note: See TracChangeset
for help on using the changeset viewer.
