Introdução ao Simulador de Colchão
Eu já tive um colchão de fio contínuo que me deixava muito confortável. Depois troquei por um de molas ensacadas, que cede muito mais. A pergunta que ficou foi: o que muda por dentro? E dá para deixar um colchão de molas ensacadas mais firme só ligando as molas?

Em vez de abrir o colchão, escrevi um simulador. Ele está no ar e é gratuito: Trama MX-21 . Aqui conto como ele funciona, o que descobri e uma decisão de arquitetura que talvez interesse a quem publica código pesado na web.
Como o Colchão de Molas Ensacadas Funciona Internamente
Um colchão casal brasileiro (138 × 188 cm) tem umas 609 molas, numa grade de 21 × 29. Cada mola é tratada como um nó com três graus de liberdade: w, gx e gy. A rigidez vem de fórmula de livro, com aço de mola (E = 206 GPa, G = 79,3 GPa):
- Axial: k = G·d⁴ / (8·D³·n) . Para fio de 1,8 mm, diâmetro de 55 mm e 5 espiras, dá 0,125 N/mm por mola;
- Inclinação: kθ = 2·E·I / (π·D·n·(1 + E/2G)) , a rigidez à flexão de uma mola helicoidal (Timoshenko).
Entre as molas entra o que liga uma à outra:
- Haste de aço: viga de Euler-Bernoulli, com flexão e torção;
- Arame helicoidal: uma articulação que só transmite força vertical;
- Tecido do bolso: uma mola fraca entre vizinhas, sempre presente.
Com o pillow (a camada de espuma por cima), cada nó ganha mais três graus de liberdade para o topo da espuma. Ele é modelado como colunas de espuma (E = tensão a 40% ÷ 0,4) com cisalhamento entre colunas vizinhas. Usei valores típicos de D30, D45 e látex.
Resolução do Sistema de Equações
Isso vira um sistema K·u = f com 1.827 incógnitas (3.654 com pillow). A carga do corpo vem das tabelas antropométricas de Dempster e Winter: cabeça 8,1% da massa, tronco 27%, pelve, coxas e assim por diante, cada segmento espalhado na superfície.
Dois detalhes não lineares importam:
- Fim de curso: perto de 110 mm de compressão as espiras começam a encostar e a mola endurece de forma progressiva.
- Bolso não estica: a mola não pode subir acima da altura do bolso.
Isso se resolve com Newton, usando uma tangente diagonal e refatorando a matriz a cada iteração.
Porte para Go e um Truque de Cache
A matriz é simétrica e em banda: cada mola só conversa com as vizinhas, então a meia-banda é 3 × (21 + 2) = 69 . Uso Cholesky em banda, guardando só o triângulo superior.
A primeira versão (em JavaScript) fazia o produto interno clássico, com a soma em k percorrendo a memória com passo B+1 . Na hora de portar para Go, troquei pela forma right-looking : depois de fechar a linha i , ela atualiza as linhas seguintes, e o laço interno fica contíguo na memória .
O número de operações é o mesmo, mas o cache agradece. Para conferir o porte, gerei saídas de referência com o motor JS original e escrevi um teste em Go que exige igualdade até 1e-6 em 13 configurações. Passou. Medindo a mesma configuração nos dois, o Go ficou 2 a 3× mais rápido (37 ms contra 105 ms sem pillow; 0,22 s contra 0,5 s com pillow).
Servidor, WebAssembly ou JavaScript
O simulador nasceu em JavaScript, num Web Worker. Para publicar, eu não queria entregar o modelo inteiro de bandeja para quem abrisse o DevTools. Avaliei três opções com números:
- O WASM do Go padrão quase empatou com o JS do V8 e ainda custa 2 MB. Ele faz sentido quando o cálculo precisa sair do servidor, e aqui não precisa: o Go nativo resolve o comparativo dos 15 padrões em 0,3 s (0,9 s com pillow e placas). E o WASM continua entregando o modelo; só fica mais chato de ler. Fiquei com o servidor:
- GET /api/colchao/simular?p=cfechado&d=1.8&kg=80... responde em NDJSON , uma linha por mensagem. Primeiro chega o campo de deslocamentos da configuração atual, depois um padrão do comparativo por vez. O front lê com fetch + ReadableStream e o gráfico vai se preenchendo.
As entradas são quantizadas nos passos dos controles . Assim o espaço de configurações é finito e o cache LRU acerta muito.
Simulação por IP e AbortController
Uma simulação por IP: a requisição nova cancela a anterior via context . Arrastar um slider não enfileira 40 cálculos. No front, um debounce de 120 ms e um AbortController fazem o resto.
Um semáforo limita os cálculos simultâneos à metade dos núcleos, e há um teto de requisições por minuto por IP.
O navegador fica só com three.js, a animação e um arquivinho de rótulos.
Calibração do Modelo
Para virar ferramenta de engenharia, o modelo precisa ser calibrado contra ensaios reais: indentação (ILD), firmeza pela ASTM F1566 e mapa de pressão.
Se você trabalha com colchões, espuma ou ensaio de materiais e tem medições, eu adoraria comparar. E se você dorme mal, pelo menos agora dá para culpar a gangorra.