首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Matlab中更新fmincon中的非线性约束数

在Matlab中更新fmincon中的非线性约束数
EN

Stack Overflow用户
提问于 2015-12-24 20:13:45
回答 3查看 1.1K关注 0票数 1

我尝试在while循环中使用fmincon,这样在while条件不满足之前,必须执行fmincon。每次fmincon不能满足特定条件(例如,x(N)-7.6==Tol)时,应更新(增加)非线性约束的数量N。使用fmincon如何做到这一点呢?假设我最初有18个非线性等式(ceq(1) ... ceq(18))。当while条件不能满足时,应在下一次迭代中将非线性方程组的数目增加到23 (ceq(1) ... ceq(23))。

你的创新想法……让我们给你更多关于我想做什么的细节。我有一些非线性代数方程,所以我需要使用NLP (非线性规划)求解器。此外,我的成本函数是最小时间问题。实际上,我的非线性约束方程是一些在时间坐标上离散化的动态控制方程。N是离散化的数量。基于拉格朗日优化技术,在系统中加入标量函数的梯度(拉格朗日),以求最优解。正如我在问题中提到的,我需要用首字母N来测试我的问题,然后如果fmincon的Xoutput不能满足约束,它需要增加描述的数量。它继续下去,直到fmincon的输出最优答案足够接近我想要的答案。

EN

回答 3

Stack Overflow用户

发布于 2015-12-25 20:03:48

剥开洋葱皮,在我看来,你的问题并没有解决你真正的问题,而且你正在以某种错误的方式来解决你的问题。你如何用数字解决问题与你如何分析解决问题是相关的,但又有很大的不同,用手写出方程。请看我在结尾处的进一步评论,我建议与同学、实验室的同学和/或教授交谈。

几条评论:

  1. 您的目标函数@(x) norm(myfoctest(x))将始终返回0,因为[]将返回空数组[]作为其第一个参数,并且在Matlab中,norm([])被定义为0。

  1. 而不是minimize 0 subject to f(x)==0,看起来你打算解决问题minimize norm(f(x)) subject to f(x)==0?在这种情况下,我不理解约束f(x)==0的用途。为什么不使用minimize norm(f(x))

在你的函数中,为什么Ceq(2*N)=x(5*N+12)-x(5*N+11)-x(4*N+2)会在myfoctest循环中?您将x(32)- x(31) - x(18)的值赋给Ceq(8)四次(例如,对于j=1:4)。这是你想要的吗?这个错误告诉我,您编写myfoctest.的方式中可能还有其他错误

  1. 许多这样的约束都是线性约束。将它们作为非线性约束输入将使fmincon的工作更加困难。

  1. ,我不知道最初的问题,但我觉得你是在用一种随意的,扭曲的方式来数值求解。我只看了一下代码就发现了几个错误,如果我真的理解了这个问题,我会担心还有更多的错误。

  1. ,你有5*N+13变量和5*N+13非线性等式约束。你的可行集合可能是一个单点!题外话:许多优化算法从一个可行点开始,然后朝着可行的方向前进一步。如果可行集是一个点,就没有可行的方向...在你的问题中,整个游戏就是找到一个可行点(如果它确实存在的话)?!

  1. 我怀疑主要的问题是你需要“在Matlab中更新fmincon中的非线性约束的数量”。

听起来像是你计算了拉格朗日函数的一阶条件,然后你输入这些条件作为优化问题的约束条件?,,

  1. ?如果是这样的话,这很可能不是解决numerically.

应该做的事情

一些建议..。

  1. 我认为你需要回到起点:以一种干净的方式写下你想要解决的问题,然后找出如何以有效的方式用数字来解决它。我的直觉反应是,到目前为止,这是一个有点混乱的局面。

进一步评论

假设你有一些最小化问题(例如。最优控制问题):

代码语言:javascript
运行
AI代码解释
复制
minimize f(x) subject to g(x) <= 0.

其中f,g和凸,斯莱特条件成立,一阶条件是达到最小值的必要条件和充分条件。你可以用数学方法解决这个问题,并得到一些一阶条件:

代码语言:javascript
运行
AI代码解释
复制
dL/dx = 0

你可能认为数值解决这个问题的方法是数值求解dL/dx方程组(来自FOC)。如果dL/dx是一个线性方程组,这可能是真的,但一般来说,这通常是解决问题的一种棘手的方法。相反,您希望将fg直接提供给优化算法。

要牢记的一般要点:

fast.

  • Solving
  • 解线性方程组是有效的,而解决凸优化问题是有效和快速的。
  • 一般来说,求解非线性方程组或非凸优化问题可能是可怕的,可怕的问题。
票数 1
EN

Stack Overflow用户

发布于 2015-12-24 23:59:59

你有两个案子。在第一种情况下,某些条件得到满足,而在第二种情况下,则不满足。使while语句在每种情况下都保持正确。在您的循环中添加标志变量,如果您的条件不满足,该变量将更改其值。例如,您可以将如下内容放入:

