Alguém poderia explicar como escrever uma função sinc sem realmente usá-la no MATLAB?


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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *