Voisiko joku selittää, miten sinc-funktio kirjoitetaan ilman, että sitä todella käytetään MATLAB: ssa?


Paras vastaus

Tarkoitat funktiota, joka arvioi \ frac {\ sin x} {x} x: lle \ n 0 ja 1 x = 0: lle?

On tietysti helppoa ohjelmoida jotain esimerkiksi lauseella, kuten

function result = mySinc(x)

\% My implementation of the sinc function.

if x == 0

result = 1;

else

result = sin(x)/x;

end

end

Mutta se voisi itse asiassa olla vähemmän kuin ihanteellinen. Toki se välttää singulariteetin ja sillä on oikea matemaattinen rakenne, mutta meidän on tietysti muistettava, että x -arvot eivät ole ”t” -numeroita: ne ovat uudelleen kytkimien edustamia bittejä laitteistossa ja vain likimääräiset numerot. Ne toimivat melko hyvin suurimman osan ajasta, mutta on tilanteita, joissa asiat eivät vain toimi oikein. Esimerkiksi kun arvioidaan a + log(1+x) pienille xa-b, kun a ja b arvot ovat hyvin samankaltaiset. voi menettää paljon tarkkuutta, jos arvioit jälkimmäistä naiivisti (vaikka joskus sinulla ei valitettavasti ole muuta vaihtoehtoa). Jaottaminen pienillä määrillä voi myös aiheuttaa ongelmia, vaikka onneksi molemmat \ sin x ja x ovat vertailukelpoisia, kun | x | \ ll 1. Ehkä se ei ole ongelma, mutta käsiteltäessä liukulukuaritmeettista on harvoin hyvä käytäntö koodin ollessa if x == foo.

Mitä tehdä tässä tapauksessa? Harkitaan Taylor-sarjaa \ frac {\ sin x} {x}, jonka keskipiste on x = 0. En kirjoita sitä, mutta osaat varmasti laskea sen.

Korvaa sitten testi if x == 0 arvolla if abs(x) < sqrt(eps) , jossa Matlabissa eps palauttaa koneen epsilonin (verrataan 10 ^ {- 16}: iin useimmissa järjestelmissä nykyään) ja korvaa rivi result = 1; by result = ...;, jossa ... tulee olemaan laskelmasi Taylor-sarjasta katkaistuna sopivan järjestyksen jälkeen (yleensä noin 2 tee, mutta tarkista itse x \ sim 10 ^ {- 8} -valintasi korkeimman asteen termi ja onko tulos niin tarkka kuin tarvitset vai ei).

hienoa tässä on, että mitä menetät tämän koodin suorittamisen nopeudessa, todennäköisesti saavutat tarkkuuden, varsinkin kun arvioidaan sini-integraali \ operaattorin nimi {Si} (x) = \ int\_0 ^ xf (t) dt, missä f (t ) on \ operaattorin nimi {sinc} -toiminnon jatkuva laajennus kaikkiin todellisuuksiin sen verkkotunnuksena.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *