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 x
tai arvioitaessa a-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.