最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

正弦関数のルックアップ テーブルの作成

はじめに

以下の節では、関数 fixpt_look1_func_approx を使用してルックアップ テーブルを作成する方法を説明します。区間 0 ~ 0.25 にある関数 sin(2πx) のルックアップ テーブルを作成する方法の例を紹介します。

fixpt_look1_func_approx のパラメーター

関数 fixpt_look1_func_approx を使用するには、最初にそのパラメーターを定義しなければなりません。関数の必須パラメーターは次のとおりです。

  • funcstr — 理想関数

  • xmin — 対象の最小入力

  • xmax — 対象の最大入力

  • xdt — x データ型

  • xscale — x データ スケーリング

  • ydt — y データ型

  • yscale — y データ スケーリング

  • rndmeth — 丸め手法

さらに、次の 3 つのパラメーターもあります。

  • errmax — ルックアップ テーブルの最大許容誤差

  • nptsmax — ルックアップ テーブルの最大数の点

  • spacing — ブレークポイント間の許容間隔

少なくとも errmax または nptsmax のいずれかのパラメーターを使用しなければなりません。次の節ルックアップ テーブルの関数パラメーターの設定では、これらのパラメーターの一般的な設定を示します。

errmax のみの使用

errmax パラメーターのみを使用し、nptsmax を使用しない場合、関数は点が最も少ないルックアップ テーブルを作成し、最悪誤差は最大で errmax になります。制限のない間隔で errmax を使用するを参照してください。

nptsmax のみの使用

nptsmax のみを使用し、errmax を使用しない場合、関数は最大 nptsmax の点があるルックアップ テーブルを作成し、最悪誤差は最小になります。nptsmax を制限のない間隔で使用するを参照してください。

errmax と nptsmax の両方を指定するの節では、errmaxnptsmax の両方を指定したときの関数の動作について説明します。

間隔

オプションの spacing パラメーターを使用して、ルックアップ テーブルのブレークポイント間の間隔を制限できます。次のオプションがあります。

  • 'unrestricted' — 既定値。

  • 'even' — 任意の隣接するブレークポイント間の距離は同じです。

  • 'pow2' — 任意の隣接するブレークポイント間の距離は同じで 2 のべき乗です。

間隔の制限の節と以下の例では、spacing パラメーターを使用する方法を説明します。

ルックアップ テーブルの関数パラメーターの設定

この節の例を実行するには、最初に関数 fixpt_look1_func_approx のパラメーター値を設定しなければなりません。それを行うには、MATLAB® プロンプトで以下のように入力します。

funcstr = 'sin(2*pi*x)'; % Define the sine function
xmin = 0; % Set the minimum input of interest
xmax = 0.25; % Set the maximum input of interest
xdt = ufix(16); % Set the x data type
xscale = 2^-16; % Set the x data scaling
ydt = sfix(16); % Set the y data type
yscale = 2^-14; % Set the y data scaling
rndmeth = 'Floor'; % Set the rounding method
errmax = 2^-10; % Set the maximum allowed error
nptsmax = 21; % Specify the maximum number of points

これらのコマンドを入力した後で MATLAB ソフトウェアを終了する場合、この節の他の例を実行する前にコマンドを再入力しなければなりません。

制限のない間隔で errmax を使用する

最初の例は、指定した最悪誤差のデータ点が最も少ないルックアップ テーブルを間隔を制限せずに作成する方法を示します。例を実行する前に、この MATLAB セッションでパラメーター値を指定していない場合は、ルックアップ テーブルの関数パラメーターの設定の節で指定したのと同じパラメーター値を入力します。

以下のように入力して最大許容誤差を指定します。

errmax = 2^-10;

ルックアップ テーブルの作成

ルックアップ テーブルを作成するには、以下のように入力します。

[xdata, ydata, errworst] = fixpt_look1_func_approx(funcstr, ...
xmin,xmax,xdt,xscale,ydt,yscale,rndmeth,errmax,[]);

nptsmax パラメーターと spacing パラメーターは指定されていないことに注意してください。

関数は次の 3 つの変数を返します。

  • xdata — ルックアップ テーブルのブレークポイントのベクトル

  • ydata — 理想関数 sin(2πx)xdata に適用して得られたベクトル

  • errworst — ルックアップ テーブル内の最大誤差を指定

errworst の値は、errmax の値以下になります。

以下のように入力して X データ点の数を求めることができます。

length(xdata)
ans = 16

これは、sin(2πx)errmax で指定される許容誤差内に近似するには 16 個の点が必要なことを意味します。

以下のように入力して最大誤差を表示できます。

errworst
errworst = 9.7656e-04

結果のプロット

以下のように入力すると、関数 fixpt_look1_func_plot の出力をプロットすることができます。

fixpt_look1_func_plot(xdata,ydata,funcstr,xmin,xmax,xdt, ...
xscale,ydt,yscale,rndmeth);

上のプロットは、理想関数 sin(2πx) とブレークポイント間の固定小数点ルックアップ近似を示します。この例では、理想関数と近似が非常に近接しているため 2 つのグラフは一致しているように見えます。下のプロットは誤差を示します。

