De acordo com Wolfram Alpha e o sistema de álgebra computacional Sage , a seguinte identidade é válida:
No entanto, quando tentei verificar isso com um exemplo arbitrário no NumPy, notei uma grande diferença nos valores reais calculados pelos dois lados da identidade. Eu usei o seguinte código:
l1 = 10; l2 = 8; d = 17
from numpy import arctan2, cos, sin, sqrt
alpha = arctan2((l1-l2),d)
left = cos(alpha)
right = sqrt(1 + ((l1-l2)**2)/(d**2))
Avaliando os resultados left
e right
produzindo o seguinte:
left = 0.99315060432287616
right = 1.0
É tentador escrever isso simplesmente como um erro numérico, mas como tenho pouca experiência em como podem ocorrer erros numéricos grandes, não tenho tanta certeza. Isso é possível ou estou faltando alguma coisa (óbvio)?
right
foi inserido incorretamente. deve serright = 1/sqrt()
Quando eu entro as fórmulas em meu Ti-89 eu recebo uma correspondência para 12 dígitos em 0,99315 ...Respostas:
Suspeito que sua expressão Python para o lado direito esteja fazendo divisão inteira, não divisão de ponto flutuante. Como resultado,
((l1-l2)**2)/(d**2)
está sendo avaliado como zero, e o termo dentro da raiz quadrada é um.Na verdade, você esqueceu o recíproco na sua expressão direita também, mas esse não é o primeiro problema ...
No MATLAB:
fonte
from __future__ import division
no topo de todos os meus scripts python para esse fim.Como Michael C. Grant apontou, o problema é que a operação de divisão é divisão inteira, não divisão de ponto flutuante. Nas versões do Python anteriores a 3, divida dois números inteiros usando
/
arredondamentos para baixo para um número inteiro. Esse comportamento pode ser alterado adicionandono topo do seu script. Observe que esta declaração altera o comportamento de
/
apenas para o arquivo atual. Se desejar ocasionalmente o comportamento original, use//
(barra dupla). Isso é discutido em mais detalhes aqui:PEP 238 - Mudando de Operador da Divisão
Observe que, embora a maioria das linguagens, incluindo C, tenha semântica semelhante para divisão, a semântica é mais confusa no Python, porque os números inteiros geralmente não são promovidos a flutuadores quando passados para as funções. Assim, uma função escrita como se estivesse operando em flutuadores pode de fato estar operando em números inteiros.
fonte