Bästa svaret
Du menar en funktion som utvärderar \ frac {\ sin x} {x} för x \ ne 0 och 1 för x = 0?
Det skulle självklart vara enkelt att bara programmera något med ett uttalande som
function result = mySinc(x)
\% My implementation of the sinc function.
if x == 0
result = 1;
else
result = sin(x)/x;
end
end
Men det kan faktiskt vara mindre än idealisk. Visst, det undviker singulariteten och har rätt matematisk struktur, men vi måste naturligtvis komma ihåg att värdena i x
inte är siffror: de är mönster av bitar som representeras av växlar i hårdvara och endast ungefärliga nummer. De fungerar ganska bra för det mesta, men det finns omständigheter där saker inte fungerar korrekt. Till exempel när man utvärderar a + log(1+x)
för små x
, eller när du utvärderar a-b
när a
och b
har mycket lika värden. Du kan förlora ett mycket av precision om du utvärderar det senare naivt (även om du ibland inte har något val, tyvärr). Uppdelning med små tal kan också orsaka problem lyckligtvis är både \ sin x och x jämförbara när | x | \ ll 1. Kanske skulle det inte vara ett problem, men när det gäller flytande aritmetik är det sällan bra att ha kod som if x == foo
.
Vad ska jag göra i det här fallet? Tänk på Taylor-serien av \ frac {\ sin x} {x} centrerad vid x = 0. Jag skriver inte ner det, men du vet säkert hur du beräknar det.
Byt sedan ut testet if x == 0
med if abs(x) < sqrt(eps)
, där i Matlab eps
returnerar maskinens epsilon (jämförbar med 10 ^ {- 16} på de flesta system idag) och ersätter raden result = 1;
av result = ...;
, där ...
kommer att vara din beräkning av Taylor-serien trunkerad efter en lämplig ordning (vanligtvis bör cirka 2 gör, men du bör själv kontrollera skalan för den högsta ordningsperioden du väljer för x \ sim 10 ^ {- 8} och om resultatet blir så exakt som du behöver eller inte).
trevlig sak här är att det du tappar när du kör den här koden kommer du sannolikt att få i noggrannhet, särskilt när du utvärderar sinusintegralt \ operatornamn {Si} (x) = \ int\_0 ^ xf (t) dt, där f (t ) är den kontinuerliga förlängningen av \ operatorname {sinc} -funktionen till alla realer som dess domän.