31 #define CONV_CRIT 1e-12
38 virtual double gradient(
double t)
const = 0;
40 virtual double hessian(
double t)
const = 0;
48 Efunc(
double A,
double B,
double C,
double D,
double E,
double F,
double G,
double H,
double I=0)
63 const double cos = std::cos(t);
64 const double sin = std::sin(t);
65 const double cos2 = cos*cos;
66 const double sin2 = sin*sin;
67 const double cos4 = cos2*cos2;
68 const double sin4 = sin2*sin2;
69 const double cossin = cos*sin;
70 const double cos2sin2 = cos2*sin2;
71 const double cos3sin = cos2*cossin;
72 const double cossin3 = cossin*sin2;
74 return A*cos4+
B*sin4+
C*cos2+
D*sin2+2*(
E*cossin+
F*cos2sin2+2*(
G*cos3sin+
H*cossin3))+
I;
79 const double cos = std::cos(t);
80 const double sin = std::sin(t);
81 const double cos2 = cos*cos;
82 const double cos4 = cos2*cos2;
83 const double cossin = cos*sin;
84 const double cos3sin = cos2*cossin;
86 return 16*(
G-
H)*cos4-4*(
A+
B-2*
F)*cos3sin+4*(
E-3*
G+5*
H)*cos2+2*(2*
B-
C+
D-2*
F)*cossin-2*
E-4*
H;
91 const double cos = std::cos(t);
92 const double sin = std::sin(t);
93 const double cos2 = cos*cos;
94 const double cos4 = cos2*cos2;
95 const double cossin = cos*sin;
96 const double cos3sin = cos2*cossin;
98 return 16*(2*
F-
A-
B)*cos4+64*(
H-
G)*cos3sin+4*(3*
A+5*
B-
C+
D-8*
F)*cos2-8*(
E-3*
G+5*
H)*cossin-4*
B+2*
C-2*
D+4*
F;
103 const double cos = std::cos(t);
104 const double sin = std::sin(t);
105 const double cos2 = cos*cos;
106 const double cos4 = cos2*cos2;
107 const double cossin = cos*sin;
108 const double cos3sin = cos2*cossin;
110 return (16*(
G-
H)*cos4-4*(
A+
B-2*
F)*cos3sin+4*(
E-3*
G+5*
H)*cos2+2*(2*
B-
C+
D-2*
F)*cossin-2*
E-4*
H) /
111 (16*(2*
F-
A-
B)*cos4+64*(
H-
G)*cos3sin+4*(3*
A+5*
B-
C+
D-8*
F)*cos2-8*(
E-3*
G+5*
H)*cossin-4*
B+2*
C-2*
D+4*
F);
132 A = 0.125*(efunc.
A+efunc.
B)-0.25*efunc.
F;
133 B = 0.5*(efunc.
A-efunc.
B+efunc.
C-efunc.
D);
134 C = 0.5*(efunc.
G-efunc.
H);
135 D = efunc.
G+efunc.
H+efunc.
E;
136 E = efunc.
I + 0.375*(efunc.
A+efunc.
B)+0.25*efunc.
F+0.5*(efunc.
C+efunc.
D);
141 return A*std::cos(4*t)+
B*std::cos(2*t)+
C*std::sin(4*t)+
D*std::sin(2*t)+
E;
146 return -4*
A*std::sin(4*t)-2*
B*std::sin(2*t)+4*
C*std::cos(4*t)+2*
D*std::cos(2*t);
151 return -16*
A*std::cos(4*t)-4*
B*std::cos(2*t)-16*
C*std::sin(4*t)-4*
D*std::sin(2*t);
156 const double cos4t = std::cos(4*t);
157 const double cos2t = std::cos(2*t);
158 const double sin4t = std::sin(4*t);
159 const double sin2t = std::sin(2*t);
161 return (-2*
A*sin4t-
B*sin2t+2*
C*cos4t+
D*cos2t)/
162 (-8*
A*cos4t-2*
B*cos2t-8*
C*sin4t-2*
D*sin2t);
170 double theta = start_angle;
192 if(theta < 0 || theta > 2*M_PI || cur.
hessian(theta)<0 )
195 return std::make_pair(theta, status);
200 std::vector<double> minimums;
202 const int steps = 360;
203 const double stepsize = M_PI/180.0;
204 std::vector<double> points;
205 points.reserve(steps);
207 for(
int i=0;i<=steps;i++)
209 const double theta = stepsize*i;
213 points.push_back(cur_min.first);
216 std::sort(points.begin(), points.end());
218 minimums.push_back(points.front());
220 for(
auto i=1;i<points.size();i++)
221 if(fabs(points[i-1]-points[i]) >
CONV_CRIT)
222 minimums.push_back(points[i]);
229 std::cout.precision(15);
232 std::random_device rd;
236 std::mt19937_64 mt_A(rd());
237 std::mt19937_64 mt_B(rd());
238 std::mt19937_64 mt_C(rd());
239 std::mt19937_64 mt_D(rd());
240 std::mt19937_64 mt_E(rd());
241 std::mt19937_64 mt_F(rd());
242 std::mt19937_64 mt_G(rd());
243 std::mt19937_64 mt_H(rd());
245 std::uniform_real_distribution<double> distr(-1, 1);
247 std::cout << std::fixed;
248 std::cout << std::setw(20);
269 for(
unsigned long long i=0;i<10000;i++)
271 const double A = distr(mt_A);
272 const double B = distr(mt_B);
273 const double C = distr(mt_C);
274 const double D = distr(mt_D);
276 Efunc2 cur_sample(A,B,C,D);
280 std::cout << mins.size() <<
"\t" << i <<
"\t" << A <<
"\t" << B <<
"\t" << C <<
"\t" << D << std::endl;
double gradient(double t) const
double hessian(double t) const
Efunc(double A, double B, double C, double D, double E, double F, double G, double H, double I=0)
double operator()(double t) const
double graddivhessian(double t) const
double gradient(double t) const
virtual double graddivhessian(double t) const =0
double operator()(double t) const
virtual double hessian(double t) const =0
virtual double gradient(double t) const =0
std::pair< double, bool > find_min_angle(double start_angle, const func &cur)
virtual double operator()(double t) const =0
Efunc2(const Efunc &efunc)
std::vector< double > scan_mins(const func &cur)
double hessian(double t) const
Efunc2(double A, double B, double C, double D, double E=0)
double graddivhessian(double t) const