jetson nano instala ipopt y CppAD y pyomo

jetson nano + ubuntu 18.04 + 128G TF

Vale la pena mencionar que este artículo también es adecuado para jetson TX1 y TX2.


  • 1. Descarga la biblioteca
wget http://www.coin-or.org/download/source/Ipopt/Ipopt-3.12.9.tgz
tar xvzf Ipopt-3.12.9.tgz
  • 2. Descargue el paquete de terceros
cd ~/Ipopt-3.12.9/ThirdParty/Blas
./get.Blas
cd ../Lapack
./get.Lapack
cd ../Mumps
./get.Mumps
cd ../Metis
./get.Metis
cd ../../ 
  • 3. (¡¡¡La clave del éxito !!!)将jetson nano系统的config.guess替代ipop中的config.guess.
cp /usr/share/automake-1.15/config.guess ~/Ipopt-3.12.9/BuildTools/config.guess
cp /usr/share/automake-1.15/config.guess ~/Ipopt-3.12.9/Ipopt/config.guess
cp /usr/share/automake-1.15/config.guess ~/Ipopt-3.12.9/ThirdParty/ASL/config.guess
cp /usr/share/automake-1.15/config.guess ~/Ipopt-3.12.9/ThirdParty/Blas/config.guess
cp /usr/share/automake-1.15/config.guess ~/Ipopt-3.12.9/ThirdParty/HSL/config.guess
cp /usr/share/automake-1.15/config.guess ~/Ipopt-3.12.9/ThirdParty/Lapack/config.guess
cp /usr/share/automake-1.15/config.guess ~/Ipopt-3.12.9/ThirdParty/Metis/config.guess
cp /usr/share/automake-1.15/config.guess ~/Ipopt-3.12.9/ThirdParty/Mumps/config.guess
  • 4. Compilar ipopt
cd ~/Ipopt-3.12.9/
mkdir build
cd build
../configure --prefix=/usr/local   
make
sudo make install
  • 5. Instale cppad
sudo apt-get install cppad
  • 6. Pruebe cppad + ipopt

qtcreator-> Archivo-> Nuevo archivo o proyecto-> Proyecto que no es Qt-> Aplicación C ++ simple-> Elegir

En la interfaz que aparece, el nombre del proyecto se puede tomar a voluntad, aquí: prueba

Luego reemplace el código de hola mundo en main.cpp con el siguiente código.

Y agregue la biblioteca de dependencias de ipopt al final del archivo test.proLIBS += -L/usr/local/lib -lipopt

#include <iostream>
#include <cppad/ipopt/solve.hpp>

using namespace std;

namespace {
    
    
using CppAD::AD;
class FG_eval {
    
    
public:
    typedef CPPAD_TESTVECTOR(AD<double>) ADvector;
    void operator()(ADvector& fg, const ADvector& x)
    {
    
    
        assert(fg.size() == 3);
        assert(x.size() == 4);
        // variables
        AD<double> x1 = x[0];
        AD<double> x2 = x[1];
        AD<double> x3 = x[2];
        AD<double> x4 = x[3];
        // f(x) objective function
        fg[0] = x1 * x4 * (x1 + x2 + x3) + x3;
        // constraints
        fg[1] = x1 * x2 * x3 * x4;
        fg[2] = x1 * x1 + x2 * x2 + x3 * x3 + x4 * x4;
        return;
    }

};

}