代码语言:javascript
运行
AI代码解释
复制
flag = (x(N)-7.6<Tol);

如果满足条件,则返回1,否则返回0

在您的mycon函数中,添加flag作为输入变量:

代码语言:javascript
运行
AI代码解释
复制
function [c,ceq] = mycon(all_variables_you_had_before,flag)

然后,在mycon中添加逻辑块,如下所示:

代码语言:javascript
运行
AI代码解释
复制
if flag == 1
    ceq = [___]; %//put your 18 conditions here
else
    ceq = [___]; %//put your 23 conditions here
end

最后,不要忘记在主脚本的fmincon行中添加mycon(all_variables_you_had_before,flag)

代码语言:javascript
运行
AI代码解释
复制
x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@(all_variables_you_had_before) mycon(all_variables_you_had_before,flag))

因此,如果满足条件,您的fmincon将照常获得约束。但是如果条件不满足,约束条件就会改变。希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2015-12-25 12:12:44

代码语言:javascript
运行
AI代码解释
复制
function [x]=runnested(x0,N)
 r=ones(4,1);
N=length(r);
Tol=0.001;
for k=1:N
for i=1:N
x0=rand(5*N+13,1)
options = optimset('Largescale','off','algorithm','interior-point','Display','iter');
[x(i,:),fval,exitflag,output]=fmincon(@(x) norm(myfoctest(x)),x0,[],[],[],[],[],[],@myfoctest,options)
end
if x(N)-7.61<=Tol
  break;
else
  N=N+1;  
end
 end
 function [C,Ceq]=myfoctest(x,N,r)
 C=[];
 r=ones(4,1); 
N=length(r);
f=3.5e-6; %km/s^2
i1=10*(pi/180); 
Ts=110;    %sec   
V0=7.79;    %km/sec
a1=7.61;         %km/sec
b1=0.01*a1;
a2=20*(pi/180);  % rad      %10 deg
b2=0.01*a2;  %rad 
Omeg0=10*(pi/180);  %rad
Ceq=zeros(5*N+13,1);     
   for j=1:N-1
    Ceq(j)=x(3*N+1+j)-  x(3*N+j)-2*x(4*N+1+j)*Ts*f*sin(x(2*N+1+j))./(pi*sin(i1)*x(j)^2)
    Ceq(N)=x(5*N+10)-x(5*N+9)-x(3*N+2)   %x(5*N+10)-x(5*N+9)-x(4*N+7)
    Ceq(N+j)=x(4*N+1+j)-x(4*N+j)
    Ceq(2*N)=x(5*N+12)-x(5*N+11)-x(4*N+2)
    Ceq(2*N+1)=x(3*N+1)*Ts*f*sin(x(2*N+1))+2*x(4*N+1)*Ts*f*cos(x(2*N+1))/(pi*V0*sin(i1))
    Ceq(2*N+1+j)=x(3*N+1+j)*Ts*f*sin(x(2*N+1+j))+2*x(4*N+1+j)*Ts*f*cos(x(2*N+1+j))./(pi*x(j)*sin(i1))
    Ceq(3*N+1)=1-x(5*N+9)*b1-x(5*N+10)*b1-x(5*N+11)*b2-x(5*N+12)*b2-x(5*N+8)*N*Ts/100-x(5*N+13)
    Ceq(3*N+2)=-2*x(5*N+8)*x(5*N+2)
    Ceq(3*N+3)=-2*x(5*N+9)*x(5*N+3)
    Ceq(3*N+4)=-2*x(5*N+10)*x(5*N+4)
    Ceq(3*N+5)=-2*x(5*N+11)*x(5*N+5)
    Ceq(3*N+6)=-2*x(5*N+12)*x(5*N+6)
    Ceq(3*N+7)=2*x(5*N+13)*cos(x(5*N+7))*sin(x(5*N+7))
    Ceq(3*N+8)=V0-x(1)-Ts*f*cos(x(2*N+1))
    Ceq(3*N+8+j)=x(j)-x(j+1)-Ts*f*cos(x(2*N+1+j))
    Ceq(4*N+8)=Omeg0-x(N+1)+2*Ts*f*sin(x(2*N+1))/(pi*V0*sin(i1))
    Ceq(4*N+8+j)=Omeg0-x(j+1)+2*Ts*f*sin(x(2*N+1+j))./(pi*x(j)*sin(i1))
    Ceq(5*N+8)=-x(5*N+2)^2-N*Ts/100-N*Ts*x(3*N+1)/100
    Ceq(5*N+9)=-x(5*N+3)^2-x(N)+a1+b1-b1*x(3*N+1)+7.61/100
    Ceq(5*N+10)=-x(5*N+4)^2+x(N)+a1+b1-b1*x(3*N+1)-7.61/100
    Ceq(5*N+11)=-x(5*N+5)^2-x(2*N)+a2+b2-b2*x(3*N+1)+0.35/100
    Ceq(5*N+12)=-x(5*N+6)^2+x(2*N)+a2+b2-b2*x(3*N+1)-0.35/100
    Ceq(5*N+13)=-(sin(x(5*N+7)))^2-x(5*N+1)
   end
  end
 end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34457517

