我有N条直线,由y-截距和角度q定义。约束是所有N条直线必须在一点相交。我能想出的最终得到约束的方程式如下:
Y = tan(q(1))X + y(1)
Y = tan(q(2))X + y(2)
...如果N=3或4,我可以手动得到约束,但如果N大于4,我就很难得到一个约束。如果N=3或4,那么当我求解上面关于X的方程时,我得到了2个方程,然后可以将它们设置为相等。如果N> 4,我得到两个以上等于X的方程,我不知道如何将它们压缩为一个约束。如果我不能将它们压缩到一个约束中,并且能够用动态创建的多个约束来解决优化问题(取决于传入的N),那也没问题。
为了更好地理解我在做什么,我将展示如何获得N= 3的约束。我从这三个方程开始:
Y = tan(q(1))X + y(1)
Y = tan(q(2))X + y(2)
Y = tan(q(3))X + y(3)然后我将它们设置为相等,并得到这些方程:
tan(q(1))X + y(1) = tan(q(2))X + y(2)
tan(q(2))X + y(2) = tan(q(3))X + y(3)然后我求解X并得到这个约束:
(y(2) - y(1)) / (tan(q(1)) - tan(q(2))) = (y(3) - y(2)) / (tan(q(2)) - tan(q(3)))请注意,对于X,我有2个方程要解。当N>4时,我最终得到2个以上的方程。如果我能够动态创建约束,然后调用MATLAB中的优化函数来处理多个约束,但到目前为止还没有找到一个,这是可以的。
发布于 2012-11-05 22:42:41
你说优化算法需要调整q,使“真实”问题最小化,同时上面的方程也成立。
请注意,fifth Euclid axoim确保所有行始终与所有其他行相交,除非两个q相等但相应的y0不相等。最后一种情况非常少见(在浮点上下文中),我将在这里跳过它,但为了增加健壮性,您最终应该将其包括在内。
现在,首先,从矩阵的角度考虑。您的约束可以通过矩阵方程来表示:
y = tan(q)*x + y0其中q、y和y0是[Nx1]矩阵,x是未知标量。注意y = c*ones(N,1),例如,只包含相同常量的矩阵。这实际上是一个非线性约束--也就是说,它不能表示为
A*q <= b or A*q == b用A表示设计矩阵,用b表示解向量。因此,您必须编写一个定义此非线性约束的函数,并将其传递给fmincon等优化器。来自the documentation:
fmincon优化使得c(x)≤0和ceq(x) =0。如果不存在边界,则设置lb = []和/或ub = []。
请注意,您实际上是在朝着正确的方向前进。您可以使用以下等式求解任意一对直线q(n),y0(n)和q(m),y0(m)的交点的x-location:
x(n,m) = (y0(n)-y0(m)) / (q(m)-q(n))您的nonlcon函数应该为所有可能的对n,m找到x,并检查它们是否都相等。您可以很方便地这样做,如下所示:
function [c, ceq] = nonlcon(q, y0)
% not using inequalities
c = -1; % NOTE: setting it like this will always satisfy this constraint
% compute tangents
tanq = tan(q);
% compute solutions to x for all pairs
x = bsxfun(@minus, y0, y0.') ./ -bsxfun(@minus, tanq, tanq.');
% equality contraints: they all need to be equal
ceq = diff(x(~isnan(x))); % NOTE: if all(ceq==0), converged.
end请注意,您实际上并没有显式地求解q (或者根本不需要交叉点的y坐标) --这都是fmincon的工作。
您将需要做一些实验,因为有时定义
x = x(~isnan(x));
ceq = norm(x-x(1)); % e.g., only 1 equality constraint这会更快(需要计算的导数更少),但其他问题确实需要
x = x(~isnan(x));
ceq = x-x(1); % e.g., N constraints或者类似的把戏。这真的取决于问题的其余部分,优化器会发现每种情况有多难。
https://stackoverflow.com/questions/13233457
复制相似问题