-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
89 lines (70 loc) · 2.02 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import math
def func_task(x):
return 2 * math.pow(x, 2) - math.exp(x)
# Поиск последовательности Фибоначчи
def fib(input_num, show=0):
n = int(input_num)
fb = [1, 1]
for k in range(2, n):
fb.append(fb[k - 2] + fb[k - 1])
if show == 1:
print('Последовательность Фибоначчи', '[', input_num, ']', ': ', fb)
else:
return fb[input_num-1]
def fibonacci(a, b, eps, N):
print("Поиск методом Фибоначчи")
print('a =', a, '; b =', b, '; eps =', eps, '; N =', N)
a0 = a
b0 = b
k = 0
y0 = a0+((fib(N-2)/fib(N))*(b0-a0))
z0 = a0+((fib(N-1)/fib(N))*(b0-a0))
while abs(b0 - a0) > eps:
if func_task(y0) > func_task(z0):
a0 = y0
y0 = z0
z0 = a0+((fib(N-k-2)/fib(N-k-1))*(b0-a0))
else:
b0=z0
z0=y0
y0=a0+((fib(N-k-3)/fib(N-k-1))*(b0-a0))
if ++k > 10e5:
break
return (a0 + b0) / 2
def gold(a, b, eps):
print("Повысим точность")
g = (math.sqrt(5) - 1.0) / 2
k = 0
a1 = a + (1 - g) * (b - a)
b1 = a + g * (b - a)
while abs(b - a) > eps:
if func_task(a1) > func_task(b1):
a = a1
a1 = b1
b1 = a + g * (b - a)
else:
b = b1
b1 = a1
a1 = a + (1 - g) * (b - a)
if ++k > 10e5:
break
return (a + b) / 2
if __name__ == '__main__':
#print('f(x) = ', func_task(0.357403))
print('e = ', math.e)
a = 0
b = 1
N = 20
eps = 0.000001
x = fibonacci(a, b, eps, N)
fx = func_task(x)
fib(N, 1)
print('x =', x)
print('f(x) = ', fx)
#print('Округлим значение')
#print('x =', round(x, 6))
#print('f(x) =', round(fx, 6))
x = gold(a, b, eps)
fx = func_task(x)
print('x =', x)
print('f(x) = ', fx)