Pular para o conteúdo

Motor Matemático (Math Engine)

O @calibra-facil/math-engine é o núcleo de processamento metrológico da plataforma. Ele foi projetado para garantir cálculos de incerteza rigorosos, determinísticos e auditáveis, em estrita conformidade com o GUM (JCGM 100:2008) e a norma ISO/IEC 17025:2017.

Este documento detalha a arquitetura, as decisões de design e as fórmulas matemáticas implementadas, permitindo que gerentes técnicos e auditores validem a integridade dos cálculos realizados pela plataforma.


Ao desenvolvermos o motor matemático, priorizamos três pilares fundamentais exigidos em ambientes regulados:

  1. Segurança e Determinismo: O motor não utiliza funções inseguras como eval() ou Function(). A execução é isolada e “pura” — os mesmos dados de entrada produzirão sempre o mesmo resultado de saída.

  2. Precisão Numérica: Resolvemos os problemas clássicos de ponto flutuante (ex: 0.1 + 0.2 resultando em 0.30000000000000004) utilizando aritmética de precisão arbitrária (BigNumber) para a execução de fórmulas do usuário.

  3. Rastreabilidade (ISO 17025:2017, Cláusula 7.11): Cada cálculo gera metadados contendo a versão exata do motor (engineVersion), carimbo de tempo ISO 8601 (timestamp) e a lista de todas as variáveis utilizadas (inputsUsed), garantindo a rastreabilidade completa do dado processado.


O motor implementa o método de Propagação de Incertezas conforme descrito no Guia para a Expressão de Incerteza de Medição (GUM, JCGM 100:2008).

2.1. Incerteza do Tipo A (Avaliação Estatística)

Seção intitulada “2.1. Incerteza do Tipo A (Avaliação Estatística)”

Para avaliações baseadas na distribuição estatística de uma série de medições, o motor calcula a média aritmética, o desvio padrão experimental e a incerteza padrão da média.

Média aritmética:

xˉ=1ni=1nxi\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i

Desvio padrão experimental (amostral):

s=1n1i=1n(xixˉ)2s = \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2}

Incerteza padrão da média:

uA=snu_A = \frac{s}{\sqrt{n}}

Graus de liberdade:

νA=n1\nu_A = n - 1

2.2. Incerteza do Tipo B (Avaliação Sistemática)

Seção intitulada “2.2. Incerteza do Tipo B (Avaliação Sistemática)”

Para componentes avaliados por meios não estatísticos — certificados de calibração, especificações do fabricante, resolução do instrumento — o motor converte o valor informado em incerteza padrão utilizando o divisor da distribuição de probabilidade correspondente.

Fórmula geral:

uB=adu_B = \frac{a}{d}

Onde aa é o valor da semi-amplitude (ou incerteza informada) e dd é o divisor da distribuição.

DistribuiçãoDivisor (dd)Valor NuméricoAplicação Típica
Normal (kk informado)kkvariávelCertificados de calibração (incerteza expandida UU)
Retangular3\sqrt{3}1,732\approx 1{,}732Resolução, deriva, especificações sem nível de confiança
Triangular6\sqrt{6}2,449\approx 2{,}449Distribuição onde valores centrais são mais prováveis
U-Shaped2\sqrt{2}1,414\approx 1{,}414Histerese, controle de temperatura cíclico

Quando um fator de abrangência (kk) é fornecido junto ao valor, o motor interpreta o valor como uma incerteza expandida e converte:

uB=Uku_B = \frac{U}{k}

Graus de liberdade padrão para Tipo B: ν=50\nu = 50, conforme recomendação do GUM (Seção G.4.2) para estimativas consideradas confiáveis. Este valor é configurável por componente.

Combinação dos componentes Tipo B (RSS):

uBtotal=j=1muBj2u_B^{\text{total}} = \sqrt{\sum_{j=1}^{m} u_{B_j}^2}

A combinação das incertezas é realizada através da Raiz da Soma dos Quadrados (RSS — Root Sum of Squares), conforme a Equação 10 do GUM (Seção 5.2):

uc(y)=i=1N[ciu(xi)]2u_c(y) = \sqrt{\sum_{i=1}^{N} \left[ c_i \cdot u(x_i) \right]^2}

