Melhor resposta
Você quer dizer uma função que avalia \ frac {\ sin x} {x} para x \ ne 0 e 1 para x = 0?
Obviamente, seria fácil apenas programar algo com uma instrução como
function result = mySinc(x)
\% My implementation of the sinc function.
if x == 0
result = 1;
else
result = sin(x)/x;
end
end
Mas isso poderia ser menos do que ideal. Claro, ele evita a singularidade e tem a estrutura matemática correta, mas é claro que temos que lembrar que os valores em x
não são números: são padrões de bits representados por interruptores em hardware e apenas números aproximados . Eles funcionam muito bem na maioria das vezes, mas há circunstâncias em que as coisas simplesmente não funcionam direito. Como ao avaliar a + log(1+x)
para pequenos x
, ou ao avaliar a-b
quando a
e b
têm valores muito semelhantes. pode perder um lote de precisão se você avaliar o último ingenuamente (embora às vezes você não tenha escolha, infelizmente). A divisão por pequenos números também pode causar problemas, embora felizmente, ambos \ sin x e x são comparáveis quando | x | \ ll 1. Talvez não seja um problema, mas ao lidar com aritmética de ponto flutuante, raramente é uma boa prática ter um código como if x == foo
.
O que fazer neste caso? Considere a série de Taylor de \ frac {\ sin x} {x} centrada em x = 0. Não vou escrever, mas você certamente sabe como calculá-lo.
Em seguida, substitua o teste if x == 0
por if abs(x) < sqrt(eps)
, onde em Matlab eps
retorna o epsilon da máquina (comparável a 10 ^ {- 16} na maioria dos sistemas atualmente) e substitui a linha result = 1;
por result = ...;
, onde o ...
será seu cálculo da série de Taylor truncado após uma ordem apropriada (geralmente cerca de 2 deve faça, mas você deve verificar por si mesmo a escala do termo de maior ordem que você escolheu para x \ sim 10 ^ {- 8} e se o resultado será tão preciso quanto você precisa ou não).
O A coisa boa aqui é que o que você perde na velocidade de execução deste código, provavelmente ganhará em precisão, especialmente ao avaliar a integral seno \ operatorname {Si} (x) = \ int\_0 ^ xf (t) dt, onde f (t) ) é a extensão contínua da função \ operatorname {sinc} para todos os reais como seu domínio.