如何在这些约束下生成随机的MatLab向量

wljmcqd8  于 2022-11-15  发布在  Matlab
关注(0)|答案(4)|浏览(214)

我在MatLab中创建随机向量V时遇到了问题,受以下一组约束的约束:(给定参数NDLtheta)
1.向量V的长度必须为N个单位
1.元素的平均值必须为theta
1.任何两个连续元素的差值不得超过+/-10
1.D == sum(L*cosd(V-theta))
我对最后一部的问题最多。有什么主意吗?

编辑

其他语言或方程形式的解也同样可接受。MatLab对我来说只是一个方便的原型工具,但最终的算法将在Java中实现。

编辑

从评论和初步答复中,我想补充一些澄清和初步想法。
我并不是在从任何标准的发行版中寻找“真正随机”的解决方案。我想要一个伪随机生成的值序列,满足给定的参数集的约束。
我试图近似的系统是一个由N个链节组成的链条,链节长度为L,其中链条的一端与另一端在θ方向上的距离为D。
我在这里的初步见解是,直到最后都可以不考虑theta,因为(2)本质上是将theta加到0均值向量V的每个元素上(将均值移动到theta),而(4)只是再次去掉那个均值。所以,如果你能找到theta=0的解,那么所有theta的问题都解决了。
按照要求,下面是一个合理的参数范围(不是硬约束,而是典型值):
5<N<200
3<D<150
L==1
0 < theta < 360

w8f9ii69

w8f9ii691#

我会从创建一个“有效的”向量开始。这应该是可能的-比方说,计算每个条目具有相同的值。
一旦你得到了那个向量,我会应用一些变换来“洗牌”它。“Rejection sampling”是关键字--如果洗牌会违反你的规则之一,你就不会这么做。
作为我想出的转变:

  • 切换两个条目
  • 修改一个条目的值,并修改第二个条目以保持第四个条件(理论上,您可以只洗牌两个,直到条件满足-但发生的可能性相当低)

但也许你能找到更多。
合理地经常这样做,你就会得到一个“有效的”随机向量。从理论上讲,您应该能够获得所有有效的向量--实际上,您可以尝试构造几个“开始”向量,这样就不会花费太长时间。

stszievb

stszievb2#

这是一种方法。显然,并非所有theta、N、L和D的组合都是有效的。很明显,您正在尝试模拟相当复杂的随机对象。关于这些向量,您可能很难显示出任何有用的东西。
您尝试模拟的系列似乎类似于Wiener process。所以我从这个开始,你可以从任何随机但合理的东西开始。然后,我将其用作尝试满足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充当初始化。

r6vfmomb

r6vfmomb3#

因此,根据您的新要求,您实际上正在寻找的似乎是一个随机Angular 的有序列表,Angular 的最大变化为10度(我首先将其转换为弧度),以便指定从起点到终点的距离和方向,以及链接长度和链接数量?
模拟最初的猜测。它不能满足D和theta约束(即指定的D和指定的theta)

angles = zeros(N, 1)

for link = 2:N
    angles (link) = theta(link - 1) + (rand() - 0.5)*(10*pi/180)
end

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

dx = sum(L*cos(angle));
dy = sum(L*sin(angle));

D = sqrt(dx^2 + dy^2);
theta = atan2(dy/dx);

成本现在只是由上面的Dtheta给出的向量与由指定的Dtheta(即输入)给出的向量之间的差值。
你仍然必须执行最大变化10度的规则,也许这只会使成本函数变得巨大,如果违反了它?也许有一种更清晰的方法来指定优化算法中的序列约束(我不知道如何指定)。
我觉得如果您能找到具有正确参数的正确优化,这应该能够模拟您的问题。

3df52oht

3df52oht4#

您没有为我们提供太多要处理的细节,因此我将假设以下内容:

  • 随机数字将从[-127+theta +127-theta]中抽取
  • 所有随机数字将从均匀分布中抽取
  • 所有随机数都将是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(例如,参见here)。暂时忽略我们的限制与[0 2*pi]不同的事实,sum(L*cos(V-theta))的期望值将简单地减少到常量2*N*L/pi
我不明白如何才能“强迫”它等于其他一些常量D……你能更详细地解释一下吗?

相关问题