bool get_started(void)
{
    
    
    bool ok = true;
    size_t i;
    typedef CPPAD_TESTVECTOR(double) Dvector;

    size_t nx = 4; // number of varibles
    size_t ng = 2; // number of constraints
    Dvector x0(nx); // initial condition of varibles
    x0[0] = 1.0;
    x0[1] = 5.0;
    x0[2] = 5.0;
    x0[3] = 1.0;

    // lower and upper bounds for varibles
    Dvector xl(nx), xu(nx);
    for(i = 0; i < nx; i++)
    {
    
    
        xl[i] = 1.0;
        xu[i] = 5.0;
    }
    Dvector gl(ng), gu(ng);
    gl[0] = 25.0;    gu[0] = 1.0e19;
    gl[1] = 40.0;    gu[1] = 40.0;
    // object that computes objective and constraints
    FG_eval fg_eval;

    // options
    string options;
    // turn off any printing
    options += "Integer print_level  0\n";
    options += "String sb            yes\n";
    // maximum iterations
    options += "Integer max_iter     10\n";
    //approximate accuracy in first order necessary conditions;
    // see Mathematical Programming, Volume 106, Number 1,
    // Pages 25-57, Equation (6)
    options += "Numeric tol          1e-6\n";
    //derivative tesing
    options += "String derivative_test   second-order\n";
    // maximum amount of random pertubation; e.g.,
    // when evaluation finite diff
    options += "Numeric point_perturbation_radius   0.\n";


    CppAD::ipopt::solve_result<Dvector> solution; // solution
    CppAD::ipopt::solve<Dvector, FG_eval>(options, x0, xl, xu, gl, gu, fg_eval, solution); // solve the problem

    cout<<"solution: "<<solution.x<<endl;

    //
    //check some of the solution values
    //
    ok &= solution.status == CppAD::ipopt::solve_result<Dvector>::success;
    //
    double check_x[]  = {
    
    1.000000, 4.743000, 3.82115, 1.379408};
    double check_zl[] = {
    
    1.087871, 0.,       0.,       0.      };
    double check_zu[] = {
    
    0.,       0.,       0.,       0.      };
    double rel_tol    = 1e-6; // relative tolerance
    double abs_tol    = 1e-6; // absolute tolerance
    for(i = 0; i < nx; i++)
    {
    
    
        ok &= CppAD::NearEqual(
                    check_x[i], solution.x[i], rel_tol, abs_tol);
        ok &= CppAD::NearEqual(
                    check_zl[i], solution.zl[i], rel_tol, abs_tol);
        ok &= CppAD::NearEqual(
                    check_zu[i], solution.zu[i], rel_tol, abs_tol);
    }

    return ok;
}

int main()
{
    
    
    cout << "CppAD : Hello World Demo!" << endl;
    get_started();
    return 0;
}


Exportación: CppAD: ¡Demostración de Hello World!
Solución: {1, 4.743, 3.82115, 1.37941}

  • 7. pyomo + ipopt
    al menos necesita instalar correctamente la versión c ++ de ipopt de acuerdo con los pasos anteriores antes de instalar la versión python de ipopt

Instale desde pip, si se siente lento, puede cambiar la fuente de pypi .

sudo pip3 install pyomo
sudo pip3 install ipopt

Agregue la ruta de la biblioteca ipopt al final del archivo .bashrc para que ipopt en python pueda encontrarla.这一步不加,在测试时会出错。

echo "export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib" >> ~/.bashrc
source ~/.bashrc

prueba:

import numpy as np
from pyomo.environ import *
from pyomo.dae import *

model = ConcreteModel()
model.x = Var(RangeSet(1, 4), bounds=(1, 25))
model.cons1 = Constraint(rule=lambda model: 40==model.x[1]**2+model.x[2]**2+model.x[3]**2+model.x[4]**2)
model.cons2 = Constraint(rule=lambda model: 25<=model.x[1]*model.x[2]*model.x[3]*model.x[4])
model.obj = Objective(expr = model.x[1]*model.x[4]*(model.x[1] + model.x[2] + model.x[3]) + model.x[3], sense=minimize) 
SolverFactory('ipopt').solve(model)
solutions = [model.x[i]() for i in range(1, 5)]
print("solutins is :"+str(solutions))

Resultado: las soluciones son: [1.0, 4.742999644013376, 3.821149978907638, 1.3794082901545968]


FINAL

Hace mucho calor hoy, los enrutadores calientes están en huelga, la velocidad de Internet se ralentiza y luego no hay conexión a Internet. Bajé las escaleras y le pregunté a mi madre, ¿dónde está el molde para los cubitos de hielo congelados que se usan en el refrigerador? Quiero congelar algunos cubitos de hielo para enfriar el enrutador. Sin embargo, hace muchos años, mi madre tiró este pequeño molde de cubitos de hielo congelado por considerarlo inútil. ¡Vuela caliente, 35 grados hoy!

4 de mayo de 2020, soleado, soleado, soleado, soleado

Casi lo olvido, ¡Feliz 4 de mayo, Día de la Juventud!

Supongo que te gusta

Origin blog.csdn.net/u013468614/article/details/105924703
Recomendado
Clasificación