1
+ classdef optimizer < handle
2
+ properties
3
+ count
4
+ end
5
+ methods
6
+ %% âû÷èñëÿåìàÿ ôóíêöèÿ
7
+ function y = f(this ,x )
8
+ this.count = this .count + 1 ;
9
+ % y = exp((x^4 + 2*x^3 - 5*x + 6) / 5) + cosh(1 / (-15*x^3 + 10*x + 5 * sqrt(10))) - 3.0;
10
+ y = sinh((3 * x ^ 4 - x + sqrt(17 ) - 3 ) / 2 ) + sin((5 ^(1 / 3 ) * x ^ 3 - 5 ^(1 / 3 ) * x + 1 - 2 * 5 ^(1 / 3 ))/(-x ^ 3 + x + 2 ));
11
+ end
12
+
13
+ %% ñáðîñ ñ÷åñò÷èêà âûçîâà ôóíêöèè
14
+ function reset(this )
15
+ this.count = 0 ;
16
+ end
17
+
18
+ %% ïîñòðîåíèå ãðàôèêà ôóíêöèè
19
+ function draw(this , a , b , n )
20
+ step = (b - a ) / n ;
21
+ x = a : step : b ;
22
+ y = zeros(n + 1 , 1 );
23
+
24
+ for i = 1 : n + 1
25
+ y(i ,1 ) = this .f(x(i ));
26
+ end
27
+
28
+ plot(x , y(: ,1 ));
29
+ end
30
+
31
+ %% ìåòîä ïîðàçðÿäíîãî ïîèñêà
32
+ function [x , y ] = RadixSearch(this , a , b , eps , k )
33
+ fprintf(' ==== Ìåòîä ïîðàçðÿäíîãî ïîèñêà ====\n Îòðåçîê: a=%f , b=%f\n Òî÷íîñòü: eps=%f ;\n k=%d\n ' , [a ,b ,eps ,k ]);
34
+ this .reset();
35
+ delta = (b - a ) / k ;
36
+ x = a ;
37
+ f0 = this .f(x );
38
+ fprintf(' Íà÷àëî ïîèñêà: delta=%.7f ; x=%.7f ; f(x)=%.7f\n ' , [delta ,x ,f0 ]);
39
+ while abs(delta ) > eps
40
+ while (x >= a ) && (x <= b )
41
+ x = x + delta ;
42
+ f1 = this .f(x );
43
+ fprintf(' f(%.7f )=%.7f\n ' , [x , f1 ]);
44
+
45
+ if f1 > f0
46
+ break ;
47
+ end
48
+
49
+ f0 = f1 ;
50
+ end
51
+ f0 = f1 ;
52
+ delta = - delta / k ;
53
+ fprintf(' Ìåíÿåì íàïðàâëåíèå ïîèñêà: delta=%.7f\n ' , delta );
54
+ end
55
+ disp(' Ïîèñê çàêîí÷åí: äîñòèãíóòà òðåáóåìàÿ òî÷íîñòü' );
56
+ y = f1 ;
57
+ fprintf(' xmin=%.7f\n f(xmin)=%.7f\n ' , [x ,y ])
58
+ fprintf(' Êîë-âî âûçîâîâ: %d\n ' , [this .count ])
59
+ end
60
+
61
+ %% ìåòîä çîëîòîãî ñå÷åíèÿ
62
+ function [x , y , res_a , res_b ] = GoldenSectionSearch(this , a , b , eps , stop )
63
+ if nargin < 5
64
+ stop = - 1 ;
65
+ end
66
+
67
+ fprintf(' ==== Ìåòîä çîëîòîãî ñå÷åíèÿ ====\n Îòðåçîê: a=%f , b=%f\n Òî÷íîñòü: eps=%f ;\n\t Êîë-âî èòåðàöèé: stop=%d .\n\n ' , [a ,b ,eps ,stop ]);
68
+ this .reset();
69
+ tau = (sqrt(5 ) - 1 ) / 2 ;
70
+ interval = b - a ;
71
+
72
+ x1 = a + (1 - tau ) * interval ;
73
+ x2 = a + tau * interval ;
74
+ f1 = this .f(x1 );
75
+ f2 = this .f(x2 );
76
+ exec_count = 0 ;
77
+ % fprintf('Íà÷àëî ïîèñêà:\n\tîòðåçîê: a=%.7f; b=%.7f;\n\tòî÷êè ðàçáèåíèÿ: f(%.7f)=%.7f; f(%.7f)=%.7f\n', [a, b, x1, f1, x2, f2]);
78
+ while (abs(interval ) > eps ) && (exec_count - stop ~= 0 )
79
+ fprintf(' -> Èòåðàöèÿ %d\n Èñõîäíûé îòðåçîê:\n\t a=%.7f ; b=%.7f ;\n\t òî÷êè ðàçáèåíèÿ: f(%.7f )=%.7f ; f(%.7f )=%.7f\n\n ' , [exec_count + 1 , a , b , x1 , f1 , x2 , f2 ]);
80
+ if f1 < f2
81
+ b = x2 ;
82
+ interval = b - a ;
83
+ x2 = x1 ;
84
+ x1 = a + (1 - tau ) * interval ;
85
+ f2 = f1 ;
86
+ f1 = this .f(x1 );
87
+ else
88
+ a = x1 ;
89
+ interval = b - a ;
90
+ x1 = x2 ;
91
+ x2 = a + tau * interval ;
92
+ f1 = f2 ;
93
+ f2 = this .f(x2 );
94
+ end
95
+ fprintf(' Íîâûé îòðåçîê:\n\t a=%.7f ; b=%.7f ;\n\t çíà÷åíèÿ ôóíêöèè: f(a)=%.7f ; f(b)=%.7f\n\n ' , [a , b , f1 , f2 ]);
96
+ exec_count = exec_count + 1 ;
97
+ end
98
+ disp(' Ïîèñê çàêîí÷åí: äîñòèãíóòà òðåáóåìàÿ òî÷íîñòü' );
99
+
100
+ if f1 < f2
101
+ x = x1 ;
102
+ y = f1 ;
103
+ else
104
+ x = x2 ;
105
+ y = f2 ;
106
+ end
107
+
108
+ fprintf(' xmin=%.7f\n f(xmin)=%.7f\n ' , [x ,y ])
109
+ fprintf(' Êîë-âî âûçîâîâ: %d\n ' , [this .count ])
110
+ res_a = a ;
111
+ res_b = b ;
112
+ fprintf(' =============\n\n ' )
113
+ end
114
+
115
+
116
+ %% Ìîäèôèöèðîâàííûé ìåòîä Íüþòîíà
117
+ function [x , y ] = Newton(this , a , b , eps , h )
118
+ fprintf(' ==== Ìîäèôèöèðîâàííûé ìåòîä Íüþòîíà ====\n Îòðåçîê: a=%f , b=%f\n Òî÷íîñòü: eps=%f ;\n ' , [a , b , eps ]);
119
+ this .reset();
120
+ x = a ;
121
+ while 1
122
+ f1 = this .f(x - h );
123
+ f2 = this .f(x + h );
124
+ f = this .f(x );
125
+ x_prev = x ;
126
+
127
+ p = h * (f2 - f1 ) / (2 * (f2 - 2 * f + f1 ));
128
+
129
+ % ìîäèôèöèðîâàííûé ìåòîä Íüþòîíà
130
+ alpha = 1 ;
131
+ x_new = x - alpha * p ;
132
+ while (x_new < a ) || (x_new > b )
133
+ alpha = alpha / 2 ;
134
+ x_new = x - alpha * p ;
135
+ end
136
+ x = x_new ;
137
+
138
+ if abs(x - x_prev ) <= eps
139
+ break
140
+ end
141
+ end
142
+ y = f ;
143
+ fprintf(' xmin=%.7f\n f(xmin)=%.7f\n ' , [x ,y ])
144
+ fprintf(' Êîë-âî âûçîâîâ: %d\n ' , [this .count ])
145
+ fprintf(' ==== êîíåö ====\n ' )
146
+ end
147
+
148
+ %%
149
+ function result = r(this ,x1 ,x2 )
150
+ result = x1 ^ 2 - x2 ^ 2 ;
151
+ end
152
+
153
+ %%
154
+ function result = s(this ,x1 ,x2 )
155
+ result = x1 - x2 ;
156
+ end
157
+
158
+ %% Ìåòîä ïàðàáîë
159
+ function [x , y ] = Parabola(this , a , b , eps , golden_stop )
160
+ if nargin < 5
161
+ % îòêëþ÷àåì âûïîëíåíèå ìåòîäà çîëîòîãî ñå÷åíèÿ
162
+ golden_stop = 0 ;
163
+ end
164
+ fprintf(' ==== Ìåòîä ïàðàáîë ====\n Îòðåçîê: a=%f , b=%f\n Òî÷íîñòü: eps=%f ;\n ' , [a , b , eps ]);
165
+ this .reset();
166
+ [xmin , fmin , a , b ] = this .GoldenSectionSearch(a , b , eps , golden_stop );
167
+
168
+ x = [a , a + b / 2 , b ];
169
+ f = [this .f(x(1 )), this .f(x(2 )), this .f(x(3 ))];
170
+
171
+ while abs(x(1 ) - x(3 )) > eps
172
+ x_dot = 0.5 * (...
173
+ f(1 ) * this .r(x(2 ), x(3 )) + ...
174
+ f(2 ) * this .r(x(3 ), x(1 )) + ...
175
+ f(3 ) * this .r(x(1 ), x(2 )) ...
176
+ ) / (...
177
+ f(1 ) * this .s(x(2 ), x(3 )) + ...
178
+ f(2 ) * this .s(x(3 ), x(1 )) + ...
179
+ f(3 ) * this .s(x(1 ), x(2 ))...
180
+ );
181
+ f_dot = this .f(x_dot );
182
+
183
+ if (x_dot >= x(2 )) && (x_dot <= x(3 ))
184
+ if f_dot <= f(2 )
185
+ x(1 ) = x(2 ); f(1 ) = this .f(x(1 ));
186
+ x(2 ) = x_dot ; f(2 ) = this .f(x(2 ));
187
+ else
188
+ x(3 ) = x_dot ; f(3 ) = this .f(x(3 ));
189
+ end
190
+ elseif (x_dot >= x(1 )) && (x_dot <= x(2 ))
191
+ if f_dot <= f(2 )
192
+ x(3 ) = x(2 ); f(3 ) = this .f(x(3 ));
193
+ x(2 ) = x_dot ; f(2 ) = this .f(x(2 ));
194
+ else
195
+ x(1 ) = x_dot ; f(1 ) = this .f(x(1 ));
196
+ end
197
+ else
198
+ disp(' Òî÷êà õ* íàéäåíà âíå îòðåçêà. Ïðèìåíÿåì ìåòîä çîëîòîãî ñå÷åíèÿ.' )
199
+ [xmin , fmin , a , b ] = this .GoldenSectionSearch(x(1 ), x(2 ), eps , golden_stop );
200
+ x = [a , a + b / 2 , b ];
201
+ f = [this .f(x(1 )), this .f(x(2 )), this .f(x(3 ))];
202
+ end
203
+ end
204
+
205
+ y = f_dot ;
206
+ x = x_dot ;
207
+ fprintf(' xmin=%.7f\n f(xmin)=%.7f\n ' , [x ,y ])
208
+ fprintf(' Êîë-âî âûçîâîâ: %d\n ' , [this .count ])
209
+ end
210
+ end
211
+ end
0 commit comments