Ipopt 3.11.9
Loading...
Searching...
No Matches
MittelmannDistCntrlDiri.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: MittelmannDistCntrlDiri.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 __MITTELMANNDISTRCNTRLDIRI_HPP__
11#define __MITTELMANNDISTRCNTRLDIRI_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
51{
52public:
56
59
63 virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,
64 Index& nnz_h_lag, IndexStyleEnum& index_style);
65
67 virtual bool get_bounds_info(Index n, Number* x_l, Number* x_u,
68 Index m, Number* g_l, Number* g_u);
69
71 virtual bool get_starting_point(Index n, bool init_x, Number* x,
72 bool init_z, Number* z_L, Number* z_U,
73 Index m, bool init_lambda,
74 Number* lambda);
75
77 virtual bool eval_f(Index n, const Number* x, bool new_x, Number& obj_value);
78
80 virtual bool eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f);
81
83 virtual bool eval_g(Index n, const Number* x, bool new_x, Index m, Number* g);
84
89 virtual bool eval_jac_g(Index n, const Number* x, bool new_x,
90 Index m, Index nele_jac, Index* iRow, Index *jCol,
91 Number* values);
92
97 virtual bool eval_h(Index n, const Number* x, bool new_x,
98 Number obj_factor, Index m, const Number* lambda,
99 bool new_lambda, Index nele_hess, Index* iRow,
100 Index* jCol, Number* values);
101
103
106 bool& use_x_scaling, Index n,
108 bool& use_g_scaling, Index m,
110
115 virtual void finalize_solution(SolverReturn status,
116 Index n, const Number* x, const Number* z_L, const Number* z_U,
117 Index m, const Number* g, const Number* lambda,
118 Number obj_value,
119 const IpoptData* ip_data,
122
123protected:
128 Number ub_y, Number lb_u, Number ub_u,
129 Number u_init);
130
134 virtual Number y_d_cont(Number x1, Number x2) const =0;
136 virtual Number d_cont(Number x1, Number x2, Number y, Number u) const =0;
138 virtual Number d_cont_dy(Number x1, Number x2, Number y, Number u) const =0;
140 virtual Number d_cont_du(Number x1, Number x2, Number y, Number u) const =0;
142 virtual Number d_cont_dydy(Number x1, Number x2, Number y, Number u) const =0;
144
145private:
160
185
190 inline Index y_index(Index i, Index j) const
191 {
192 return j + (N_+2)*i;
193 }
196 inline Index u_index(Index i, Index j) const
197 {
198 return (N_+2)*(N_+2) + (j-1) + (N_)*(i-1);
199 }
202 inline Index pde_index(Index i, Index j) const
203 {
204 return (j-1) + N_*(i-1);
205 }
207 inline Number x1_grid(Index i) const
208 {
209 return h_*(Number)i;
210 }
212 inline Number x2_grid(Index i) const
213 {
214 return h_*(Number)i;
215 }
217};
218
221{
222public:
225
228
229 virtual bool InitializeProblem(Index N)
230 {
231 if (N<1) {
232 printf("N has to be at least 1.");
233 return false;
234 }
235 Number alpha = 0.001;
236 Number lb_y = -1e20;
237 Number ub_y = 0.185;
238 Number lb_u = 1.5;
239 Number ub_u = 4.5;
240 Number u_init = (ub_u+lb_u)/2.;
241
242 SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init);
243 return true;
244 }
245protected:
247 virtual Number y_d_cont(Number x1, Number x2) const
248 {
249 return 1. + 2.*(x1*(x1-1.)+x2*(x2-1.));
250 }
252 virtual Number d_cont(Number x1, Number x2, Number y, Number u) const
253 {
254 return pow(y,3) - y - u;
255 }
257 virtual Number d_cont_dy(Number x1, Number x2, Number y, Number u) const
258 {
259 return 3.*y*y - 1.;
260 }
262 virtual Number d_cont_du(Number x1, Number x2, Number y, Number u) const
263 {
264 return -1.;
265 }
267 virtual Number d_cont_dydy(Number x1, Number x2, Number y, Number u) const
268 {
269 return 6.*y;
270 }
271private:
277};
278
281{
282public:
287 virtual bool InitializeProblem(Index N)
288 {
289 if (N<1) {
290 printf("N has to be at least 1.");
291 return false;
292 }
293 Number alpha = 0.;
294 Number lb_y = -1e20;
295 Number ub_y = 0.185;
296 Number lb_u = 1.5;
297 Number ub_u = 4.5;
298 Number u_init = (ub_u+lb_u)/2.;
299
300 SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init);
301 return true;
302 }
303protected:
305 virtual Number y_d_cont(Number x1, Number x2) const
306 {
307 return 1. + 2.*(x1*(x1-1.)+x2*(x2-1.));
308 }
310 virtual Number d_cont(Number x1, Number x2, Number y, Number u) const
311 {
312 return pow(y,3) - y - u;
313 }
315 virtual Number d_cont_dy(Number x1, Number x2, Number y, Number u) const
316 {
317 return 3.*y*y - 1.;
318 }
320 virtual Number d_cont_du(Number x1, Number x2, Number y, Number u) const
321 {
322 return -1.;
323 }
325 virtual Number d_cont_dydy(Number x1, Number x2, Number y, Number u) const
326 {
327 return 6.*y;
328 }
329private:
335};
336
339{
340public:
342 :
343 pi_(4.*atan(1.))
344 {}
347 virtual bool InitializeProblem(Index N)
348 {
349 if (N<1) {
350 printf("N has to be at least 1.");
351 return false;
352 }
353 Number alpha = 0.001;
354 Number lb_y = -1e20;
355 Number ub_y = 0.11;
356 Number lb_u = -5;
357 Number ub_u = 5.;
358 Number u_init = (ub_u+lb_u)/2.;
359
360 SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init);
361 return true;
362 }
363protected:
365 virtual Number y_d_cont(Number x1, Number x2) const
366 {
367 return sin(2.*pi_*x1)*sin(2.*pi_*x2);
368 }
370 virtual Number d_cont(Number x1, Number x2, Number y, Number u) const
371 {
372 return -exp(y) - u;
373 }
375 virtual Number d_cont_dy(Number x1, Number x2, Number y, Number u) const
376 {
377 return -exp(y);
378 }
380 virtual Number d_cont_du(Number x1, Number x2, Number y, Number u) const
381 {
382 return -1.;
383 }
385 virtual Number d_cont_dydy(Number x1, Number x2, Number y, Number u) const
386 {
387 return -exp(y);
388 }
389private:
395
396 const Number pi_;
397};
398
400{
401public:
403 :
404 pi_(4.*atan(1.))
405 {}
408 virtual bool InitializeProblem(Index N)
409 {
410 if (N<1) {
411 printf("N has to be at least 1.");
412 return false;
413 }
414 Number alpha = 0.;
415 Number lb_y = -1e20;
416 Number ub_y = 0.11;
417 Number lb_u = -5;
418 Number ub_u = 5.;
419 Number u_init = (ub_u+lb_u)/2.;
420
421 SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init);
422 return true;
423 }
424protected:
426 virtual Number y_d_cont(Number x1, Number x2) const
427 {
428 return sin(2.*pi_*x1)*sin(2.*pi_*x2);
429 }
431 virtual Number d_cont(Number x1, Number x2, Number y, Number u) const
432 {
433 return -exp(y) - u;
434 }
436 virtual Number d_cont_dy(Number x1, Number x2, Number y, Number u) const
437 {
438 return -exp(y);
439 }
441 virtual Number d_cont_du(Number x1, Number x2, Number y, Number u) const
442 {
443 return -1.;
444 }
446 virtual Number d_cont_dydy(Number x1, Number x2, Number y, Number u) const
447 {
448 return -exp(y);
449 }
450private:
456
457 const Number pi_;
458};
459
460#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 1.
virtual bool InitializeProblem(Index N)
Initialize internal parameters, where N is a parameter determining the problme size.
virtual Number d_cont_du(Number x1, Number x2, Number y, Number u) const
First partial derivative of forcing function w.r.t.
virtual Number d_cont_dydy(Number x1, Number x2, Number y, Number u) const
Second partial derivative of forcing function w.r.t y,y.
MittelmannDistCntrlDiri1 & operator=(const MittelmannDistCntrlDiri1 &)
virtual Number d_cont_dy(Number x1, Number x2, Number y, Number u) const
First partial derivative of forcing function w.r.t.
MittelmannDistCntrlDiri1(const MittelmannDistCntrlDiri1 &)
virtual Number y_d_cont(Number x1, Number x2) const
Target profile function for y.
virtual Number d_cont(Number x1, Number x2, Number y, Number u) const
Forcing function for the elliptic equation.
Class implementating Example 2.
virtual Number d_cont_du(Number x1, Number x2, Number y, Number u) const
First partial derivative of forcing function w.r.t.
virtual Number d_cont_dydy(Number x1, Number x2, Number y, Number u) const
Second partial derivative of forcing function w.r.t y,y.
MittelmannDistCntrlDiri2 & operator=(const MittelmannDistCntrlDiri2 &)
virtual Number d_cont(Number x1, Number x2, Number y, Number u) const
Forcing function for the elliptic equation.
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, Number u) const
First partial derivative of forcing function w.r.t.
virtual Number y_d_cont(Number x1, Number x2) const
Target profile function for y.
MittelmannDistCntrlDiri2(const MittelmannDistCntrlDiri2 &)
Class implementating Example 3.
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, Number u) const
First partial derivative of forcing function w.r.t.
virtual Number d_cont(Number x1, Number x2, Number y, Number u) const
Forcing function for the elliptic equation.
MittelmannDistCntrlDiri3(const MittelmannDistCntrlDiri3 &)
virtual Number d_cont_dydy(Number x1, Number x2, Number y, Number u) const
Second partial derivative of forcing function w.r.t y,y.
virtual Number y_d_cont(Number x1, Number x2) const
Target profile function for y.
MittelmannDistCntrlDiri3 & operator=(const MittelmannDistCntrlDiri3 &)
const Number pi_
Value of pi (made available for convenience)
virtual Number d_cont_du(Number x1, Number x2, Number y, Number u) const
First partial derivative of forcing function w.r.t.
MittelmannDistCntrlDiri3a(const MittelmannDistCntrlDiri3a &)
virtual Number d_cont_du(Number x1, Number x2, Number y, Number u) const
First partial derivative of forcing function w.r.t.
const Number pi_
Value of pi (made available for convenience)
virtual Number d_cont(Number x1, Number x2, Number y, Number u) const
Forcing function for the elliptic equation.
virtual bool InitializeProblem(Index N)
Initialize internal parameters, where N is a parameter determining the problme size.
virtual Number d_cont_dydy(Number x1, Number x2, Number y, Number u) const
Second partial derivative of forcing function w.r.t y,y.
MittelmannDistCntrlDiri3a & operator=(const MittelmannDistCntrlDiri3a &)
virtual Number y_d_cont(Number x1, Number x2) const
Target profile function for y.
virtual Number d_cont_dy(Number x1, Number x2, Number y, Number u) const
First partial derivative of forcing function w.r.t.
Base class for distributed control problems with Dirichlet boundary conditions, as formulated by Hans...
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...
Number ub_y_
overall upper bound on y
Number u_init_
Initial value for the constrols u.
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.
MittelmannDistCntrlDiriBase & operator=(const MittelmannDistCntrlDiriBase &)
MittelmannDistCntrlDiriBase()
Constructor.
MittelmannDistCntrlDiriBase(const MittelmannDistCntrlDiriBase &)
virtual Number d_cont_dy(Number x1, Number x2, Number y, Number u) const =0
First partial derivative of forcing function w.r.t.
Number alpha_
Weighting parameter for the control target deviation functional in the objective.
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.
Number lb_u_
overall lower bound on u
virtual Number d_cont_du(Number x1, Number x2, Number y, Number u) const =0
First partial derivative of forcing function w.r.t.
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.
Index y_index(Index i, Index j) const
Translation of mesh point indices to NLP variable indices for y(x_ij)
virtual Number d_cont_dydy(Number x1, Number x2, Number y, Number u) const =0
Second partial derivative of forcing function w.r.t.
Index u_index(Index i, Index j) const
Translation of mesh point indices to NLP variable indices for u(x_ij)
virtual Number y_d_cont(Number x1, Number x2) const =0
Target profile function for y.
virtual bool eval_grad_f(Index n, const Number *x, bool new_x, Number *grad_f)
Method to return the gradient of the objective.
virtual ~MittelmannDistCntrlDiriBase()
Default destructor.
virtual bool eval_g(Index n, const Number *x, bool new_x, Index m, Number *g)
Method to return the constraint residuals.
Index N_
Number of mesh points in one dimension (excluding boundary)
Number * y_d_
Array for the target profile for y.
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...
Number ub_u_
overall upper bound on u
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 eval_f(Index n, const Number *x, bool new_x, Number &obj_value)
Method to return the objective value.
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.
Number x2_grid(Index i) const
Compute the grid coordinate for given index in x2 direction.
virtual Number d_cont(Number x1, Number x2, Number y, Number u) const =0
Forcing function for the elliptic equation.
Number x1_grid(Index i) const
Compute the grid coordinate for given index in x1 direction.
Number lb_y_
overall lower bound on y
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...
Index pde_index(Index i, Index j) const
Translation of interior mesh point indices to the corresponding PDE constraint number.
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