Skip to content

Commit 4c4d716

Browse files
committed
Labs 1-4 source codes were added
1 parent f77e7e5 commit 4c4d716

File tree

4 files changed

+245
-0
lines changed

4 files changed

+245
-0
lines changed

.gitignore

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
*.pyc
2+
*.swp
3+
*.asv
4+
*~
5+
*.db
6+
.idea/
7+
*.aux
8+
*.toc
9+
*.out
10+
*.log
11+
*.gz
12+
*.blg
13+
*.bbl
14+
rpz/.deps/
15+
rpz/tex/rpz.pdf
16+
rpz/tex/inc/
17+

lab01_04/Lab1_4 (1).pdf

105 KB
Binary file not shown.

lab01_04/source/launcher.m

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
clear;
2+
clc;
3+
4+
optimizer = optimizer();
5+
6+
a = 0.0;
7+
b = 1.0;
8+
9+
eps1 = 0.01;
10+
eps2 = 0.0001;
11+
eps3 = 0.000001;
12+
13+
optimizer.draw(a, b, 1000);
14+
%[result, value] = optimizer.RadixSearch(a, b, eps3, 4);
15+
%[result, value, res_a, res_b] = optimizer.GoldenSectionSearch(a, b, eps3, 0);
16+
%[result, value] = optimizer.Newton(a, b, eps3, 1e-5);
17+
[result, value] = optimizer.Parabola(a, b, eps3, 5);

lab01_04/source/optimizer.m

+211
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
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;\nk=%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\nf(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\ta=%.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\ta=%.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\nf(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\nf(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\nf(xmin)=%.7f\n', [x,y])
208+
fprintf('Êîë-âî âûçîâîâ: %d\n', [this.count])
209+
end
210+
end
211+
end

0 commit comments

Comments
 (0)