Kan noen forklare hvordan man skriver en sinc-funksjon uten å bruke den i MATLAB?


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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *