首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在matlab中进行优化:求解约束方程

在matlab中进行优化:求解约束方程
EN

Stack Overflow用户
提问于 2012-11-05 21:49:26
回答 1查看 391关注 0票数 1

我有N条直线,由y-截距和角度q定义。约束是所有N条直线必须在一点相交。我能想出的最终得到约束的方程式如下:

代码语言:javascript
运行
复制
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的约束。我从这三个方程开始:

代码语言:javascript
运行
复制
Y = tan(q(1))X + y(1)
Y = tan(q(2))X + y(2)
Y = tan(q(3))X + y(3)

然后我将它们设置为相等,并得到这些方程:

代码语言:javascript
运行
复制
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并得到这个约束:

代码语言:javascript
运行
复制
(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中的优化函数来处理多个约束,但到目前为止还没有找到一个,这是可以的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-05 22:42:41

你说优化算法需要调整q,使“真实”问题最小化,同时上面的方程也成立。

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

现在,首先,从矩阵的角度考虑。您的约束可以通过矩阵方程来表示:

代码语言:javascript
运行
复制
y = tan(q)*x + y0

其中qyy0[Nx1]矩阵,x是未知标量。注意y = c*ones(N,1),例如,只包含相同常量的矩阵。这实际上是一个非线性约束--也就是说,它不能表示为

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
x(n,m) = (y0(n)-y0(m)) / (q(m)-q(n))

您的nonlcon函数应该为所有可能的对n,m找到x,并检查它们是否都相等。您可以很方便地这样做,如下所示:

代码语言:javascript
运行
复制
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的工作。

您将需要做一些实验,因为有时定义

代码语言:javascript
运行
复制
x = x(~isnan(x));
ceq = norm(x-x(1)); % e.g., only 1 equality constraint

这会更快(需要计算的导数更少),但其他问题确实需要

代码语言:javascript
运行
复制
x = x(~isnan(x));
ceq = x-x(1); % e.g., N constraints

或者类似的把戏。这真的取决于问题的其余部分,优化器会发现每种情况有多难。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13233457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档