首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab :如何将实数表示为二进制

Matlab :如何将实数表示为二进制
EN

Stack Overflow用户
提问于 2015-05-09 06:53:32
回答 2查看 701关注 0票数 6

问题:如何使用连续映射- Link1: Bernoulli移位映射来建模二进制序列?

概念:,并矢映射,也称为伯努利移位映射,表示为x(k+1) = 2x(k) mod 1。在Link2:符号动力学中,解释伯努利映射是一个连续映射,并用作移位映射。下文将对此作进一步解释。

数字轨迹可以通过将其划分为适当的区域并指定一个符号来表示。符号轨道是通过写下对应于其轨道中点所访问的连续分区元素的符号序列来获得的。人们可以通过研究系统的符号轨道来了解系统的动力学。此链接还表示Bernoulli移位映射用于表示符号动力学。

问题:

伯努利移位映射是如何用来生成二进制序列的?我尝试过这样做,但这不是Link2中的文档所解释的。因此,我获得了Map的数字输出,并以以下方式通过阈值化将其转换为符号:

代码语言:javascript
复制
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是阈值,称为Bernoulli映射的临界值。

我需要将实数表示为分数,正如在Link2第2页中解释的那样。

有人能告诉我如何应用Bernoulli移位映射来生成符号轨迹(也称为时间序列)吗?

如果我的理解有误,请纠正我。

如何将实数数值时间序列转换为符号化的时间序列,即如何使用伯努利映射来模拟双星轨道/time序列?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-12 12:15:38

您当然可以在实数空间中计算这一点,但是您可能会遇到精度问题(取决于起点)。如果你对研究轨道感兴趣,你可能更喜欢在有理分数表示中工作。有更有效的方法来做到这一点,但是下面的代码说明了计算从该映射派生出来的序列的一种方法。您将在链接2的第2页中看到周期-n的定义,您应该能够从这段代码中看到如何轻松地在实数空间中工作(在这种情况下,matlab函数rat将从实数恢复一个有理的近似)。

现在用二进制序列显式编辑

代码语言:javascript
复制
% 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

啊..。为了完整起见,这里是实值版本。纯粹的数学家现在应该把目光移开。

代码语言:javascript
复制
% 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).

代码语言:javascript
复制
% 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']);

好吧,这应该是一个答案,不是一个问题,所以让我们回答我自己的问题.

它的速度很快,因为它使用Matlab的内置(和高度优化的) filter函数来处理迭代(也就是说,在实践中,迭代是用C而不是M-脚本完成的)。在Matlab中总是值得记住filter,我经常感到惊讶的是,它如何被用于看起来不像过滤问题的应用程序。然而,filter不能进行条件处理,也不支持模块化算法,那么我们如何摆脱它呢?仅仅因为此映射具有在输入映射处的整个周期到输出时的整个周期的属性(因为映射操作被整数乘以)。

这是愚蠢的,因为它很快就会碰到上述的精确问题。将num_steps设置为50,然后看着它开始得到错误的答案。正在发生的是,过滤器操作中的数字越来越大(10^14阶),以至于我们真正关心的位(小数部分)不再能在同一个双精度变量中表示。

最后一点是一种转移,它更多的是与计算有关,而不是数学--如果你对符号序列感兴趣的话,坚持第一个实现。

票数 6
EN

Stack Overflow用户

发布于 2015-05-12 17:30:57

如果只想处理rational类型的输出,那么首先必须将系列的起始项转换为有理数(如果不是的话)。你可以这样做:

代码语言:javascript
复制
[N,D] = rat(x0) ;

一旦有了分子N和分母D,就很容易计算出级数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 (NxDxx的分子和分母)。

如果不需要简化分母,则可以在一行中得到该系列的所有分子:

代码语言:javascript
复制
xn = mod( N.*(2.^(0:n-1).'),D) ;

但是为了视觉上的舒适感,有时简化比较好,所以考虑以下功能:

代码语言:javascript
复制
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

如果我从您的wiki链接(x0=11/24)中提供的示例开始,我得到:

代码语言:javascript
复制
>> 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))给出的例子开始,我也得到了同样的结果:

代码语言:javascript
复制
>> y = dyadic_rat(3/63,8)
y =
     1     2     4     8    16    11     1     2
    21    21    21    21    21    21    21    21
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30136991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档