Changeset e8916d6 in tol


Ignore:
Timestamp:
Nov 7, 2009, 4:24:13 PM (17 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
4006126
Parents:
f7b99ac
Message:

Enhanced messages and error control in CleanInterruptions

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

File:
1 edited

Legend:

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

    rf7b99ac re8916d6  
    14281428    CI = MinimumResidualsSolve(PIW_,-A_, CI);
    14291429    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);
    14351448      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
    14441469    {
    14451470      for(j=0; j<I; j++) { interruptionValue_[interruptionIndex_[j]] = CI(j,0); }
    … …  
    14601485        }
    14611486      }
    1462     }
    1463     else
    1464     {
    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();
    14711487    }
    14721488  }
Note: See TracChangeset for help on using the changeset viewer.