6

問題 :連続マップを使用するにはどうすればよいですか -リンク 1: ベルヌーイ シフト マップを使用してバイナリ シーケンスをモデル化しますか?

概念: ベルヌーイ シフト マップとも呼ばれるダイアディック マップは、 として表されx(k+1) = 2x(k) mod 1ます。リンク2 : シンボリック ダイナミクスでは、ベルヌーイ図が連続図であり、シフト図として使用されることを説明しています。これについては、以下でさらに説明します。

数値軌跡は、適切な領域に分割し、記号を割り当てることで記号化できます。記号軌道は、その軌道上の点が訪れた連続する分割要素に対応する一連の記号を書き留めることによって得られます。記号軌道を研究することで、系のダイナミクスについて多くを学ぶことができます。このリンクは、ベルヌーイ シフト マップがシンボリック ダイナミクスを表すために使用されていることも示しています。

質問 :

バイナリ シーケンスを生成するために、ベルヌーイ シフト マップはどのように使用されますか? 私はこのように試しましたが、これはLink2のドキュメントが説明しているものではありません. そのため、マップの数値出力を取得し、次の方法でしきい値を設定してシンボルに変換しました。

x = rand();
 y = mod(2* x,1)  % generate the next value after one iteration

y =

    0.3295 
if y >= 0.5 then s = 1
else s = 0

ここ0.5で、 はベルヌーイ マップの臨界値と呼ばれるしきい値です。

Link2 のページ 2 で説明されているように、実数を分数として表す必要があります。

ベルヌーイ シフト マップを適用して記号化された軌跡 (時系列とも呼ばれます) を生成する方法を誰かに教えてもらえますか?

私の理解が間違っている場合は修正してください。

実数値の数値時系列をシンボル表示に変換するにはどうすればよいですか。つまり、ベルヌーイ図を使用して連星軌道/時系列をモデル化するにはどうすればよいですか?

4

2 に答える 2

6

これは確かに実数空間で計算できますが、精度の問題が発生するリスクがあります (開始点によって異なります)。軌道の研究に興味がある場合は、有理分数表現で作業することを好むかもしれません。これを行うにはもっと効率的な方法がありますが、次のコードは、そのマップから派生したシリーズを計算する 1 つの方法を示しています。リンク 2 の 2 ページ目に期間 n の定義が表示されます。このコードから、代わりに実数空間で簡単に作業できることがわかるはずです (その場合、matlab 関数ratは有理数を回復します)。実数からの近似値)。

[編集] バイナリ シーケンスが明示的に作成されました!

% start at some point on period-n orbit
period = 6;
num = 3;
den = 2^period-1;

% compute for this many steps of the sequence
num_steps = 20;

% for each step
for n = 1:num_steps

    % * 2
    num = num * 2;

    % mod 1
    if num >= den
        num = num - den;
    end

    % simplify rational fraction
    g = gcd(num, den);
    if g > 1
        num = num / g;
        den = den / g;
    end

    % recover 8-bit binary representation
    bits = 8;
    q = 2^bits;
    x = num / den * q;
    b = dec2bin(x, bits);

    % display
    fprintf('%4i / %4i  ==  0.%s\n', num, den, b);

end

ああ...完全を期すために、ここに実数値のバージョンがあります。純粋数学者は今すぐ目をそらすべきです。

% start at some point on period-n orbit
period = 6;
num = 3;
den = 2^period-1;

% use floating point approximation
x = num / den;

% compute for this many steps of the sequence
num_steps = 20;

% for each step
for n = 1:num_steps

    % apply map
    x = mod(x*2, 1);

    % display
    [num, den] = rat(x);
    fprintf('%i / %i\n', num, den);

end

そして、追加のクレジットとして、なぜこの実装は速いのに馬鹿げているのでしょうか? (ヒント: num_steps を 50 に設定してみてください)...

% matlab vectorised version
period = 6;
num = 3;
den = 2^period-1;
x = zeros(1, num_steps);
x(1) = num / den;
y = filter(1, [1 -2], x);
[a, b] = rat(mod(y, 1));
disp([a' b']);

OK、これは質問ではなく回答であるはずなので、自分の質問に答えましょう...

Matlab の組み込み (および高度に最適化された)filter関数を使用して反復を処理するため、高速です (つまり、実際には、反復は M スクリプトではなく C で行われます)。Matlab では常に覚えておく価値がfilterあります。フィルタリングの問題のようには見えないアプリケーションに、それがどのように有効に使用されるかに常に驚かされます。filterただし、条件付き処理を行うことはできず、モジュロ演算をサポートしていません。単純に、このマップには、入力の全期間が出力の全期間にマップされるというプロパティがあるためです (マップ操作が整数で乗算されるため)。

前述の精度の問題にすぐにぶつかるので、それはばかげています。50 に設定num_stepsして、間違った答えが出始めるのを見てください。何が起こっているかというと、フィルター演算内の数値が非常に大きくなり (10^14 のオーダー)、実際に気にするビット (小数部分) が同じ倍精度変数で表現できなくなっています。

この最後のビットは、ちょっとした気晴らしのようなものです。これは、数学よりも計算に関係しています。シンボル シーケンスに関心がある場合は、最初の実装に固執してください。

于 2015-05-12T12:15:38.950 に答える
4

有理数型の出力のみを扱いたい場合は、最初に系列の開始項を有理数に変換する必要があります (そうでない場合)。あなたはそれを行うことができます:

[N,D] = rat(x0) ;

分子Nと分母があればD、 series を計算するのは非常に簡単でx(k+1)=mod(2*x(k), 1)、ループも必要ありません。

部分2*x(k)の場合、すべてがNumerator(k)連続する 2 のべき乗で乗算されることを意味します。これは、行列の乗算 (またはbsxfun関数の恋人の場合) によって実行できます:
そう2*x(k)=> Matlab ではN.*(2.^(0:n-1))(N はスカラー、x0 の分子、nは計算する項の数です)。

このMod1演算は有理数に変換するのも簡単です: mod(x,1)=mod(Nx,Dx)/Dx(NxそしてDxの分子と分母ですx.

分母を単純化する必要がない場合は、級数のすべての分子を 1 行で取得できます。

xn = mod( N.*(2.^(0:n-1).'),D) ;

しかし、見やすくするために単純化した方がよい場合もあるので、次の関数を検討してください。

function y = dyadic_rat(x0,n)

   [N,D] = rat(x0) ;                   %// get Numerator and Denominator of first element
   xn = mod( N.*(2.^(0:n-1).'),D) ;    %'// calculate all Numerators
   G = gcd( xn , D ) ;                 %// list all "Greatest common divisor"
   y = [xn./G D./G].' ;                %'// output simplified Numerators and Denominators

あなたのウィキ リンク ( x0=11/24) に示されている例から始めると、次のようになります。

>> y = dyadic_rat(11/24,8)
y =
    11    11     5     2     1     2     1     2
    24    12     6     3     3     3     3     3

Rattus Ex Machina ( )の例から始めるとx0=3/(2^6-1)、同じ結果が得られます。

>> y = dyadic_rat(3/63,8)
y =
     1     2     4     8    16    11     1     2
    21    21    21    21    21    21    21    21
于 2015-05-12T17:30:57.637 に答える