我有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,我得到超过2个等于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中调用一个能处理多个约束的优化函数,但到目前为止还没有找到一个,那就没关系。
答案 0 :(得分:1)
你说优化算法需要调整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:
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)受试者 最小化非线性不等式c(x)或等式ceq(x) 在nonlcon中定义。 fmincon优化使得c(x)≤0且ceq(x)= 0.如果不存在边界,请设置lb = []和/或ub = []。
请注意,您实际上正朝着正确的方向前进。您可以使用以下等式求解x
- 任何一对线q(n),y0(n)
和q(m),y0(m)
的交点的位置:
x(n,m) = (y0(n)-y0(m)) / (q(m)-q(n))
您的nonlcon
函数应为所有可能的对x
找到n,m
,并检查它们是否全部相等。你可以这样方便地做到这一点:
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
或类似的技巧。这真的取决于问题的其余部分,优化器将找到每个案例的难度。