Onde cic_i são os coeficientes de sensibilidade para cada componente. Se não especificados, o sistema assume ci=1c_i = 1.

2.4. Graus de Liberdade Efetivos (νeff\nu_{\text{eff}})

Seção intitulada “2.4. Graus de Liberdade Efetivos (νeff\nu_{\text{eff}}νeff​)”

Para garantir a cobertura correta — especialmente com distribuições não normais ou amostras pequenas — o motor calcula os graus de liberdade efetivos utilizando a fórmula de Welch-Satterthwaite (GUM Anexo G, Equação G.2b):

νeff=uc4(y)i=1N[ciui(y)]4νi\nu_{\text{eff}} = \frac{u_c^4(y)}{\displaystyle\sum_{i=1}^{N} \frac{\left[ c_i \cdot u_i(y) \right]^4}{\nu_i}}

O resultado é arredondado para baixo (floor) para o inteiro mais próximo, conforme prática metrológica conservadora.

2.5. Incerteza Expandida (UU) e Fator de Abrangência (kk)

Seção intitulada “2.5. Incerteza Expandida (UUU) e Fator de Abrangência (kkk)”

A incerteza expandida é calculada como:

U=k×ucU = k \times u_c

O fator kk não é fixo em 2,0. O motor determina kk dinamicamente consultando a tabela t-Student com base:

  1. Na probabilidade de abrangência desejada (padrão: 95,45%, mas suporta 95% e 99%).
  2. Nos graus de liberdade efetivos (νeff\nu_{\text{eff}}) calculados por Welch-Satterthwaite.

Níveis de confiança suportados:

Probabilidadekk para ν\nu \to \inftyUso
95,00%1,961{,}96Comum fora da metrologia
95,45% (padrão)2,002{,}00Padrão em laboratórios de calibração
99,00%2,5762{,}576Alta confiança

Para νeff500\nu_{\text{eff}} \geq 500, o motor utiliza k=2,0k = 2{,}0 (constante T_INFINITY) pois a distribuição tt converge para a normal.

Extrato da tabela t-Student implementada (95,45%):

νeff\nu_{\text{eff}}kk
113,97
24,53
33,31
42,87
52,65
102,28
202,13
502,05
1002,03
500\geq 5002,00

O motor utiliza uma abordagem híbrida de duas camadas para garantir tanto a exatidão metrológica quanto a precisão matemática nas fórmulas do usuário.

Os cálculos internos de incerteza (uAu_A, uBu_B, Welch-Satterthwaite) utilizam a aritmética de ponto flutuante padrão IEEE 754 (~15-17 dígitos significativos).

Justificativa: Dados de entrada de calibração raramente excedem 6-8 algarismos significativos. A precisão nativa é ordens de magnitude superior ao necessário para a estimativa de incertezas, onde o resultado final é tipicamente arredondado para 2-3 algarismos significativos.

Para fórmulas personalizadas (ex: cálculo de erro, interpolação, médias vetoriais), o motor utiliza a biblioteca mathjs configurada com BigNumber.

  • Precisão Padrão: 32 dígitos significativos (configurável até 128).
  • Modo Determinístico: Ativado (predictable: true) para garantir resultados reproduzíveis.
  • Resultados como String: Valores são armazenados como strings para preservar a precisão total entre encadeamentos de fórmulas.

Comparação de precisão:

OperaçãoJavaScript NativoCalibraFácil Engine
0.1 + 0.20.300000000000000040.3

O motor suporta operações vetoriais nativas. Se um array de leituras é fornecido, operações são aplicadas elemento a elemento:

  • mean(leituras) — média aritmética
  • std(leituras) — desvio padrão
  • min(leituras), max(leituras), sum(leituras) — agregações
  • leituras - referencia — subtrai o valor de referência de cada elemento individualmente

Antes de qualquer cálculo, o motor realiza um processo de “achatamento” (flattening) e normalização dos dados de entrada.

Objetos JSON aninhados são convertidos em um escopo plano com chaves delimitadas por underscores:

{ calibracao: { leituras: [10.1, 10.2] } }
→ { calibracao_leituras_0: 10.1, calibracao_leituras_1: 10.2, calibracao_leituras_count: 2 }
  • Profundidade máxima: 5 níveis (configurável)
  • Arrays: Acesso indexado (leituras_0, leituras_1) + contagem (leituras_count)
  • Dados ambientais: Prefixo env_ (ex: env_temperature, env_humidity)
  • Especificações do instrumento: Prefixo inst_ (ex: inst_resolution)

