声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2861|回复: 5

[工具箱] 有偿求助:fmincon函数得不到满意的解 ??

[复制链接]
发表于 2008-7-17 17:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
大家好,我在用fmincon函数遇到了点问题,烦请各位高手给提供点建议,编写的三个函数文件在附件中
一个为目标函数,一个为约束函数,一个为fmincon优化函数。另一个为计算超调量和调节时间的函数。
[x,f] = fmincon(@Con_stru_NonLinF,x0,[],[],[],[],lb,ub,@Stru_ConNLinCon,options)

目标函数 Con_stru_NonLinF ,是设计变量  x (R = x(1); kp = x(2); ki = x(3); kd = x(4);r=x(5);j=x(6);J_motor=x(7);)的函数 ,约束函数 Stru_ConNLinCon 中的非线性不等式C(1),C(2),C(3) ,C(4),C(5),C(6) 不是直接给定的,是通过 z = fsolve(@Cons_Equ,z0,optimset('MaxFunEvals',1e10,'MaxIter',1e4))
每次求解新的z值来保证。Cons_Equ(x)函数是求解 z 的。
这个函数最终根据求出的x值计算超调量(<1%)和调节时间的(几乎为 0),问题是经过多次迭代后虽然得出一组数据但不满足超调量和调节时间很小。
迭代中出现这样的提示:Norm of relative change in X is less than max(options.TolX^2,eps) but
sum-of-squares of function values is greater than or equal to sqrt(options.TolFun)
Try again with a new starting guess.

Maximum number of function evaluations exceeded;
increase OPTIONS.MaxFunEvals.
fsolve在解非线性方程组时也会出现上面的提示,我认为有可能是在用fsolve解 z 时 有可能无解或出现复数根,而fmincon要求为实变量,这样会出现迭代错误得不到理想结果。
怎么才能判断 无解或复根  并且跳过这个点,选择一个好的点迭代?
或是不用这种方法解,用别的方法 如遗传算法。
这个问题是基于主导极点控制器 设计,困扰我好多天了,实在很头疼,加上时间有限,若有人能帮我解决,我会给予一定报酬的 希望matlab 高手联系我 我的QQ是927370837

[ 本帖最后由 meiemila123 于 2008-7-17 19:30 编辑 ]

Con_Stru_NonLinF.m

920 Bytes, 下载次数: 10

目标函数

Stru_ConNLinCon.m

5.95 KB, 下载次数: 9

约束函数

Integrate_con_stru.m

1.41 KB, 下载次数: 6

fmincon优化函数

7次最后step ,bode 320.m

1.29 KB, 下载次数: 7

阶跃图像 bode图 超调量 调节时间函数

回复
分享到:

使用道具 举报

发表于 2008-7-17 21:11 | 显示全部楼层

回复 楼主 的帖子

建议换一个优化方法,有一个序列的二次规划线性搜索方法,你可以试一下,精度很高的

评分

1

查看全部评分

 楼主| 发表于 2008-7-18 09:55 | 显示全部楼层

回复 2楼 的帖子

多谢管理员的建议。

fimincon就是用SQP 方法 二次规划线性搜索方法
发表于 2008-7-18 10:56 | 显示全部楼层
建议用1stOpt试一下。
 楼主| 发表于 2008-7-18 17:44 | 显示全部楼层

回复 4楼 的帖子

dingd
能不能给传个软件啊,我下的是版本 打不开帮助文档
发表于 2008-9-19 10:23 | 显示全部楼层

Con_Stru_NonLinF.m 函数有问题

t = 0:0.001:Ta;
i = size(t);
... ...
for i=1:i(2)
e(i) = exp(-Ksi*Omga.*t(i))*sin(Omga*sqrt(1-Ksi^2).*t(i)+acos(Ksi))/(sqrt(1-Ksi^2)); % Step response for 2nd order System
A =  e(i).^2;      % Just take error and weight into consideration
end
这里的i有歧义,不能这么用,结果会有问题
换成下面试试看
for j=1:i(2)
e(j) = exp(-Ksi*Omga.*t(j))*sin(Omga*sqrt(1-Ksi^2).*t(i)+acos(Ksi))/(sqrt(1-Ksi^2)); % Step response for 2nd order System
A =  e(j).^2;      % Just take error and weight into consideration
end

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-29 22:19 , Processed in 0.093799 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表