声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2634|回复: 9

[编程技巧] fmincon函数运行结果出现虚数如何解决

[复制链接]
发表于 2007-9-30 13:58 | 显示全部楼层 |阅读模式

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

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

x
本人在用fmincon函数进行求解有约束非线性优化问题时,运算结果出现虚数,导致迭代无法进行下去,想问问大家这是什么原因造成的,谢谢
下面是运行结果:

f =
9.969295967788237e+003



max
Directional
First-order

Iter F-count
f(x)
constraint
Step-size
derivative
optimality Procedure

f =
9.969295967788237e+003
…………
f =


5.727231211607951e+003 +8.476203429955743e+002i
…………

f =
5.727231211607951e+003 +8.476203429955743e+002i


1
152
5727.23
1.695e+004
0.125
-4.5e+004
3.54e+003
infeasible

[ 本帖最后由 eight 于 2007-9-30 15:00 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-10-1 17:20 | 显示全部楼层
问题及处理贴出来看看.
 楼主| 发表于 2007-10-1 17:49 | 显示全部楼层
恕我较笨,没弄懂楼上的意思。只能再简单复述一遍
下面是目标函数f

f=e(1)*(a(1)*(x(55)^b1(1))+a(2)*(x(56)^b1(2))+a(3)*(x(57)^b1(3))+a(4)*((x(58)*s(19))^b1(4))+a(5)*((x(59)*s(19))^b1(5))+a(6)*(x(62)^b1(6)))+t*e(2)*(c1(1)*(x(55)^d(1))+c1(2)*(x(56)^d(2))+c1(3)*(x(57)^d(3))+c1(4)*((x(58)*s(19))^d(4))+c1(5)*((x(59)*s(19))^d(5))+c1(6)*(x(62)^d(6)))
其实基本的格式就是a*X^b

运行程序以后,只进行了一次计算,从上面可以看出Hession矩阵更新信息是infeasible,得出的目标值是虚数,没有错误警告,这是什么原因造成的呢?

===============================
原问题用word上传一下,以便于判断.
如果不涉及机密的话,你的运行代码也可以贴一下.
By xjzuo
===============================

[ 本帖最后由 xjzuo 于 2007-10-1 17:59 编辑 ]
 楼主| 发表于 2007-10-3 12:41 | 显示全部楼层
谢谢xjzuo,具体内容我已经上传到附件里,内有代码和问题

fmincon函数问题.doc

101 KB, 下载次数: 16

发表于 2007-10-3 15:49 | 显示全部楼层
将公式贴一下(目标函数及约束函数),虽然我已经大概地了解了你的问题.
如果你输入的目标函数及约束函数没有问题,我想 --- 'largescale','off'--- 这一设置应该去掉.
你试试看.

-----至于初值的问题,诚如你所言,有时候的确需要凭经验猜一个较好的初值,或者多次试探才可以收敛到理想解.

[ 本帖最后由 xjzuo 于 2007-10-3 16:03 编辑 ]
 楼主| 发表于 2007-10-3 18:51 | 显示全部楼层
去掉设置后,仍然为虚数,但出现下列警告
Warning: Large-scale (trust region) method does not currently solve this type of problem,
switching to medium-scale (line search).
看来必须用中型算法
目标函数及约束函数在所传附件里面有,在design.m后面
发表于 2007-10-3 21:40 | 显示全部楼层
我的意思是原始的"公式"(目的是想检查一下你写得是否正确),而不是你已经写好的Matlab语言形式.

---Matlab既然给出了提示,那说明中型算法是合适的.

对于你的这个问题,我只能说下面一些话:
%%%=======================================%%%
1. 你的程序存在的问题:X0注意大小写一致,包括调用fmincon时的X0;
b可以写为:b(1)=60;b(2)=15;b(3)=8;b(4)=1.5;

2.这个问题用1stOpt2.0应该很容易解决,不过我手头只有1.5,
而且将这么多变量和参量的括号去掉(格式要求)也是一件相当麻烦(耗时)的事情。
看来对于这个问题,我只能给你推荐一个可能解决问题的软件,关键还是靠你自己想办法找到它了。

3.对于用Matlab求解,如果写入目标函数和约束函数时没有出错的话,应该是模型合不合理,或者初值是否恰当的问题了。

评分

1

查看全部评分

 楼主| 发表于 2007-10-4 15:15 | 显示全部楼层
很是感谢xjzuo的耐心解答,对于我这样一个新手来说,能有人这么耐心的指导真的很感动
1 您说大小写问题我注意到了,程序里面存在一些这方面的错误,经改正以后,重新演算后,多算了几次迭代,但仍然为虚数,但中间信息里面Procedure的值变为Hessian not updated  
2 您说的软件我不清楚,是用matlab编的么?我想如果最后不行的话,我只能用这个软件了
3 你的意思是看原始文件,这个我才明白,不好意思啊,我现在把原始文件传到附件里,如果有时间的话可以去看看。
谢谢

新建 Microsoft Word 文档 (2).doc

88 KB, 下载次数: 10

 楼主| 发表于 2007-10-4 15:59 | 显示全部楼层
刚了解了一些1stOpt软件,功能好像很强大,而且不需要对初值有要求,我也下了一个1.5版本的,我想问一下,这与2.0有什么区别,为什么一定要用1stOpt2.0版本?
发表于 2007-12-5 15:48 | 显示全部楼层
请问你的问题解决了吗?我也很关心,我在优化的过程中也遇到了同样的问题
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-5-16 04:32 , Processed in 0.102201 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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