[CppAD] Eigen value problem in CppAD with Eigen
Jyotiranjan Beuria
jyotiranjan.beuria at gmail.com
Sun Aug 6 04:08:19 EDT 2017
I found a strange work around. If I change
Eigen::EigenSolver to Eigen::SelfAdjointEigenSolver or
Eigen::ComplexEigenSolver,
I get correct result. Do you have any clue if this has origin in CppAD or
Eigen.
On Sat, Aug 5, 2017 at 7:50 PM, Jyotiranjan Beuria <
jyotiranjan.beuria at gmail.com> wrote:
> I am trying to get derivatives of a function that depends on eigenvalues.
> It turns out that it prints only derivative wrt first element.
> The code is as follows.
>
> #include <cppad/cppad.hpp>
> #include <cppad/example/cppad_eigen.hpp>
> #include <Eigen/Eigenvalues>
>
> template <class T>
> Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
> GetEigenValues ( Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& m)
> {
> Eigen::EigenSolver< Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> >
> es(m,false);
> return es.eigenvalues().real();
> }
>
> int main() {
> typedef double Scalar;
> typedef CppAD::AD<Scalar> AD;
> typedef CppAD::AD<Scalar> AD;
> // independent variable vector
> Eigen::Matrix<AD,Eigen::Dynamic,1> x(4);
> CppAD::Independent(x);
> // dependent variable vector
> Eigen::Matrix<AD,Eigen::Dynamic,1> y(4);
>
> Eigen::Matrix<AD,Eigen::Dynamic,Eigen::Dynamic> m(4,4);
> m.setIdentity();
> m(0,0)=x[0]*x[0];
> m(1,1)=x[1]*x[0];
> m(2,2)=x[2]*x[0];
> m(3,3)=x[0]*x[3];
> y=GetEigenValues(m);
>
> CppAD::ADFun<Scalar> fun(x, y);
> Eigen::Matrix<Scalar,Eigen::Dynamic,1> xx(4);
> xx<<2.,1.,10.,4.;
>
> Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> jac;
> jac=fun.Jacobian(xx);
>
> std::cout<<" Now the jacobian is: "<<std::endl;
> std::cout<<jac<<std::endl;
> }
>
> Could anyone help me resolve this issue.
>
--
Jyotiranjan Beuria
Ph.D Student, HRI Allahabad
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.coin-or.org/pipermail/cppad/attachments/20170806/f08f4e26/attachment.html>
More information about the CppAD
mailing list