Changeset 8033a6d in tol


Ignore:
Timestamp:
May 3, 2010, 6:43:55 AM (16 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
d5cd750
Parents:
cbeb848
Message:

refs #899

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@2127 be4846ae-f051-483a-831f-b64e7d08527f

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tol/btol/bmodel/modcalc.cpp

    rcbeb848 r8033a6d  
    14281428    CI = MinimumResidualsSolve(PIW_,-A_, CI);
    14291429    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())"));
    14481435      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())))
    14571446    {
    14581447      Warning(I2("Cannot calculate values for interruptions due "
    … …  
    14631452               "problema de programación lineal correspondiente "
    14641453               "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)
    14691457    {
    14701458      for(j=0; j<I; j++) { interruptionValue_[interruptionIndex_[j]] = CI(j,0); }
Note: See TracChangeset for help on using the changeset viewer.