この例では、関数 fixpt_look1_func_approxydata として返した Y データ点が xdata の点に適用された理想関数と等しくなっています。ただし、fixpt_look1_func_plot を実行すると ydata に別の値のセットを定義することができます。これにより最大誤差が小さくなる場合があります。

また、元の区間のサブセットのルックアップ テーブルを評価するために、xminxmax の値を変えることもできます。

ydataxmin、または xmax を変更した後の新しい最大誤差を確認するには、以下のように入力します。

errworst = fixpt_look1_func_plot(xdata,ydata,funcstr,xmin,xmax, ...
xdt,xscale,ydt,yscale,rndmeth)

nptsmax を制限のない間隔で使用する

次の例は、指定した最大データ点数の最悪誤差を最小にするルックアップ テーブルを間隔を制限せずに作成する方法を示します。例を実行する前に、この MATLAB セッションでパラメーター値を指定していない場合は、ルックアップ テーブルの関数パラメーターの設定の節で指定したのと同じパラメーター値を入力します。

ブレークポイント数の設定

以下のように入力してルックアップ テーブルのブレークポイント数を指定します。

nptsmax = 21;

ルックアップ テーブルの作成

ルックアップ テーブルを作成するには、以下のように入力します。

[xdata, ydata, errworst] = fixpt_look1_func_approx(funcstr, ...
xmin,xmax,xdt,xscale,ydt,yscale,rndmeth,[],nptsmax);

空の大かっこ [] は、この例では使用しないパラメーター errmax を無視するように関数に伝えます。errmax を省略すると、関数 fixpt_look1_func_approxnptsmax で指定されたサイズの、最悪誤差の最も小さいルックアップ テーブルを返します。

関数は 21 個の点があるベクトル xdata を返します。MATLAB プロンプトで「errworst」と入力すると、この点セットの最大誤差を見つけることができます。

errworst
errworst = 5.1139e-04

結果のプロット

ルックアップ テーブルを誤差と共にプロットするには、以下のように入力します。

fixpt_look1_func_plot(xdata,ydata,funcstr,xmin,xmax,xdt, ...
xscale,ydt,yscale,rndmeth);

間隔の制限

上記の 2 つの例では、関数 fixpt_look1_func_approx はブレークポイント間の間隔を制限しないルックアップ テーブルを作成します。間隔パラメーターを使用し、間隔を制限してルックアップ テーブルの計算効率を高めることができます。

間隔のオプションは次のとおりです。

  • 'unrestricted' — 既定値。

  • 'even' — 任意の隣接するブレークポイント間の距離は同じです。

  • 'pow2' — 任意の隣接するブレークポイント間の距離は同じで 2 のべき乗です。

2 のべき乗間隔と等間隔は両方ともルックアップ テーブルの計算速度を向上させ、コマンドの読み取り専用メモリ (ROM) の使用量が少なくします。ただし、いずれかの間隔制限を errmax と一緒に指定すると、同程度の精度を実現するために、通常は間隔を制限しない場合よりもデータ点が多く必要になります。速度、誤差、およびメモリの使用量に与える間隔の影響の節では、異なる間隔オプションとのトレードオフについて説明します。

等間隔で errmax を使用する

次の例は、ブレークポイントが等間隔で、最悪誤差が指定されているルックアップ テーブルを作成する方法を示します。例を実行する前に、この MATLAB セッションでパラメーター値を指定していない場合は、最初にルックアップ テーブルの関数パラメーターの設定の節で指定したのと同じパラメーター値を入力しなければなりません。

次に、MATLAB プロンプトで以下のように入力します。

spacing = 'even';
[xdata, ydata, errworst] = fixpt_look1_func_approx(funcstr, ...
xmin,xmax,xdt,xscale,ydt,yscale,rndmeth,errmax,[],spacing);

以下を入力すると、ルックアップ テーブルの点数を得ることができます。

length(xdata)
ans = 20

ルックアップ テーブルを誤差と共にプロットするには、以下のように入力します。

fixpt_look1_func_plot(xdata,ydata,funcstr,xmin,xmax,xdt, ...
xscale,ydt,yscale,rndmeth);

nptsmax を等間隔で使用する

次の例は、ブレークポイントが等間隔で、指定された最大数の点の最悪誤差を最小にするルックアップ テーブルを作成する方法を示します。例を実行する前に、この MATLAB セッションでパラメーター値を指定していない場合は、最初にルックアップ テーブルの関数パラメーターの設定の節で指定したのと同じパラメーター値を入力しなければなりません。

次に、MATLAB プロンプトで以下のように入力します。

spacing = 'even';
[xdata, ydata, errworst] = fixpt_look1_func_approx(funcstr, ...
xmin,xmax,xdt,xscale,ydt,yscale,rndmeth,[],nptsmax,spacing);

結果は、2^-10.2209 の最大絶対誤差を実現するためには 21 個の等間隔の点が必要です。

ルックアップ テーブルを誤差と共にプロットするには、以下のように入力します。

