0

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):

PerfilColunaImpressoPelas relaçõesConferência
MC 100Zx33,538,4Ix / (D/2) = 192 / 5,0
MC 175 (pesado)massa22,721,70,785 × 27,6
MC 250ry2,372,33√(211 / 39,0)
ISA 35×35×6Iu5,56,4menor até que o da cantoneira de 5 mm (5,6)
ISA 65×65×4Ix, Iu21,70; 34,5020,2; 32,0a linha incluída pela emenda

Na IS 808:2021:

PerfilColunaImpressoCorretoObservação
MC 75rz39,4 mm29,4 mm√(78,2×10⁴ / 908); a edição de 1989 trazia 2,94 cm
MC 175*massa22,721,40,785 × 27,3 — o mesmo 22,7 de 1989
toda ISA ≥ 100 mmrv×10ex.: 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çãoEspessura da mesaÁreaMassa
Manual SP 6(1):196410,8 mm32,33 cm²25,4 kg/m
IS 808:198910,0 mm30,8 cm²24,2 kg/m
IS 808:202110,0 mm30,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.

Carregando publicação patrocinada...