本文整理汇总了C++中SX::append方法的典型用法代码示例。如果您正苦于以下问题:C++ SX::append方法的具体用法?C++ SX::append怎么用?C++ SX::append使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SX
的用法示例。
在下文中一共展示了SX::append方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: main
int main(){
cout << "program started" << endl;
// Dimensions
int nk = 100; // Number of control segments
int nj = 100; // Number of integration steps per control segment
// Control
SX u = ssym("u",nk); // control
// Number of states
int nx = 3;
// Intermediate variables with initial values and bounds
SX v, v_def;
DMatrix v_init, v_min, v_max;
// Initial values and bounds for the state at the different stages
DMatrix x_k_init = DMatrix::zeros(nx);
DMatrix x_k_min = -DMatrix::inf(nx);
DMatrix x_k_max = DMatrix::inf(nx);
// Initial conditions
DMatrix x_0 = DMatrix::zeros(nx);
x_0[0] = 0; // x
x_0[1] = 1; // y
x_0[2] = 0; // lterm
double tf = 10;
SX dt = tf/(nj*nk); // time step
// For all the shooting intervals
SX x_k = x_0;
SX ode_rhs(x_k.sparsity(),0);
for(int k=0; k<nk; ++k){
// Get control
SX u_k = u[k].at(0);
// Integrate over the interval with Euler forward
for(int j=0; j<nj; ++j){
// ODE right hand side
ode_rhs[0] = (1 - x_k[1]*x_k[1])*x_k[0] - x_k[1] + u_k;
ode_rhs[1] = x_k[0];
ode_rhs[2] = x_k[0]*x_k[0] + x_k[1]*x_k[1];
// Take a step
x_k += dt*ode_rhs;
}
// Lift x
v_def.append(x_k);
v_init.append(x_k_init);
v_min.append(x_k_min);
v_max.append(x_k_max);
// Allocate intermediate variables
stringstream ss;
ss << "v_" << k;
x_k = ssym(ss.str(),nx);
v.append(x_k);
}
// Objective function
SX f = x_k[2] + (tf/nk)*inner_prod(u,u);
// Terminal constraints
SX g;
g.append(x_k[0]);
g.append(x_k[1]);
// Bounds on g
DMatrix g_min = DMatrix::zeros(2);
DMatrix g_max = DMatrix::zeros(2);
// Bounds on u and initial condition
DMatrix u_min = -0.75*DMatrix::ones(nk);
DMatrix u_max = 1.00*DMatrix::ones(nk);
DMatrix u_init = DMatrix::zeros(nk);
DMatrix xv_min = vertcat(u_min,v_min);
DMatrix xv_max = vertcat(u_max,v_max);
DMatrix xv_init = vertcat(u_init,v_init);
DMatrix gv_min = vertcat(DMatrix::zeros(v.size()),g_min);
DMatrix gv_max = vertcat(DMatrix::zeros(v.size()),g_max);
// Formulate the full-space NLP
SXFunction ffcn(vertcat(u,v),f);
SXFunction gfcn(vertcat(u,v),vertcat(v_def-v,g));
Dictionary qp_solver_options;
qp_solver_options["printLevel"] = "none";
// Solve using multiple NLP solvers
enum Tests{IPOPT, LIFTED_SQP, FULLSPACE_SQP, OLD_SQP_METHOD, NUM_TESTS};
for(int test=0; test<NUM_TESTS; ++test){
// Get the nlp solver and NLP solver options
NLPSolver nlp_solver;
switch(test){
case IPOPT:
cout << "Testing IPOPT" << endl;
//.........这里部分代码省略.........
示例2: main
int main(){
cout << "program started" << endl;
// Dimensions
int nu = 20; // Number of control segments
int nj = 100; // Number of integration steps per control segment
// optimization variable
SX u = SX::sym("u", nu); // control
SX s_0 = 0; // initial position
SX v_0 = 0; // initial speed
SX m_0 = 1; // initial mass
SX dt = 10.0/(nj*nu); // time step
SX alpha = 0.05; // friction
SX beta = 0.1; // fuel consumption rate
// Trajectory
SX s_traj = SX::zeros(nu);
SX v_traj = SX::zeros(nu);
SX m_traj = SX::zeros(nu);
// Integrate over the interval with Euler forward
SX s = s_0, v = v_0, m = m_0;
for(int k=0; k<nu; ++k){
for(int j=0; j<nj; ++j){
s += dt*v;
v += dt / m * (u[k]- alpha * v*v);
m += -dt * beta*u[k]*u[k];
}
s_traj[k] = s;
v_traj[k] = v;
m_traj[k] = m;
}
// Objective function
SX f = inner_prod(u, u);
// Terminal constraints
SX g;
g.append(s);
g.append(v);
g.append(v_traj);
// Create the NLP
SXFunction nlp("nlp", nlpIn("x", u), nlpOut("f", f, "g", g));
// Allocate an NLP solver and buffers
NlpSolver solver("solver", "ipopt", nlp);
std::map<std::string, DMatrix> arg, res;
// Bounds on u and initial condition
arg["lbx"] = -10;
arg["ubx"] = 10;
arg["x0"] = 0.4;
// Bounds on g
vector<double> gmin(2), gmax(2);
gmin[0] = gmax[0] = 10;
gmin[1] = gmax[1] = 0;
gmin.resize(2+nu, -numeric_limits<double>::infinity());
gmax.resize(2+nu, 1.1);
arg["lbg"] = gmin;
arg["ubg"] = gmax;
// Solve the problem
res = solver(arg);
// Print the optimal cost
double cost(res.at("f"));
cout << "optimal cost: " << cost << endl;
// Print the optimal solution
vector<double> uopt(res.at("x"));
cout << "optimal control: " << uopt << endl;
// Get the state trajectory
vector<double> sopt(nu), vopt(nu), mopt(nu);
SXFunction xfcn("xfcn", make_vector(u), make_vector(s_traj, v_traj, m_traj));
assign_vector(sopt, vopt, mopt, xfcn(make_vector(res.at("x"))));
cout << "position: " << sopt << endl;
cout << "velocity: " << vopt << endl;
cout << "mass: " << mopt << endl;
// Create Matlab script to plot the solution
ofstream file;
string filename = "rocket_ipopt_results.m";
file.open(filename.c_str());
file << "% Results file from " __FILE__ << endl;
file << "% Generated " __DATE__ " at " __TIME__ << endl;
file << endl;
file << "cost = " << cost << ";" << endl;
file << "u = " << uopt << ";" << endl;
// Save results to file
file << "t = linspace(0,10.0," << nu << ");"<< endl;
file << "s = " << sopt << ";" << endl;
file << "v = " << vopt << ";" << endl;
file << "m = " << mopt << ";" << endl;
//.........这里部分代码省略.........
示例3: init
//.........这里部分代码省略.........
cout << "Allocated intermediate variables." << endl;
}
// Lagrange multipliers for constraints
lam_g = vertcat(lam_v_eq,lam_f2);
// Lagrangian function
SX lag = f + inner_prod(lam_x,x);
if(!f2.empty()) lag += inner_prod(lam_f2,f2);
if(!v.empty()) lag += inner_prod(lam_v_eq,v_def);
// Gradient of the Lagrangian
SX lgrad = casadi::gradient(lag,x);
if(!v.empty()) lgrad -= vertcat(SX::zeros(nu),lam_v_eq); // Put here to ensure that lgrad is of the form "h_extended -v_extended"
makeDense(lgrad);
if(verbose_){
cout << "Generated the gradient of the Lagrangian." << endl;
}
// Condensed gradient of the Lagrangian
f1 = lgrad[Slice(0,nu)];
nf1 = nu;
// Gradient of h
SX v_eq_grad = lgrad[Slice(nu,nu+nv)];
// Reverse lam_v_eq and v_eq_grad
SX v_eq_grad_reversed = v_eq_grad;
copy(v_eq_grad.rbegin(),v_eq_grad.rend(),v_eq_grad_reversed.begin());
SX lam_v_eq_reversed = lam_v_eq;
copy(lam_v_eq.rbegin(),lam_v_eq.rend(),lam_v_eq_reversed.begin());
// Augment h and lam_v_eq
v_eq.append(v_eq_grad_reversed);
v.append(lam_v_eq_reversed);
}
// Residual function G
SXVector G_in(G_NUM_IN);
G_in[G_X] = x;
G_in[G_LAM_X] = lam_x;
G_in[G_LAM_G] = lam_g;
SXVector G_out(G_NUM_OUT);
G_out[G_D] = v_eq;
G_out[G_G] = g;
G_out[G_F] = f;
rfcn_ = SXFunction(G_in,G_out);
rfcn_.setOption("number_of_fwd_dir",0);
rfcn_.setOption("number_of_adj_dir",0);
rfcn_.setOption("live_variables",true);
rfcn_.init();
if(verbose_){
cout << "Generated residual function ( " << shared_cast<SXFunction>(rfcn_).getAlgorithmSize() << " nodes)." << endl;
}
// Difference vector d
SX d = ssym("d",nv);
if(!gauss_newton_){
vector<SX> dg = ssym("dg",nv).data();
reverse(dg.begin(),dg.end());
d.append(dg);
}
// Substitute out the v from the h