Três equações que encontraram erros de impressão numa norma técnica de aço (com Python)
Eu precisava de dados limpos de perfis de aço (vigas I, perfis U e cantoneiras): peso por metro, dimensões e propriedades da seção. Para os perfis indianos, a fonte é a norma nacional IS 808, publicada pela Public.Resource.Org. A edição de 2021 é um PDF digital; a de 1989 e o manual de 1964 (SP 6(1)) são digitalizações.
Transcrever tabelas é fácil. O difícil é saber se a transcrição — e a própria tabela impressa — está certa. E aí as tabelas de perfis têm uma propriedade ótima: as colunas não são independentes. Algumas relações físicas amarram umas às outras, então cada linha consegue se conferir sozinha.
As três relações
1. A massa vem da área. O aço tem 7850 kg/m³. Um metro de um perfil com área A cm² tem volume A × 10⁻⁴ m³, então:
massa (kg/m) = 0,785 × A (cm²)
2. O raio de giração vem da inércia e da área.
r = sqrt(I / A)
3. O módulo resistente elástico vem da inércia e da altura (vigas duplamente simétricas, eixo forte):
Wx = Ix / (D / 2)
Isso basta para conferir quase todas as colunas de quase todas as linhas. Em Python, o núcleo tem uma dúzia de linhas:
import math
TOL = 0.02 # as tabelas imprimem 3 a 4 algarismos significativos
def close(printed, derived, tol=TOL):
# valores pequenos vêm arredondados a 0,1: aceita também uma folga absoluta
return abs(printed - derived) <= tol * abs(derived) + 0.06
def check(row):
problems = []
if not close(row["M"], 0.785 * row["A"]):
problems.append(("M", row["M"], round(0.785 * row["A"], 2)))
for r, i in (("rx", "Ix"), ("ry", "Iy")):
derived = math.sqrt(row[i] / row["A"])
if not close(row[r], derived):
problems.append((r, row[r], round(derived, 2)))
if row.get("D") and not close(row["Zx"], row["Ix"] / (row["D"] / 20)): # D em mm, Z em cm³
problems.append(("Zx", row["Zx"], round(row["Ix"] / (row["D"] / 20), 1)))
return problems
Rodando em todas as linhas, o que aparece é ou erro meu de transcrição, ou erro de impressão da norma. Corrigi os meus; o resto foi para um errata.csv ao lado dos dados de origem. Os CSVs de origem guardam o valor impresso e o build aplica a correção — assim qualquer um pode auditar.
O que apareceu
Na IS 808:1989 (com a emenda de 1992):
| Perfil | Coluna | Impresso | Pelas relações | Conferência |
|---|---|---|---|---|
| MC 100 | Zx | 33,5 | 38,4 | Ix / (D/2) = 192 / 5,0 |
| MC 175 (pesado) | massa | 22,7 | 21,7 | 0,785 × 27,6 |
| MC 250 | ry | 2,37 | 2,33 | √(211 / 39,0) |
| ISA 35×35×6 | Iu | 5,5 | 6,4 | menor até que o da cantoneira de 5 mm (5,6) |
| ISA 65×65×4 | Ix, Iu | 21,70; 34,50 | 20,2; 32,0 | a linha incluída pela emenda |
Na IS 808:2021:
| Perfil | Coluna | Impresso | Correto | Observação |
|---|---|---|---|---|
| MC 75 | rz | 39,4 mm | 29,4 mm | √(78,2×10⁴ / 908); a edição de 1989 trazia 2,94 cm |
| MC 175* | massa | 22,7 | 21,4 | 0,785 × 27,3 — o mesmo 22,7 de 1989 |
| toda ISA ≥ 100 mm | rv | ×10 | ex.: 200,0 impresso onde √(Iv / A) dá 20,0 mm |
O meu favorito é o MC 175: uma massa que não bate com a própria área, copiada da tabela de 1989 para a de 2021, 32 anos depois.
Base grande também não está imune. O AISC Shapes Database (a planilha de referência americana) tem colunas métricas e imperiais lado a lado; comparando linha por linha, apareceu uma célula — o perímetro do S24×90 — com um zero a mais (18400 mm em vez de 1840).
O valor de 1964 que todo mundo ainda usa
As relações também explicaram uma confusão antiga. Procure o peso da ISMB 200 e a maioria das tabelas diz 25,4 kg/m; algumas dizem 24,2 kg/m. As duas estão "certas":
| Edição | Espessura da mesa | Área | Massa |
|---|---|---|---|
| Manual SP 6(1):1964 | 10,8 mm | 32,33 cm² | 25,4 kg/m |
| IS 808:1989 | 10,0 mm | 30,8 cm² | 24,2 kg/m |
| IS 808:2021 | 10,0 mm | 30,8 cm² | 24,17 kg/m |
A revisão de 1989 afinou a mesa. Tabelas copiadas do manual antigo nunca foram atualizadas, então uma viga de 12 m é orçada 15 kg mais pesada do que a que sai da laminação hoje. O mesmo aconteceu com a ISMB 100 (11,5 → 8,9 kg/m) e a ISMB 300 (44,2 → 46,0 kg/m — dessa vez ficou mais pesada).
Lições para qualquer dataset de engenharia
- Procure redundância. Tabelas de engenharia quase sempre têm colunas derivadas. Recalcule em vez de confiar; divergência é sinal.
- Guarde o valor impresso. Coloque as correções num arquivo à parte (
errata.csv, com o motivo e a conta) em vez de editar a fonte. - Confronte duas fontes quando existirem: duas bibliotecas abertas para os perfis europeus, colunas métricas vs. imperiais no AISC.
- Edições antigas importam. Se o usuário cita um número que não bate com a norma vigente, quase sempre a culpa é da edição anterior — e mostrar as duas ajuda mais do que escolher uma em silêncio.
Os dados limpos também viraram um pacote Python (pip install steel-sections; steel_sections.get("ISMB 200").mass_1964_kg_m devolve o valor antigo). A tabela com as três edições lado a lado e uma calculadora de peso estão no link da fonte abaixo.