O sistema identifica e converte automaticamente unidades para as unidades base do Sistema Internacional (SI), reduzindo erros de conversão manual.

EntradaConversãoBase SI
500 g0,5kg
10 mm0,01m
200 mbar20000Pa
10 mL0,00001

Grandezas suportadas: Massa (kg, g, mg, lb, oz), comprimento (m, cm, mm, µm, nm, km, in, ft), temperatura (K, °C, °F), pressão (Pa, kPa, MPa, bar, mbar, psi, atm, mmHg), volume (L, mL, µL, m³), elétricas (V, mV, A, mA, µA, ohm, kohm, Mohm).


Em conformidade com a ética metrológica, declaramos explicitamente as limitações do modelo matemático atual.

5.1. Assunção de Correlação Zero (r=0r = 0)

Seção intitulada “5.1. Assunção de Correlação Zero (r=0r = 0r=0)”

O cálculo da incerteza combinada utiliza a soma quadrática simples (GUM Equação 10). Isso assume que todas as fontes de incerteza são independentes estatisticamente.

  • Impacto: Se houver forte correlação positiva entre fontes (ex: uso do mesmo padrão para calibrar o instrumento e medir o erro), a incerteza pode ser subestimada.
  • Recomendação: Para casos de alta correlação, somar as incertezas aritmeticamente antes de combiná-las, ajustar os coeficientes de sensibilidade, ou utilizar o método de Monte Carlo (GUM Suplemento 1).

Apenas três níveis de confiança são suportados: 95%, 95,45% e 99%. Para níveis não suportados, o motor utiliza o mais próximo disponível (fallback silencioso).

Para νeff500\nu_{\text{eff}} \geq 500, a distribuição tt é tratada como normal (k=2,0k = 2{,}0 para 95,45%).

Embora as fórmulas usem BigNumber, o cálculo estatístico (média, desvio padrão) das incertezas utiliza aritmética nativa IEEE 754. Testes exaustivos — incluindo validação contra o GUM Anexo H.1 — demonstram que isso não introduz erros perceptíveis na escala de incertezas metrológicas.


O motor executa em um ambiente sandbox restrito, compatível com runtimes de borda (Cloudflare Workers).

Funções bloqueadas: import, evaluate, parse, simplify, derivative, resolve, compile, chain, createUnit, reviver.

Padrões perigosos detectados via regex: __proto__, .constructor, Object.defineProperty, Object.getOwnPropertyDescriptor, Function(, eval(, require(, import(, process.*, global.*, globalThis.*, window.*.

Operações permitidas: Aritmética (+, -, *, /, ^, %), trigonometria (sin, cos, tan, asin, acos, atan), estatística (mean, std, min, max, sum), logaritmos (log, log10, exp), arredondamento (round, floor, ceil, abs) e comparações.

Isso permite que laboratórios escrevam fórmulas complexas sem risco de comprometer a segurança da plataforma ou dos dados.


O motor possui um protocolo de validação formal (VAL-MATH-001) com os seguintes resultados:

  • 177 testes automatizados, 100% de aprovação
  • Validação contra GUM Anexo H.1 — caso de referência para calibração de bloco-padrão
  • Verificação da tabela t-Student contra NIST/SEMATECH para os 3 níveis de confiança
  • Verificação exata dos divisores de distribuição contra GUM Tabela F.1
  • Tolerâncias: Cálculos GUM com 5 casas decimais; BigNumber com 14 casas; valores de referência com 3 casas (precisão de reporte do GUM)

  1. JCGM 100:2008 (GUM): Evaluation of measurement data — Guide to the expression of uncertainty in measurement.
  2. JCGM 101:2008 (GUM Suplemento 1): Propagation of distributions using a Monte Carlo method.
  3. JCGM 200:2012 (VIM): International vocabulary of metrology — Basic and general concepts and associated terms.
  4. ISO/IEC 17025:2017: General requirements for the competence of testing and calibration laboratories.
  5. NIST/SEMATECH: e-Handbook of Statistical Methods — tabelas t-Student e validação cruzada.