如何在这些约束条件下生成随机的matlab向量
我在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 编辑 从评论和初步回答中,我想补充一些澄清和初步想法 我不是从任何标准分布中寻找“真正随机”的解决方案。我想
V
时遇到问题,需要遵守以下一组约束条件:(给定参数N
,D
,L
和theta
)
V
的长度必须为N
单位theta
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);
现在,成本只是上面myD
和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);