close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 12 years ago

Last modified 12 years ago

#1716 closed defect

Polinomio característico de un VAR — at Initial Version

Reported by: Víctor de Buen Remiro Owned by: Jorge
Priority: high Milestone: TOL Packages
Component: Math Version: 3.1
Severity: normal Keywords: VarModel
Cc: Víctor de Buen Remiro

Description

Se solicita incoporar a VarModel el cálculo del polinomio característico de un modelo VAR y el cálculo de sus raíces. Esto es necesario para diagnosticar la estabilidad del modelo VAR. Se aporta el código que lo implementa:

Matrix param = varEst::_.B;
Real n = Rows(param);
Set PHI = 
{
  Set aux = For(1,pmax,Set(Real k)
  {
    Matrix phi = Sub(param,1,(k-1)*n+1,n,n);
    For(1,n,Set(Real i)
    {
      For(1,n,Polyn(Real j)
      {
        MatDat(phi,i,j)*B^k
      })
    })
  });
  For(1,n,Set(Real i)
  {
    For(1,n,Polyn(Real j)
    {
      If(i==j,1,0)-
      SetSum(For(1,pmax,Polyn(Real k)
      {
        aux[k][i][j]
      })) 
    })
  })
};

Polyn PolynMatrixDeterminant(Set polMat)
{
  Real m = Card(polMat);
  WriteLn("TRACE [PolynMatrixDeterminant] polMat=\n"<<polMat);
  WriteLn("TRACE [PolynMatrixDeterminant] m="<<m);
  Case(
    m==1, polMat[1][1],
    m==2, polMat[1][1]*polMat[2][2]-polMat[1][2]*polMat[2][1], /*
    m==-3, 
    {
      +polMat[1][1]*polMat[2][2]*polMat[3][3]
      +polMat[1][2]*polMat[2][3]*polMat[3][1]
      +polMat[1][3]*polMat[2][1]*polMat[3][2]
      -polMat[1][1]*polMat[2][3]*polMat[3][2]
      -polMat[1][2]*polMat[2][1]*polMat[3][3]
      -polMat[1][3]*polMat[2][2]*polMat[3][1]
    }, */
    1==1,
    {
      SetSum(For(1,m,Polyn(Real k)
      {
        Polyn c = polMat[k][1]*(-1)^(k+1);
        Set rows = ExtractByIndex(polMat,Range(1,m,1)-[[k]]);
        Set adjunt = EvalSet(rows,Set(Set row)
        {
          For(2,m,Polyn(Real j) { row[j] })
        });
        c*PolynMatrixDeterminant(adjunt)
      }))
    }
  )
};
  

Polyn PHI.det = PolynMatrixDeterminant(PHI);

Set PHI.det.roots = 
{
  Matrix ar.roots = gsl_poly_complex_solve(PHI.det);
  For(1,Rows(ar.roots),Set(Real k)
  {
    Set aux = [[
      Real real = MatDat(ar.roots,k,1);
      Real imaginary = MatDat(ar.roots,k,2);
      Real module = Sqrt(real^2+imaginary^2)
    ]];
    Eval("Set PHI.det.Root_"<<k+"=aux")
  })
};

Change History (0)

Note: See TracTickets for help on using tickets.