Könnte jemand erklären, wie man eine sinc-Funktion schreibt, ohne sie tatsächlich in MATLAB zu verwenden?


Beste Antwort

Sie meinen eine Funktion, die \ frac {\ sin x} auswertet {x} für x \ ne 0 und 1 für x = 0?

Natürlich wäre es einfach, etwas mit einer Anweisung wie

function result = mySinc(x)

\% My implementation of the sinc function.

if x == 0

result = 1;

else

result = sin(x)/x;

end

end

Aber das könnte tatsächlich sein weniger als ideal. Sicher, es vermeidet die Singularität und hat die richtige mathematische Struktur, aber wir müssen uns natürlich daran erinnern, dass die Werte in x keine Zahlen sind: Sie sind Muster von Bits, die durch Schalter dargestellt werden in Hardware und nur ungefähre Zahlen. Sie funktionieren die meiste Zeit ziemlich gut, aber es gibt Umstände, unter denen die Dinge einfach nicht richtig funktionieren. Zum Beispiel bei der Bewertung von a + log(1+x) für kleine x oder bei der Auswertung von a-b, wenn a und b sehr ähnliche Werte haben kann ein Los an Präzision verlieren, wenn Sie letzteres naiv bewerten (obwohl Sie manchmal leider keine Wahl haben). Die Division durch kleine Zahlen kann jedoch auch Probleme verursachen Zum Glück sind sowohl \ sin x als auch x vergleichbar, wenn | x | \ ll 1. Vielleicht wäre es kein Problem, aber wenn es um Gleitkomma-Arithmetik geht, ist es selten eine gute Praxis, Code wie .

Was ist in diesem Fall zu tun? Betrachten Sie die Taylor-Reihe von \ frac {\ sin x} {x}, die auf x = 0 zentriert ist. Ich werde sie nicht aufschreiben, aber Sie wissen sicher, wie man es berechnet.

Ersetzen Sie dann den Test if x == 0 durch if abs(x) < sqrt(eps) , wo in Matlab eps das Maschinen-Epsilon (vergleichbar mit 10 ^ {- 16} auf den meisten Systemen heutzutage) zurückgibt und die Zeile result = 1; durch result = ...;, wobei die ... Ihre Berechnung der Taylor-Reihe sein wird, die nach einer geeigneten Reihenfolge abgeschnitten wird (normalerweise sollten es ungefähr 2 sein tun Sie dies, aber Sie sollten selbst überprüfen, in welcher Skala der Term höchster Ordnung Sie für x \ sim 10 ^ {- 8} auswählen und ob das Ergebnis so genau ist, wie Sie es benötigen oder nicht.

Die Das Schöne daran ist, dass das, was Sie an Geschwindigkeit verlieren, wenn Sie diesen Code ausführen, wahrscheinlich an Genauigkeit gewinnt, insbesondere wenn Sie das Sinusintegral \ operatorname {Si} (x) = \ int\_0 ^ xf (t) dt auswerten, wobei f (t ) ist die kontinuierliche Erweiterung der Funktion \ operatorname {sinc} auf alle Reals als Domäne.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.