在matlab中进行优化:找出约束方程

时间:2012-11-05 13:49:26

标签: matlab optimization constraints

我有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中调用一个能处理多个约束的优化函数,但到目前为止还没有找到一个,那就没关系。

1 个答案:

答案 0 :(得分:1)

你说优化算法需要调整q,以便在上述等式也成立的同时最小化“真实”问题。

请注意fifth Euclid axoim确保所有行始终与所有其他行相交,除非两个q相等但相应的y0不相等。最后一种情况是如此罕见(在浮点上下文中),我将在此处跳过它,但为了增加稳健性,最终应该包含它。

现在,首先,考虑矩阵。您的约束可以通过矩阵方程式来表达:

y = tan(q)*x + y0

其中qyy0[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

或类似的技巧。这真的取决于问题的其余部分,优化器将找到每个案例的难度。