复制
相关文章
Chrome 78 (谷歌浏览器 ) 进入暗黑模式
Google 正在 Chrome 78 Canary 版本中测试一项新功能,该功能将为任何网站提供黑暗模式,无论它们本身是否支持。
卓越笔记
2023/02/18
7670
Chrome 78 (谷歌浏览器 ) 进入暗黑模式
Chrome调试
5. 伪类选择器样式修改: 1. 在 Elements 中找到对应元素,右键选择 Force state,再选择伪类,如:hover,即可强制变样式,而伪类样式也可在 Styles 下进行修改
赤蓝紫
2023/01/01
1.6K0
Chrome调试
.NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
在 Windows 系统中,一段时间不操作键盘和鼠标,屏幕便会关闭,系统会进入睡眠状态。但有些程序(比如游戏、视频和演示文稿)在运行过程中应该阻止屏幕关闭,否则屏幕总是关闭,会导致体验会非常糟糕。
walterlv
2023/10/22
9380
.NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
进入chrome商店方法
补充更正,前面的别的方法,现在已经不可用了,大家可以在这个国内网址下载浏览器插件:
川川菜鸟
2021/10/18
2.2K0
如何使用chrome浏览器调试?
在chrome浏览器中打开http://localhost:3000,按F12,或者右击->单击【检查】.
贺贺V5
2018/08/21
1K0
如何使用chrome浏览器调试?
Android 功耗(8)---如何找到阻止进入deep idle SODI的元凶
从节点中确认:/sys/kernel/debug/cpuidle/dpidle_state
233333
2020/09/23
9000
Chrome 调试技巧
想必大家都在用console.log在控制台输出点东西,其实console还有其它的方法:
前端教程
2018/10/25
2.4K0
Chrome 调试技巧
Chrome调试技巧
一、如何查看dom元素的事件 某种情况我们在页面交互上发现一个问题,肯定是非常想知道这个交互触发执行的入口,这会使我们更直接、快速的进行代码的跟踪、调试和分析。其实在chrome浏览器这很简单就实现了
sam dragon
2018/06/21
1.4K0
Chrome断点调试
断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了。操作起来似乎很简单,其实很多人纠结的是,是在哪里打断点?(我们先看一个断点截图,以chrome浏览器的断点为例)
全栈程序员站长
2022/08/31
4.7K0
Chrome断点调试
如何让程序能进入c库调试
今天想看看linux的c库源码,但是那源码结构比较乱,跳来跳去比较难看。于是想写个小程序进入c库调试,发现要调试c库还不容易。
用户4766018
2022/08/19
8010
一键进入高通9008模式_如何进入高通模式
actuator_sensitivity invalid时, 无法启用pdaf support 那么这个问题是哪里来的呢? sensor初始化的时候 我们可以发现 计算actuator_sensitivity的过程
全栈程序员站长
2022/10/03
1.3K0
Chrome代码调试指南
安装此插件后,如果网页是由 react 开发的,那么开发者工具会多出一个 react 的选项,并且插件图标是点亮的。
Dreamy.TZK
2020/08/20
2.3K0
Chrome代码调试指南
使用chrome调试CSS
chrome devtools 是前端开发再也熟悉不过的调试工具了。那么我们究竟有多了解它,这里总结了一些常用的CSS调试操作。
怪兽
2022/09/20
5.6K0
使用chrome调试CSS
chrome调试JavaScript脚本
随着 JavaScript 应用的复杂性逐渐提高,开发者需要有力的调试工具来帮助他们快速发现问题的原因,并且能高效地修复它。Chrome DevTools 提供了一系列实用的工具使得调试 JavaScript 应用不再是一件痛苦的事。
空空云
2018/09/27
1.9K0
chrome调试JavaScript脚本
Chrome 调试技巧简记
ctrl + shift + P 打开命令面板,搜索 screen 可进行各类截图,包括节点截图、区域截图和全屏截图
Chor
2020/02/20
1.1K0
如何破解 Google Chrome 的隐身模式?
随着Chrome 76的发布,谷歌修复了一个漏洞:允许网站检测访问者是否使用了隐身模式。然而,这些方法仍然可以检测到Google Chrome无痕模式。
axiomxs
2021/11/26
9280
如何从Hadoop安全模式中进入正常模式
发现问题: 在Hadoop中,新建一个目录,报错了,提示mkdir: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory
星哥玩云
2022/07/01
9000
点击加载更多

相似问题

平滑曲线

11

使用gnuplot获得平滑曲线

128

Python平滑曲线

27

绘制平滑曲线

12

如何平滑曲线

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文