Beste svaret
Du mener en funksjon som vurderer \ frac {\ sin x} {x} for x \ ne 0 og 1 for x = 0?
Det ville åpenbart være enkelt å bare programmere noe med en uttalelse 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 faktisk være mindre enn ideell. Visst, den unngår singulariteten og har den korrekte matematiske strukturen, men vi må selvfølgelig huske at verdiene i x
ikke er tall: de er mønstre av biter som er representert av brytere i maskinvare og bare omtrentlige tall. De fungerer ganske bra det meste av tiden, men det er omstendigheter der ting bare ikke fungerer som for eksempel når man vurderer a + log(1+x)
for små x
, eller når du vurderer a-b
når a
og b
har veldig like verdier. Du kan miste mye presisjon hvis du vurderer sistnevnte naivt (selv om du noen ganger ikke har noe valg, akk). Divisjon med små tall kan også forårsake problemer, selv Heldigvis er både \ sin x og x sammenlignbare når | x | \ ll 1. Kanskje det ikke ville være et problem, men når det gjelder flytepunktsregning er det sjelden god praksis å ha kode som if x == foo
.
Hva skal jeg gjøre i dette tilfellet? Tenk på Taylor-serien av \ frac {\ sin x} {x} sentrert ved x = 0. Jeg vil ikke skrive den ned, men du vet sikkert hvordan du skal beregne det.
Bytt deretter ut testen if x == 0
med if abs(x) < sqrt(eps)
, der i Matlab eps
returnerer maskinens epsilon (kan sammenlignes med 10 ^ {- 16} på de fleste systemer i disse dager), og erstatt linjen result = 1;
av result = ...;
, der ...
blir din beregning av Taylor-serien avkortet etter en passende ordre (vanligvis bør ca. gjør det, men du bør sjekke selv skalaen til den høyeste ordensperioden du velger for x \ sim 10 ^ {- 8}, og om resultatet blir så nøyaktig som du trenger eller ikke).
fin ting her er at det du mister når du kjører denne koden, vil du sannsynligvis få i nøyaktighet, spesielt når du vurderer sinusintegralt \ operatornavn {Si} (x) = \ int\_0 ^ xf (t) dt, hvor f (t ) er den kontinuerlige utvidelsen av \ operatorname {sinc} -funksjonen til alle realer som sitt domene.