如何在这些约束条件下生成随机的matlab向量

如何在这些约束条件下生成随机的matlab向量,matlab,math,random,inverse-kinematics,Matlab,Math,Random,Inverse Kinematics,我在Matlab中创建随机向量V时遇到问题,需要遵守以下一组约束条件:(给定参数N,D,L和theta) 向量V的长度必须为N单位 元素的平均值必须为theta 两个连续元件之间的差异不得超过+/-10 D==sum(L*cosd(V-θ)) 最后一个问题我最多。有什么想法吗 编辑 其他语言或方程形式的解也同样可以接受。Matlab对我来说只是一个方便的原型工具,但最终的算法将是java 编辑 从评论和初步回答中,我想补充一些澄清和初步想法 我不是从任何标准分布中寻找“真正随机”的解决方案。我想

我在Matlab中创建随机向量
V
时遇到问题,需要遵守以下一组约束条件:(给定参数
N
D
L
theta

  • 向量
    V
    的长度必须为
    N
    单位
  • 元素的平均值必须为
    theta
  • 两个连续元件之间的差异不得超过+/-10
  • D==sum(L*cosd(V-θ))
  • 最后一个问题我最多。有什么想法吗

    编辑
    其他语言或方程形式的解也同样可以接受。Matlab对我来说只是一个方便的原型工具,但最终的算法将是java

    编辑
    从评论和初步回答中,我想补充一些澄清和初步想法

    我不是从任何标准分布中寻找“真正随机”的解决方案。我想要一个伪随机生成的值序列,满足给定参数集的约束

    我试图近似的系统是一个由N个链环组成的链环,链环长度为L,链环的末端在θ方向上远离另一端

    我在这里的初步见解是,θ可以从考虑中删除,直到结束,因为(2)本质上是将θ添加到0平均向量V的每个元素(将平均值移动到θ),并且(4)只是再次删除该平均值。所以,如果你能找到θ=0的解,那么所有θ的问题都解决了

    根据要求,这里是一个合理的参数范围(不是硬约束,而是典型值):

    5您没有给我们提供太多的细节,因此我假设如下:

    • 随机数从
      [-127+θ+127θ]
    • 所有随机数将从均匀分布中提取
    • 所有随机数的类型均为
      int8
    然后,对于前3个需求,您可以使用:

    N = 1e4;
    theta = 40;
    diffVal = 10;
    
    g = @() randi([intmin('int8')+theta  intmax('int8')-theta], 'int8') + theta;
    V = [g(); zeros(N-1,1, 'int8')];
    for ii = 2:N
        V(ii) = g();
        while abs(V(ii)-V(ii-1)) >= diffVal
            V(ii) = g();
        end
    end
    
    内联匿名函数以提高速度

    现在,最后一个要求

    D == sum(L*cos(V-theta))
    
    这有点奇怪…
    cos(V-theta)
    是一种将数据重新缩放到
    [-1+1]
    间隔的特定方法,然后与
    L
    相乘将缩放到
    [-L+L]
    。乍一看,
    sum
    的平均值为
    0

    然而,当
    x
    [0 2*pi]
    中均匀分布的随机变量时,
    cos(x)
    的预期值为
    2/pi
    (参见示例)。暂时忽略我们的极限与
    [0 2*pi]
    不同的事实,
    总和(L*cos(V-theta))
    的期望值将简单地减少到
    2*N*L/pi
    的恒定值


    我无法理解你如何强迫它等于其他常数,你能再详细解释一下吗

    这里有一个方法。很明显,并非θ、N、L和D的所有组合都有效。很明显,您正在尝试模拟非常复杂的随机对象。您可能很难显示与这些向量相关的任何有用信息

    您试图模拟的系列似乎类似于。所以我从那开始,你可以从任何随机但合理的东西开始。然后我用它作为优化的起点,试图满足2,3和4。初始值越接近有效向量(满足所有条件),收敛性越好

    function series = generate_series(D, L, N,theta)
    s(1) = theta;
    for i=2:N,
        s(i) = s(i-1) + randn(1,1);
    end
    f = @(x)objective(x,D,L,N,theta)
    q = optimset('Display','iter','TolFun',1e-10,'MaxFunEvals',Inf,'MaxIter',Inf)
    [sf,val] = fminunc(f,s,q);
    val
    series = sf;
    
    
    
    function value= objective(s,D,L,N,theta)
    a = abs(mean(s)-theta);
    b = abs(D-sum(L*cos(s-theta)));
    c = 0;
    for i=2:N,
        u =abs(s(i)-s(i-1)) ;
        if u>10,
            c = c + u;
        end
    end
    value = a^2 + b^2+ c^2;
    

    你似乎试图模拟一些非常复杂/奇怪的东西(给定曲率的路径?),请参见其他评论者的问题。但是,您必须使用您的领域知识将D和L与合理的mu和sigma连接起来,以便Wiener充当初始化。

    我将首先创建一个“有效”向量。这应该是可能的——比如说,为每个条目计算相同的值

    一旦你得到了那个向量,我会应用一些变换来“洗牌”它。“”是关键字-如果洗牌违反了你的规则之一,你就不做

    当我提出转换时:

    • 切换两个条目
    • 修改一个条目的值,并修改第二个条目以保持第四个条件(理论上,您可以只洗牌两个条目,直到满足该条件-但发生的几率非常低)
    但也许你能找到更多


    经常这样做,你会得到一个“有效”的随机向量。理论上,你应该能够得到所有有效的向量——实际上,你可以尝试构造几个“开始”向量,这样就不会花那么长时间。

    因此,根据你的新要求,你实际上寻找的似乎是一个随机角度的有序列表,角度的最大变化为10度(我首先将其转换为弧度),以便指定从起点到终点的距离和方向以及链接长度和链接数量

    模拟初始猜测。它不适用于D和θ约束(即指定的D和指定的θ)

    使用遗传算法(或其他优化)根据以下成本函数调整角度:

    dx = sum(L*cos(angle));
    dy = sum(L*sin(angle));
    
    D = sqrt(dx^2 + dy^2);
    theta = atan2(dy/dx);
    
    现在,成本只是上面my
    D
    theta
    给出的向量与指定的
    D
    theta
    给出的向量(即输入)之间的差值

    您仍然需要强制执行最大变化10度规则,如果违反该规则,可能会使成本函数变得巨大?也许有一种更干净的方法可以在优化算法中指定序列约束(我不知道如何)


    我觉得如果你能用正确的参数找到正确的优化,这应该能够模拟你的问题。

    什么是
    L
    ,以及
    D
    与分布的关系如何?前三个a
    dx = sum(L*cos(angle));
    dy = sum(L*sin(angle));
    
    D = sqrt(dx^2 + dy^2);
    theta = atan2(dy/dx);