-
Notifications
You must be signed in to change notification settings - Fork 0
/
dobras.py
151 lines (122 loc) · 4.13 KB
/
dobras.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pdb
from mpl_toolkits.mplot3d import Axes3D
import concurrent.futures
def dimension_sweep(m, n, i_max, c, l, espessura):
e = espessura.copy()
i = calculate_foldings(i_max, c[:,m], l[:,n], e)
current_results = np.array([c[0, m], l[0, n], e[i], i]).T
return current_results
def calculate_foldings(i_max, c, l, e):
for i in range(i_max-1):
if c[i] > l[i]:
c[i+1] = c[i]/2 - e[i]
l[i+1] = l[i]
else:
c[i+1] = c[i]
l[i+1] = l[i]/2 - e[i]
if any([value < 0 for value in [c[i+1], l[i+1]]]):
return i
e[i+1] = 2*e[i]
return 0
i_max = 50
## Cálculo para A4
c = np.zeros(i_max)
l = np.zeros(i_max)
e = np.zeros(i_max)
c[0] = 297
l[0] = 210
e[0] = 0.1
result = calculate_foldings(i_max, c, l, e)
# Plot A4
plt.figure()
plt.grid(True)
plt.plot(c[:result+2], label='Comprimento')
plt.plot(l[:result+2], label='Largura')
plt.plot(e[:result+2], label='Espessura')
plt.axvline(x=result, color='r', linestyle='--', label='Iteração final')
plt.title('Dimensões do papel em função do número de dobras')
plt.legend()
plt.figure()
plt.grid(True)
plt.plot(e[:result+2], label='Espessura')
plt.axvline(x=result, color='r', linestyle='--', label='Iteração final')
plt.title('Espessura do papel em função do número de dobras')
plt.legend()
# plt.show()
## Cálculo para encontrar tamanho do papel que chega na lua
# Vetores
columns = ['c', 'l', 'e', 'i']
q = 1.075
c0 = 0.297*(2**42)
l0 = 0.210*(2**42)
e0 = 0.0001
n_termos = 100
pg_c = np.geomspace(c0, c0 * q**(n_termos-1), n_termos)
pg_l = np.geomspace(l0, l0 * q**(n_termos-1), n_termos)
c = np.zeros([i_max, n_termos])
c[0,:] = pg_c
l = np.zeros([i_max, n_termos])
l[0,:] = pg_l
e = np.zeros(i_max)
e[0] = e0
threads_results = []
with concurrent.futures.ThreadPoolExecutor() as executor:
for m, comprimento in enumerate(c[0,:]):
threads_results.append(executor.submit(dimension_sweep, m, m, i_max, c, l, e))
executor.shutdown()
concurrent.futures.wait(threads_results)
final_results = [r.result() for r in threads_results]
results = pd.DataFrame([r.result() for r in threads_results], columns=columns)
distancia_terra_lua_em_metros = 384400000
# Plotagem
fig, ax1 = plt.subplots()
ax1.plot(results.index, results['e'], label='Espessura', color='r')
ax1.set_xlabel(f'Expoente da razão {q}: 2^42 * {q}^x')
ax1.set_ylabel('Espessura')
ax1.tick_params(axis='y')
ax1.axhline(y=distancia_terra_lua_em_metros, color='r', linestyle='--', label='Distância Terra-Lua')
ax1.legend(loc='upper left')
ax2 = ax1.twinx()
ax2.plot(results.index, results['i'], color='b', label='Número de dobras')
ax2.set_ylabel('Número de dobras')
ax2.tick_params(axis='y')
ax2.legend(loc='lower right')
plt.title('Tamanhos do papel que chega na lua em função do número de dobras')
fig.tight_layout()
plt.grid(True)
# plt.show()
## Cálculo para varredura de dimensões
step = 20
max_size = 10000
c_max = max_size + step
l_max = max_size + step
# Vetores
c = np.zeros([i_max, round(c_max/step)])
c[0,:] = np.arange(0, c_max, step)
l = np.zeros([i_max, round(c_max/step)])
l[0,:] = np.arange(0, l_max, step)
e = np.zeros(i_max)
e[0] = e0
threads_results = []
with concurrent.futures.ThreadPoolExecutor() as executor:
for m, comprimento in enumerate(c[0,:]):
for n, largura in enumerate(l[0,:]):
threads_results.append(executor.submit(dimension_sweep, m, n, i_max, c, l, e))
executor.shutdown()
concurrent.futures.wait(threads_results)
final_results = [r.result() for r in threads_results]
results = pd.DataFrame([r.result() for r in threads_results], columns=columns)
# Plotagem
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y = np.meshgrid(results['c'].unique(), results['l'].unique())
Z = results.pivot(index='c', columns='l', values='i').values
ax.plot_surface([x/10 for x in X], [y/10 for y in Y], Z, cmap='viridis')
ax.set_xlabel('Comprimento (cm)')
ax.set_ylabel('Largura (cm)')
ax.set_zlabel('Número de dobras')
ax.set_title('Número de dobras possíveis em função das dimensões do papel')
plt.show()