Ipopt 3.11.9
Loading...
Searching...
No Matches
MittelmannBndryCntrlNeum.hpp
Go to the documentation of this file.
1// Copyright (C) 2005, 2006 International Business Machines and others.
2// All Rights Reserved.
3// This code is published under the Eclipse Public License.
4//
5// $Id: MittelmannBndryCntrlNeum.hpp 2005 2011-06-06 12:55:16Z stefan $
6//
7// Authors: Andreas Waechter IBM 2005-10-18
8// based on MyNLP.hpp
9
10#ifndef __MITTELMANNBNDRYCNTRLNEUM_HPP__
11#define __MITTELMANNBNDRYCNTRLNEUM_HPP__
12
13#include "IpTNLP.hpp"
14#include "RegisteredTNLP.hpp"
15
16#ifdef HAVE_CONFIG_H
17#include "config.h"
18#else
19#include "configall_system.h"
20#endif
21
22#ifdef HAVE_CMATH
23# include <cmath>
24#else
25# ifdef HAVE_MATH_H
26# include <math.h>
27# else
28# error "don't have header file for math"
29# endif
30#endif
31
32#ifdef HAVE_CSTDIO
33# include <cstdio>
34#else
35# ifdef HAVE_STDIO_H
36# include <stdio.h>
37# else
38# error "don't have header file for stdio"
39# endif
40#endif
41
42using namespace Ipopt;
43
50{
51public:
55
58
62 virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,
63 Index& nnz_h_lag, IndexStyleEnum& index_style);
64
66 virtual bool get_bounds_info(Index n, Number* x_l, Number* x_u,
67 Index m, Number* g_l, Number* g_u);
68
70 virtual bool get_starting_point(Index n, bool init_x, Number* x,
71 bool init_z, Number* z_L, Number* z_U,
72 Index m, bool init_lambda,
73 Number* lambda);
74
76 virtual bool eval_f(Index n, const Number* x, bool new_x, Number& obj_value);
77
79 virtual bool eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f);
80
82 virtual bool eval_g(Index n, const Number* x, bool new_x, Index m, Number* g);
83
88 virtual bool eval_jac_g(Index n, const Number* x, bool new_x,
89 Index m, Index nele_jac, Index* iRow, Index *jCol,
90 Number* values);
91
96 virtual bool eval_h(Index n, const Number* x, bool new_x,
97 Number obj_factor, Index m, const Number* lambda,
98 bool new_lambda, Index nele_hess, Index* iRow,
99 Index* jCol, Number* values);
100
102
105 bool& use_x_scaling, Index n,
107 bool& use_g_scaling, Index m,
109
114 virtual void finalize_solution(SolverReturn status,
115 Index n, const Number* x, const Number* z_L, const Number* z_U,
116 Index m, const Number* g, const Number* lambda,
117 Number obj_value,
118 const IpoptData* ip_data,
121
122protected:
127 Number ub_y, Number lb_u, Number ub_u,
128 Number u_init);
129
133 virtual Number y_d_cont(Number x1, Number x2) const =0;
135 virtual Number d_cont(Number x1, Number x2, Number y) const =0;
137 virtual Number d_cont_dy(Number x1, Number x2, Number y) const =0;
139 virtual Number d_cont_dydy(Number x1, Number x2, Number y) const =0;
142 virtual bool d_cont_dydy_alwayszero() const =0;
144 virtual Number b_cont(Number x1, Number x2, Number y, Number u) const =0;
146 virtual Number b_cont_dy(Number x1, Number x2, Number y, Number u) const =0;
148 virtual Number b_cont_du(Number x1, Number x2, Number y, Number u) const =0;
150 virtual Number b_cont_dydy(Number x1, Number x2, Number y, Number u) const =0;
153 virtual bool b_cont_dydy_alwayszero() const =0;
155
156private:
171
196
201 inline Index y_index(Index i, Index j) const
202 {
203 return j + (N_+2)*i;
204 }
207 inline Index u0j_index(Index j) const
208 {
209 return (N_+2)*(N_+2) + j-1;
210 }
213 inline Index u1j_index(Index j) const
214 {
215 return (N_+2)*(N_+2) + N_ + j-1;
216 }
219 inline Index ui0_index(Index j) const
220 {
221 return (N_+2)*(N_+2) + 2*N_ + j-1;
222 }
225 inline Index ui1_index(Index j) const
226 {
227 return (N_+2)*(N_+2) + 3*N_ + j-1;
228 }
230 inline Number x1_grid(Index i) const
231 {
232 return h_*(Number)i;
233 }
235 inline Number x2_grid(Index j) const
236 {
237 return h_*(Number)j;
238 }
240};
241
244{
245public:
248
251
252 virtual bool InitializeProblem(Index N)
253 {
254 if (N<1) {
255 printf("N has to be at least 1.");
256 return false;
257 }
258 Number alpha = 0.01;
259 Number lb_y = -1e20;
260 Number ub_y = 2.071;
261 Number lb_u = 3.7;
262 Number ub_u = 4.5;
263 Number u_init = (ub_u+lb_u)/2.;
264
265 SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init);
266 return true;
267 }
268protected:
270 virtual Number y_d_cont(Number x1, Number x2) const
271 {
272 return 2. - 2.*(x1*(x1-1.) + x2*(x2-1.));
273 }
275 virtual Number d_cont(Number x1, Number x2, Number y) const
276 {
277 return 0.;
278 }
280 virtual Number d_cont_dy(Number x1, Number x2, Number y) const
281 {
282 return 0.;
283 }
285 virtual Number d_cont_dydy(Number x1, Number x2, Number y) const
286 {
287 return 0.;
288 }
291 virtual bool d_cont_dydy_alwayszero() const
292 {
293 return true;
294 }
296 virtual Number b_cont(Number x1, Number x2, Number y, Number u) const
297 {
298 return u - y*y;
299 }
301 virtual Number b_cont_dy(Number x1, Number x2, Number y, Number u) const
302 {
303 return - 2.*y;
304 }
306 virtual Number b_cont_du(Number x1, Number x2, Number y, Number u) const
307 {
308 return 1.;
309 }
311 virtual Number b_cont_dydy(Number x1, Number x2, Number y, Number u) const
312 {
313 return -2.;
314 }
317 virtual bool b_cont_dydy_alwayszero() const
318 {
319 return false;
320 }
321private:
327};
328
331{
332public:
335
338
339 virtual bool InitializeProblem(Index N)
340 {
341 if (N<1) {
342 printf("N has to be at least 1.");
343 return false;
344 }
345 Number alpha = 0.;
346 Number lb_y = -1e20;
347 Number ub_y = 2.835;
348 Number lb_u = 6.;
349 Number ub_u = 9.;
350 Number u_init = (ub_u+lb_u)/2.;
351
352 SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init);
353 return true;
354 }
355protected:
357 virtual Number y_d_cont(Number x1, Number x2) const
358 {
359 return 2. - 2.*(x1*(x1-1.) + x2*(x2-1.));
360 }
362 virtual Number d_cont(Number x1, Number x2, Number y) const
363 {
364 return 0.;
365 }
367 virtual Number d_cont_dy(Number x1, Number x2, Number y) const
368 {
369 return 0.;
370 }
372 virtual Number d_cont_dydy(Number x1, Number x2, Number y) const
373 {
374 return 0.;
375 }
378 virtual bool d_cont_dydy_alwayszero() const
379 {
380 return true;
381 }
383 virtual Number b_cont(Number x1, Number x2, Number y, Number u) const
384 {
385 return u - y*y;
386 }
388 virtual Number b_cont_dy(Number x1, Number x2, Number y, Number u) const
389 {
390 return - 2.*y;
391 }
393 virtual Number b_cont_du(Number x1, Number x2, Number y, Number u) const
394 {
395 return 1.;
396 }
398 virtual Number b_cont_dydy(Number x1, Number x2, Number y, Number u) const
399 {
400 return -2.;
401 }
404 virtual bool b_cont_dydy_alwayszero() const
405 {
406 return false;
407 }
408private:
414};
415
418{
419public:
422
425
426 virtual bool InitializeProblem(Index N)
427 {
428 if (N<1) {
429 printf("N has to be at least 1.");
430 return false;
431 }
432 Number alpha = 0.01;
433 Number lb_y = -1e20;
434 Number ub_y = 2.7;
435 Number lb_u = 1.8;
436 Number ub_u = 2.5;
437 Number u_init = (ub_u+lb_u)/2.;
438
439 SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init);
440 return true;
441 }
442protected:
444 virtual Number y_d_cont(Number x1, Number x2) const
445 {
446 return 2. - 2.*(x1*(x1-1.) + x2*(x2-1.));
447 }
449 virtual Number d_cont(Number x1, Number x2, Number y) const
450 {
451 return y*y*y-y;
452 }
454 virtual Number d_cont_dy(Number x1, Number x2, Number y) const
455 {
456 return 3.*y*y-1.;
457 }
459 virtual Number d_cont_dydy(Number x1, Number x2, Number y) const
460 {
461 return 6.*y;
462 }
465 virtual bool d_cont_dydy_alwayszero() const
466 {
467 return false;
468 }
470 virtual Number b_cont(Number x1, Number x2, Number y, Number u) const
471 {
472 return u;
473 }
475 virtual Number b_cont_dy(Number x1, Number x2, Number y, Number u) const
476 {
477 return 0.;
478 }
480 virtual Number b_cont_du(Number x1, Number x2, Number y, Number u) const
481 {
482 return 1.;
483 }
485 virtual Number b_cont_dydy(Number x1, Number x2, Number y, Number u) const
486 {
487 return 0.;
488 }
491 virtual bool b_cont_dydy_alwayszero() const
492 {
493 return true;
494 }
495private:
501};
502
505{
506public:
509
512
513 virtual bool InitializeProblem(Index N)
514 {
515 if (N<1) {
516 printf("N has to be at least 1.");
517 return false;
518 }
519 Number alpha = 0.;
520 Number lb_y = -1e20;
521 Number ub_y = 2.7;
522 Number lb_u = 1.8;
523 Number ub_u = 2.5;
524 Number u_init = (ub_u+lb_u)/2.;
525
526 SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init);
527 return true;
528 }
529protected:
531 virtual Number y_d_cont(Number x1, Number x2) const
532 {
533 return 2. - 2.*(x1*(x1-1.) + x2*(x2-1.));
534 }
536 virtual Number d_cont(Number x1, Number x2, Number y) const
537 {
538 return y*y*y-y;
539 }
541 virtual Number d_cont_dy(Number x1, Number x2, Number y) const
542 {
543 return 3.*y*y-1.;
544 }
546 virtual Number d_cont_dydy(Number x1, Number x2, Number y) const
547 {
548 return 6.*y;
549 }
552 virtual bool d_cont_dydy_alwayszero() const
553 {
554 return false;
555 }
557 virtual Number b_cont(Number x1, Number x2, Number y, Number u) const
558 {
559 return u;
560 }
562 virtual Number b_cont_dy(Number x1, Number x2, Number y, Number u) const
563 {
564 return 0.;
565 }
567 virtual Number b_cont_du(Number x1, Number x2, Number y, Number u) const
568 {
569 return 1.;
570 }
572 virtual Number b_cont_dydy(Number x1, Number x2, Number y, Number u) const
573 {
574 return 0.;
575 }
578 virtual bool b_cont_dydy_alwayszero() const
579 {
580 return true;
581 }
582private:
588};
589
590#endif
Number * x
Input: Starting point Output: Optimal solution.
Number Number Index Number Number Index Index nele_hess
Number of non-zero elements in Hessian of Lagrangian.
Number Number * g
Values of constraint at final point (output only - ignored if set to NULL)
Number Number Index Number Number Index nele_jac
Number of non-zero elements in constraint Jacobian.
Number Number * x_scaling
Number obj_scaling
Number Number Number * g_scaling
Number Number Index m
Number of constraints.
Number Number Index Number Number Index Index Index index_style
indexing style for iRow & jCol, 0 for C style, 1 for Fortran style
Class for all IPOPT specific calculated quantities.
Class to organize all the data required by the algorithm.
IndexStyleEnum
overload this method to return the number of variables and constraints, and the number of non-zeros i...
Definition IpTNLP.hpp:80
Class implementating Example 5.
virtual Number b_cont_dydy(Number x1, Number x2, Number y, Number u) const
Second partial derivative of b_cont w.r.t.
virtual bool d_cont_dydy_alwayszero() const
returns true if second partial derivative of d_cont w.r.t.
virtual Number d_cont(Number x1, Number x2, Number y) const
Forcing function for the elliptic equation.
MittelmannBndryCntrlNeum1(const MittelmannBndryCntrlNeum1 &)
virtual Number d_cont_dy(Number x1, Number x2, Number y) const
First partial derivative of forcing function w.r.t.
virtual Number b_cont_du(Number x1, Number x2, Number y, Number u) const
First partial derivative of b_cont w.r.t.
virtual Number d_cont_dydy(Number x1, Number x2, Number y) const
Second partial derivative of forcing function w.r.t y,y.
virtual bool b_cont_dydy_alwayszero() const
returns true if second partial derivative of b_cont w.r.t.
virtual Number b_cont_dy(Number x1, Number x2, Number y, Number u) const
First partial derivative of b_cont w.r.t.
virtual Number y_d_cont(Number x1, Number x2) const
Target profile function for y.
virtual Number b_cont(Number x1, Number x2, Number y, Number u) const
Function in Neuman boundary condition.
virtual bool InitializeProblem(Index N)
Initialize internal parameters, where N is a parameter determining the problme size.
MittelmannBndryCntrlNeum1 & operator=(const MittelmannBndryCntrlNeum1 &)
Class implementating Example 6.
virtual Number d_cont_dy(Number x1, Number x2, Number y) const
First partial derivative of forcing function w.r.t.
virtual Number d_cont_dydy(Number x1, Number x2, Number y) const
Second partial derivative of forcing function w.r.t y,y.
MittelmannBndryCntrlNeum2 & operator=(const MittelmannBndryCntrlNeum2 &)
virtual Number b_cont(Number x1, Number x2, Number y, Number u) const
Function in Neuman boundary condition.
virtual Number d_cont(Number x1, Number x2, Number y) const
Forcing function for the elliptic equation.
virtual Number b_cont_du(Number x1, Number x2, Number y, Number u) const
First partial derivative of b_cont w.r.t.
virtual bool InitializeProblem(Index N)
Initialize internal parameters, where N is a parameter determining the problme size.
MittelmannBndryCntrlNeum2(const MittelmannBndryCntrlNeum2 &)
virtual bool d_cont_dydy_alwayszero() const
returns true if second partial derivative of d_cont w.r.t.
virtual Number b_cont_dy(Number x1, Number x2, Number y, Number u) const
First partial derivative of b_cont w.r.t.
virtual Number b_cont_dydy(Number x1, Number x2, Number y, Number u) const
Second partial derivative of b_cont w.r.t.
virtual bool b_cont_dydy_alwayszero() const
returns true if second partial derivative of b_cont w.r.t.
virtual Number y_d_cont(Number x1, Number x2) const
Target profile function for y.
Class implementating Example 7.
virtual bool b_cont_dydy_alwayszero() const
returns true if second partial derivative of b_cont w.r.t.
virtual Number b_cont_dydy(Number x1, Number x2, Number y, Number u) const
Second partial derivative of b_cont w.r.t.
virtual Number b_cont(Number x1, Number x2, Number y, Number u) const
Function in Neuman boundary condition.
MittelmannBndryCntrlNeum3 & operator=(const MittelmannBndryCntrlNeum3 &)
virtual Number b_cont_dy(Number x1, Number x2, Number y, Number u) const
First partial derivative of b_cont w.r.t.
virtual Number d_cont(Number x1, Number x2, Number y) const
Forcing function for the elliptic equation.
virtual Number d_cont_dydy(Number x1, Number x2, Number y) const
Second partial derivative of forcing function w.r.t y,y.
MittelmannBndryCntrlNeum3(const MittelmannBndryCntrlNeum3 &)
virtual bool InitializeProblem(Index N)
Initialize internal parameters, where N is a parameter determining the problme size.
virtual Number d_cont_dy(Number x1, Number x2, Number y) const
First partial derivative of forcing function w.r.t.
virtual bool d_cont_dydy_alwayszero() const
returns true if second partial derivative of d_cont w.r.t.
virtual Number b_cont_du(Number x1, Number x2, Number y, Number u) const
First partial derivative of b_cont w.r.t.
virtual Number y_d_cont(Number x1, Number x2) const
Target profile function for y.
Class implementating Example 8.
virtual Number y_d_cont(Number x1, Number x2) const
Target profile function for y.
virtual Number b_cont_dy(Number x1, Number x2, Number y, Number u) const
First partial derivative of b_cont w.r.t.
MittelmannBndryCntrlNeum4(const MittelmannBndryCntrlNeum4 &)
virtual Number d_cont(Number x1, Number x2, Number y) const
Forcing function for the elliptic equation.
virtual bool d_cont_dydy_alwayszero() const
returns true if second partial derivative of d_cont w.r.t.
virtual Number d_cont_dy(Number x1, Number x2, Number y) const
First partial derivative of forcing function w.r.t.
virtual bool InitializeProblem(Index N)
Initialize internal parameters, where N is a parameter determining the problme size.
MittelmannBndryCntrlNeum4 & operator=(const MittelmannBndryCntrlNeum4 &)
virtual bool b_cont_dydy_alwayszero() const
returns true if second partial derivative of b_cont w.r.t.
virtual Number d_cont_dydy(Number x1, Number x2, Number y) const
Second partial derivative of forcing function w.r.t y,y.
virtual Number b_cont(Number x1, Number x2, Number y, Number u) const
Function in Neuman boundary condition.
virtual Number b_cont_du(Number x1, Number x2, Number y, Number u) const
First partial derivative of b_cont w.r.t.
virtual Number b_cont_dydy(Number x1, Number x2, Number y, Number u) const
Second partial derivative of b_cont w.r.t.
Base class for boundary control problems with Neumann boundary conditions, as formulated by Hans Mitt...
virtual void finalize_solution(SolverReturn status, Index n, const Number *x, const Number *z_L, const Number *z_U, Index m, const Number *g, const Number *lambda, Number obj_value, const IpoptData *ip_data, IpoptCalculatedQuantities *ip_cq)
This method is called after the optimization, and could write an output file with the optimal profile...
virtual bool eval_f(Index n, const Number *x, bool new_x, Number &obj_value)
Method to return the objective value.
virtual bool get_starting_point(Index n, bool init_x, Number *x, bool init_z, Number *z_L, Number *z_U, Index m, bool init_lambda, Number *lambda)
Method to return the starting point for the algorithm.
Index N_
Number of mesh points in one dimension (excluding boundary)
virtual Number d_cont(Number x1, Number x2, Number y) const =0
Forcing function for the elliptic equation.
MittelmannBndryCntrlNeumBase(const MittelmannBndryCntrlNeumBase &)
virtual bool eval_jac_g(Index n, const Number *x, bool new_x, Index m, Index nele_jac, Index *iRow, Index *jCol, Number *values)
Method to return: 1) The structure of the jacobian (if "values" is NULL) 2) The values of the jacobia...
MittelmannBndryCntrlNeumBase & operator=(const MittelmannBndryCntrlNeumBase &)
Index y_index(Index i, Index j) const
Translation of mesh point indices to NLP variable indices for y(x_ij)
Number ub_y_
overall upper bound on y
virtual Number b_cont_dy(Number x1, Number x2, Number y, Number u) const =0
First partial derivative of b_cont w.r.t.
Number * y_d_
Array for the target profile for y.
MittelmannBndryCntrlNeumBase()
Constructor.
virtual Number d_cont_dydy(Number x1, Number x2, Number y) const =0
Second partial derivative of forcing function w.r.t.
virtual ~MittelmannBndryCntrlNeumBase()
Default destructor.
virtual Number y_d_cont(Number x1, Number x2) const =0
Target profile function for y (and initial guess function)
Number x1_grid(Index i) const
Compute the grid coordinate for given index in x1 direction.
virtual bool d_cont_dydy_alwayszero() const =0
returns true if second partial derivative of d_cont w.r.t.
void SetBaseParameters(Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number u_init)
Method for setting the internal parameters that define the problem.
virtual Number b_cont(Number x1, Number x2, Number y, Number u) const =0
Function in Neuman boundary condition.
Number x2_grid(Index j) const
Compute the grid coordinate for given index in x2 direction.
Number lb_u_
overall lower bound on u
virtual bool b_cont_dydy_alwayszero() const =0
returns true if second partial derivative of b_cont w.r.t.
virtual bool eval_g(Index n, const Number *x, bool new_x, Index m, Number *g)
Method to return the constraint residuals.
virtual Number b_cont_dydy(Number x1, Number x2, Number y, Number u) const =0
Second partial derivative of b_cont w.r.t.
Number ub_u_
overall upper bound on u
Number u_init_
Initial value for the constrols u.
Number alpha_
Weighting parameter for the control target deviation functional in the objective.
virtual bool eval_grad_f(Index n, const Number *x, bool new_x, Number *grad_f)
Method to return the gradient of the objective.
Index u0j_index(Index j) const
Translation of mesh point indices to NLP variable indices for u(x_ij) on {0} x (0,...
Index ui0_index(Index j) const
Translation of mesh point indices to NLP variable indices for u(x_ij) on (0,1) x {0} boudnary.
Index u1j_index(Index j) const
Translation of mesh point indices to NLP variable indices for u(x_ij) on {1} x (0,...
Number lb_y_
overall lower bound on y
virtual Number b_cont_du(Number x1, Number x2, Number y, Number u) const =0
First partial derivative of b_cont w.r.t.
Index ui1_index(Index j) const
Translation of mesh point indices to NLP variable indices for u(x_ij) on (0,1) x {1} boudnary.
virtual bool get_bounds_info(Index n, Number *x_l, Number *x_u, Index m, Number *g_l, Number *g_u)
Method to return the bounds for my problem.
virtual Number d_cont_dy(Number x1, Number x2, Number y) const =0
First partial derivative of forcing function w.r.t.
virtual bool eval_h(Index n, const Number *x, bool new_x, Number obj_factor, Index m, const Number *lambda, bool new_lambda, Index nele_hess, Index *iRow, Index *jCol, Number *values)
Method to return: 1) The structure of the hessian of the lagrangian (if "values" is NULL) 2) The valu...
virtual bool get_scaling_parameters(Number &obj_scaling, bool &use_x_scaling, Index n, Number *x_scaling, bool &use_g_scaling, Index m, Number *g_scaling)
Method for returning scaling parameters.
virtual bool get_nlp_info(Index &n, Index &m, Index &nnz_jac_g, Index &nnz_h_lag, IndexStyleEnum &index_style)
Method to return some info about the nlp.
Class implemented the NLP discretization of.
SolverReturn
enum for the return from the optimize algorithm (obviously we need to add more)
int Index
Type of all indices of vectors, matrices etc.
Definition IpTypes.hpp:19
double Number
Type of all numbers.
Definition IpTypes.hpp:17