ベストアンサー
\ frac {\ sinx}を評価する関数を意味します{x} for x \ ne 0 and 1 for x = 0?
明らかに、
function result = mySinc(x)
\% My implementation of the sinc function.
if x == 0
result = 1;
else
result = sin(x)/x;
end
end
しかし、実際にはそうなる可能性があります理想的とは言えません。確かに、それは特異点を避け、正しい数学的構造を持っていますが、もちろん、x
の値は数字ではないことを覚えておく必要があります。それらはスイッチによって表されるビットのパターンです。ハードウェアで、おおよその番号のみ。ほとんどの場合、これらはかなりうまく機能しますが、物事が正しく機能しない状況もあります。たとえば、a + log(1+x)
の小さなx
、またはa-b
を評価する場合a
とb
の値が非常に似ている場合。後者を素朴に評価すると、多くの精度が失われる可能性があります(残念ながら、選択の余地がない場合もあります)。ただし、少数で除算すると問題が発生する可能性もあります。幸いなことに、| x | \ ll 1の場合、\ sinxとxの両方が同等です。問題はないかもしれませんが、浮動小数点演算を扱う場合は、。
この場合はどうすればよいですか?x = 0を中心とする\ frac {\ sin x} {x}のテイラーシリーズを考えてみましょう。書き留めませんが、確かにそれを計算する方法を知っています。
次に、テストif x == 0
を if abs(x) < sqrt(eps)
に置き換えます。 、ここで、Matlab eps
はマシンイプシロンを返し(最近のほとんどのシステムでは10 ^ {-16}に相当)、行result = 1;
by result = ...;
、ここで...
は、適切な順序の後に切り捨てられたテイラー級数の計算になります(通常は約2ただし、x \ sim 10 ^ {-8}に対して選択した最上位の項のスケールと、結果が必要なだけ正確であるかどうかを自分で確認する必要があります。
ここでの良い点は、このコードの実行速度が低下すると、精度が向上する可能性が高いことです。特に、正弦積分の\ operatorname {Si}(x)= \ int\_0 ^ xf(t)dtを評価する場合は、f(t )は、\ operatorname {sinc}関数をそのドメインとしてのすべての実数に継続的に拡張したものです。