KASKADE 7 development version
elementary_functions.hh
Go to the documentation of this file.
1#ifndef ELEMENTARY_FUNCTIONS_HH
2#define ELEMENTARY_FUNCTIONS_HH
3
4#include <cmath>
5#include <limits>
6
7namespace Kaskade
8{
10 template <class Base>
11 class PenaltyFunction : public Base
12 {
13 public:
14 template <typename... Args>
15 PenaltyFunction(const Args&... args) : Base(args...){}
16
19
20 double d0(double const& x) const
21 {
22 if(x < 1e-16) std::cout << "negative value x in penalty function d0: " << x << std::endl;
23 if(x < 1e-16) return std::numeric_limits<double>::max();
24 else return Base::d0(x);
25 }
26 double d1(double const& x) const
27 {
28 if(x < 1e-16) std::cout << "negative value x in penalty function d1: " << x << std::endl;
29 if(x < 1e-16) return std::numeric_limits<double>::max();
30 else return Base::d1(x);
31 }
32 double d2(double const& x) const
33 {
34 if(x < 1e-16) std::cout << "negative value x in penalty function d2: " << x << std::endl;
35 if(x < 1e-16) return std::numeric_limits<double>::max();
36 else return Base::d2(x);
37 }
38 double d3(double const& x) const
39 {
40 if(x < 1e-16) std::cout << "negative value x in penalty function d3: " << x << std::endl;
41 if(x < 1e-16) return std::numeric_limits<double>::max();
42 else return Base::d3(x);
43 }
44 };
45
47 template <int k>
48 class Monomial{
49 public:
50 enum{ K=k };
52
55 explicit Monomial(double const a_=1.0) : a(a_)
56 {
57#ifdef TESTOUTPUT
58 std::cout << "Created monomial of order " << k << std::endl;
59#endif
60 }
61
63
66 double d0(double const x) const
67 {
68 return a*pow(x,k);
69 }
70
72
75 double d1(double const x) const
76 {
77 return a*k*pow(x,k-1);
78 }
79
81
84 double d2(double const x) const
85 {
86 return a*k*(k-1)*pow(x,k-2);
87 }
88
90
93 double d3(double const x) const
94 {
95 return a*k*(k-1)*(k-2)*pow(x,k-3);
96 }
97
99 void setA(double const a_) { a=a_; }
100
101 private:
102 double a;
103 };
104
106
108 class LN{
109 public:
111
114 explicit LN(double const a_=1.0) :
115 a(a_)
116 {
117#ifdef TESTOUTPUT
118 std::cout << "Created natural logarithm" << std::endl;
119#endif
120 }
121
123
126 double d0(double const x) const
127 {
128 if(x<0) std::cout << "Warning: negative argument for log" << std::endl;
129 return a*log(x);
130 }
131
133
136 double d1(double const x) const
137 {
138 if(x<0) std::cout << "Warning: negative argument for a/x" << std::endl;
139 return a/x;
140 }
141
143
146 double d2(double const x) const
147 {
148 return -a/(x*x);
149 }
150
152
155 double d3(double const x) const
156 {
157 return 2.0*a/(x*x*x);
158 }
159
161 void setA(double const a_) { a=a_; }
162
163 private:
164 double a;
165 };
166
168
170 class Exp
171 {
172 public:
174
178 explicit Exp(double a_=1.0) : a(a_){}
179
181
184 double d0(double x) const
185 {
186 return a*exp(x);
187 }
188
190
193 double d1(double x) const
194 {
195 return a*exp(x);
196 }
197
199
202 double d2(double x) const
203 {
204 return a*exp(x);
205 }
206
208
211 double d3(double x) const
212 {
213 return a*exp(x);
214 }
215
217 void setA(double a_) { a=a_; }
218
219 private:
220 double a;
221 };
222
223 class Sqrt
224 {
225 public:
226
227 double d0(double x) const noexcept
228 {
229 return sqrt(x);
230 }
231
232 double d1(double x) const noexcept
233 {
234 return 1./(2*sqrt(x));
235 }
236
237 double d2(double x) const noexcept
238 {
239 return -1./(4*pow(x,1.5));
240 }
241
242 double d3(double x) const noexcept
243 {
244 return 3./(8*pow(x,2.5));
245 }
246
247 private:
248 };
249}
250
251#endif // ELEMENTARY_FUNCTIONS_HH
Exponential function of the form a*exp(b*x)
double d1(double x) const
First derivative.
Exp(double a_=1.0)
Constructor.
void setA(double a_)
Set a.
double d3(double x) const
Third derivative.
double d2(double x) const
Second derivative.
double d0(double x) const
Function value.
Natural logarithm of the form a*\ln(x)
double d1(double const x) const
First derivative.
LN(double const a_=1.0)
Constructor.
double d3(double const x) const
Third derivative.
void setA(double const a_)
Set a.
double d2(double const x) const
Second derivative.
double d0(double const x) const
Function value.
Monomial a*x^k of order k.
double d3(double const x) const
Third derivative.
void setA(double const a_)
Set a.
double d2(double const x) const
Second derivative.
double d0(double const x) const
Function value.
double d1(double const x) const
First derivative.
Monomial(double const a_=1.0)
Constructor.
Sets a function to std::numeric_limits<double>::max() for negative arguments.
PenaltyFunction & operator=(PenaltyFunction const &)=default
double d1(double const &x) const
double d2(double const &x) const
PenaltyFunction(const Args &... args)
PenaltyFunction(PenaltyFunction const &)=default
double d3(double const &x) const
double d0(double const &x) const
double d2(double x) const noexcept
double d3(double x) const noexcept
double d1(double x) const noexcept
double d0(double x) const noexcept
Dune::FieldVector< T, n > max(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise maximum.
Definition: fixdune.hh:110
Functional::Scalar d1(Assembler &assembler, Functional const &f, typename Functional::AnsatzVars::VariableSet &x, typename Functional::Scalar tolerance=1e-6, typename Functional::Scalar increment=1e-12, bool toFile=false, std::string const &filename=std::string("d1error"))
Functional::Scalar d2(Assembler &assembler, Functional const &f, typename Functional::AnsatzVars::VariableSet const &x, typename Functional::Scalar increment=1e-12, typename Functional::Scalar tolerance=1e-6, bool toFile=false, std::string const &savefilename=std::string("d2error"))
PenaltyFunction< LN > PenaltyLN