KASKADE 7 development version
opt_model_functions.hh
Go to the documentation of this file.
1#ifndef OPT_MODEL_FUNCTIONS_HH
2#define OPT_MODEL_FUNCTIONS_HH
3
4#include <cmath>
5#include <memory>
6
7#include "dune/common/fvector.hh"
8#include "dune/istl/bvector.hh"
9#include "dune/istl/matrix.hh"
10
11namespace Kaskade
12{
13 namespace OPT_MODEL_FUNCTIONS_Detail
14 {
15 template <class FieldType>
17 {
19 y *= 0;
20 for(typename Dune::Matrix<FieldType>::size_type j=0; j<A.M(); ++j)
21 for(typename Dune::Matrix<FieldType>::size_type i=0; i<A.N(); ++i)
22 y[i] += A[i][j]*x[j];
23 return y;
24 }
25
26 template <class FieldType>
27 inline Dune::BlockVector<FieldType> operator*(typename FieldType::value_type const& alpha, Dune::BlockVector<FieldType> const& x)
28 {
30 y *= alpha;
31 return y;
32 }
33
34 template <class FieldType>
36 {
38 z += y;
39 return z;
40 }
41 }
42
44 class QuadraticFunction
45 {
46 public:
48
49 QuadraticFunction(double constantPart_, Dune::BlockVector<FieldType> linearPart_, Dune::Matrix<FieldType> quadraticPart_)
50 : constantPart(constantPart_), linearPart(linearPart_), quadraticPart(quadraticPart_)
51 {}
52
54
55 double d0(std::vector<double> const& argument) const
56 {
57 using namespace OPT_MODEL_FUNCTIONS_Detail;
58 Dune::BlockVector<FieldType> arg(argument.size());
59 for(int i=0; i<argument.size(); ++i) arg[i]=argument[i];
61 return constantPart+linearPart*arg+arg*tmp;
62 }
63
64 Dune::BlockVector<FieldType> d1(std::vector<double> const& argument) const
65 {
66 using namespace OPT_MODEL_FUNCTIONS_Detail;
67 Dune::BlockVector<FieldType> arg(argument.size());
68 for(int i=0; i<argument.size(); ++i) arg[i]=argument[i];
69 return linearPart+2.0*(quadraticPart*arg);
70 }
71
72 private:
73 FieldType constantPart;
75 public:
77 };
78
80 {
81 public:
83
84 CubicModelFunction(QuadraticFunction quadraticModel_, QuadraticFunction normBlf_, double omegaL_):
85 omegaL(omegaL_), quadraticModel(quadraticModel_), normBlf(normBlf_), regWeight(0)
86 {}
87
88 CubicModelFunction(QuadraticFunction quadraticModel_, QuadraticFunction normBlf_, double omegaL_, double regWeight_)
89 : omegaL(omegaL_), quadraticModel(quadraticModel_), normBlf(normBlf_), regWeight(regWeight_)
90 {}
91
92 double evalQuadraticModel(std::vector<double>const & iterate) const
93 {
94 return quadraticModel.d0(iterate);
95 }
96
97 double d0(std::vector<double> const & iterate) const
98 {
99 return quadraticModel.d0(iterate)+omegaL/6*pow(normBlf.d0(iterate),1.5);
100 }
101
102 std::vector<double> d1(std::vector<double>const & iterate) const
103 {
104 using namespace OPT_MODEL_FUNCTIONS_Detail;
105 Dune::BlockVector<FieldType> v = quadraticModel.d1(iterate)+omegaL/4*pow(normBlf.d0(iterate),0.5)*normBlf.d1(iterate);
106 std::vector<double> w(v.size());
107 for(int i=0; i<w.size(); ++i) w[i]=v[i][0];
108 return w;
109 }
110
111 private:
112 double omegaL;
113 QuadraticFunction quadraticModel, normBlf;
114 double regWeight;
115 };
116
117 class CubicModel1dForFmin
118 {
119 public:
121
122 double operator()(double tau)
123 {
124 std::vector<double> iterate(1);
125 iterate[0]=tau;
126 return cb.d0(iterate);
127 }
128
129 private:
130 CubicModelFunction const& cb;
131 };
132
133 class ContractionModelFunction
134 {
135 public:
137
139 omegaC(omegaC_), normBlf(normBlf_)
140 {}
141
142 double d0(std::vector<double>const & iterate) const
143 {
144
145 return omegaC/2*pow(normBlf.d0(iterate),0.5);
146 }
147
148 std::vector<double> d1(std::vector<double>const & iterate) const
149 {
150 using namespace OPT_MODEL_FUNCTIONS_Detail;
151 Dune::BlockVector<FieldType> v = omegaC/4*pow(normBlf.d0(iterate),-0.5)*normBlf.d1(iterate);
152 std::vector<double> w(v.size());
153 for(int i=0; i<w.size(); ++i) w[i]=v[i][0];
154 return w;
155 }
156
157 private:
158 double omegaC;
159 QuadraticFunction normBlf;
160 };
161
162} // namespace Kaskade
163#endif
164
165
virtual double d0(std::vector< double > const &) const =0
double d0(std::vector< double >const &iterate) const
ContractionModelFunction(QuadraticFunction normBlf_, double omegaC_)
Dune::FieldVector< double, 1 > FieldType
std::vector< double > d1(std::vector< double >const &iterate) const
CubicModel1dForFmin(CubicModelFunction const &cb_)
CubicModelFunction(QuadraticFunction quadraticModel_, QuadraticFunction normBlf_, double omegaL_, double regWeight_)
std::vector< double > d1(std::vector< double >const &iterate) const
double d0(std::vector< double > const &iterate) const
double evalQuadraticModel(std::vector< double >const &iterate) const
Dune::FieldVector< double, 1 > FieldType
CubicModelFunction(QuadraticFunction quadraticModel_, QuadraticFunction normBlf_, double omegaL_)
TODO !!!!! Entscheidung über Vektortyp !!!!!!
Dune::FieldVector< double, 1 > FieldType
std::vector< double > d1(std::vector< double > const &argument) const
Dune::Matrix< FieldType > quadraticPart
QuadraticFunction(double constantPart_, Dune::BlockVector< FieldType > linearPart_, Dune::Matrix< FieldType > quadraticPart_)
double d0(std::vector< double > const &argument) const
Dune::BlockVector< FieldType > d1(std::vector< double > const &argument) const
QuadraticFunction(QuadraticFunction const &)=default
Dune::BlockVector< FieldType > operator+(Dune::BlockVector< FieldType > const &x, Dune::BlockVector< FieldType > const &y)
Dune::BlockVector< FieldType > operator*(Dune::Matrix< FieldType > const &A, Dune::BlockVector< FieldType > const &x)