fixpt_look1_func_plot(xdata,ydata,funcstr,xmin,xmax,xdt, ...
xscale,ydt,yscale,rndmeth);

2 のべき乗の間隔で errmax を使用する

次の例は、間隔が 2 のべき乗で、最悪誤差が指定されているルックアップ テーブルを作成する方法を示します。例を実行する前に、この MATLAB セッションでパラメーター値を指定していない場合は、最初にルックアップ テーブルの関数パラメーターの設定の節で指定したのと同じパラメーター値を入力しなければなりません。

次に、MATLAB プロンプトで以下のように入力します。

spacing = 'pow2';
[xdata, ydata, errworst] = ...
fixpt_look1_func_approx(funcstr,xmin, ...
xmax,xdt,xscale,ydt,yscale,rndmeth,errmax,[],spacing);

ルックアップ テーブル内の点数を調べるには、以下のように入力します。

length(xdata)
ans = 33

これは、errmax で指定した最悪誤差を実現するには 33 個の点が必要であることを意味します。これらの点が等間隔であることを検証するには、以下のように入力します。

widths = diff(xdata)

これは、要素が xdata 内の連続する点間の差であるベクトルを生成します。widths のすべての要素は 2-7 です。

ルックアップ テーブルの最大誤差を見つけるには、以下のように入力します。

errworst
errworst = 3.7209e-04

これは、errmax の値以下です。

ルックアップ テーブルを誤差と共にプロットするには、以下のように入力します。

fixpt_look1_func_plot(xdata,ydata,funcstr,xmin,xmax,xdt, ...
xscale,ydt,yscale,rndmeth);

2 のべき乗の間隔で nptsmax を使用する

次の例は、間隔が 2 のべき乗で、指定された最大数の点の最悪誤差を最小にするルックアップ テーブルを作成する方法を示します。例を実行する前に、次の MATLAB セッションでパラメーター値を指定していない場合は、最初にルックアップ テーブルの関数パラメーターの設定の節で指定したのと同じパラメーター値を入力しなければなりません。

spacing = 'pow2';
[xdata, ydata, errworst] = ...
fixpt_look1_func_approx(funcstr,xmin, ...
xmax,xdt,xscale,ydt,yscale,rndmeth,errmax,[],spacing);

最大絶対誤差 2^-9.6267 を達成するには 17 個の点が必要です。

ルックアップ テーブルを誤差と共にプロットするには、以下のように入力します。

fixpt_look1_func_plot(xdata,ydata,funcstr,xmin,xmax,xdt, ...
xscale,ydt,yscale,rndmeth);

errmax と nptsmax の両方を指定する

errmax パラメーターと nptsmax パラメーターの両方を含めると、関数 fixpt_look1_func_approx はデータ点が最大 nptsmax 個で、最悪誤差が最大 errmax のルックアップ テーブルを見つけます。両方の条件を満たすルックアップ テーブルを見つけた場合、間隔に次の優先順位が使用されます。

  1. 2 のべき乗

  2. 偶数

  3. 制限がない

関数が両方の条件を満たすルックアップ テーブルを見つけられない場合、nptsmax は無視され、間隔に制限がなく最悪誤差が最大で errmax のルックアップ テーブルが返されます。この場合、関数は nptsmax パラメーターが省略されたときと同じ動作をします。

次の例は、ルックアップ テーブルの関数パラメーターの設定の節で説明されているパラメーターを使用し、以下のように入力するときに nptsmax に別の値を指定した場合の結果を示します。

[xdata ydata errworst] = fixpt_look1_func_approx(funcstr, ...
xmin,xmax,xdt,xscale,ydt,yscale,rndmeth,errmax,nptsmax);

nptsmax の 3 つの異なる設定の結果は次のとおりです。

  • nptsmax = 33; — 例 3 のように、関数は間隔が 2 のべき乗の 33 個の点があるルックアップ テーブルを作成します。

  • nptsmax = 21; — 例 5 のように、errmaxnptsmax の条件は 2 のべき乗の間隔では満たされないため、関数は等間隔の 20 個の点があるルックアップ テーブルを作成します。

  • nptsmax = 16; — 例 1 のように、errmaxnptsmax の条件は 2 のべき乗の間隔でも等間隔でも満たされないため、関数は間隔に制限のない 16 個の点があるルックアップ テーブルを作成します。

例の結果の比較

次の表では、例の結果をまとめます。errmax を指定すると、等間隔では間隔に制限がない場合よりも多くのデータ点が必要になり、2 のべき乗の間隔では等間隔の場合よりも多くの点が必要になります。

オプション間隔最悪誤差テーブル内の点数

1

errmax=2^-10

'unrestricted'

2^-10

16

2

nptsmax=21

'unrestricted'

2^-10.933

21

3

errmax=2^-10

'even'

2^-10.0844

20

4

nptsmax=21

'even'

2^-10.2209

21

5

errmax=2^-10

'pow2'

2^-11.3921

33

6

nptsmax=21

'pow2'

2^-9.627

17