btee123 发表于 2011-1-18 16:15

求助fminsearch用法,如何求得全局极小值

   matlab下,我用fminsearch求得的是局部极小值,且在给出的初始点附近,初始值的选取影响太大。请各位高手大侠们给指点下,如何求得全局极小值?
代码如下:
l=;
c=3*10^8;
for j=1:8
    t(j)=l(j)/c;   
end
R=850;
r=100;

for j=1:8
      cosq(j)=(R^2-r^2+(t(j)*c-r)^2)/(2*(t(j)*c-r)*R);   
end
f=@(R)(-((t(1)*c)^2-R^2)*(R^2*c+(t(1)*c)^3-2*t(1)*c^2*R*cosq(1))/(8*pi*100*(R*cosq(1)-t(1)*c)^3))*(((t(2)*c)^2-R^2)*(R^2*c+(t(2)*c)^3-2*t(2)*c^2*R*cosq(2))/(8*pi*100*(R*cosq(2)-t(2)*c)^3))*(((t(3)*c)^2-R^2)*(R^2*c+(t(3)*c)^3-2*t(3)*c^2*R*cosq(3))/(8*pi*100*(R*cosq(3)-t(3)*c)^3))*(((t(4)*c)^2-R^2)*(R^2*c+(t(4)*c)^3-2*t(4)*c^2*R*cosq(4))/(8*pi*100*(R*cosq(4)-t(4)*c)^3))*(((t(5)*c)^2-R^2)*(R^2*c+(t(5)*c)^3-2*t(5)*c^2*R*cosq(5))/(8*pi*100*(R*cosq(5)-t(5)*c)^3))*(((t(6)*c)^2-R^2)*(R^2*c+(t(6)*c)^3-2*t(6)*c^2*R*cosq(6))/(8*pi*100*(R*cosq(6)-t(6)*c)^3))*(((t(7)*c)^2-R^2)*(R^2*c+(t(7)*c)^3-2*t(7)*c^2*R*cosq(7))/(8*pi*100*(R*cosq(7)-t(7)*c)^3))*(((t(8)*c)^2-R^2)*(R^2*c+(t(8)*c)^3-2*t(8)*c^2*R*cosq(8))/(8*pi*100*(R*cosq(8)-t(8)*c)^3));
=fminsearch(f,900);%求y

结果是:y =864.6721

当输入的是 =fminsearch(f,850);时y= 847.8084

当初始值分别设为700, 750,800,850,900, 950时发现结果分别为:
             864.6721,864.6721,847.8084,847.8084,864.6721,1.0033e+003
   

dingd 发表于 2011-1-18 17:50

试下1stOpt,全局优化能力很强。

bainhome 发表于 2011-1-18 18:28

几件事情不大明白:
1.
c=3*10^8
for j=1:8
    t(j)=l(j)/c;   
end这是哪本书上或者何人教出来的神奇用法?如果是书,书可以卖废纸;如果是老师,可快递“误人子弟”的牌匾一块。
2.Optimization terminated: mesh size less than options.TolMesh.
x =
864.6738
fval =
-1.6544e+097
exitflag =
   1这样的优化结果,不知道有什么意义?

zhouyang664 发表于 2011-1-18 22:08

好像只是局部最优解吧!

btee123 发表于 2011-1-18 22:31

回复 3 # bainhome 的帖子

c=3*10^8
for j=1:8
    t(j)=l(j)/c;   
end
是为了得到8种情况下的时间,l是我直接从我的程序中得到的,我给出的程序只是部分,我的目的是为找出使目标函数最小的R(最小值点y)

bainhome 发表于 2011-1-18 22:42

hoho...What a cute answer.
But...Would this code below be nicer?l=[...]
c=3e8
t=l/c

ChaChing 发表于 2011-1-19 00:28

回复 5 # btee123 的帖子

初学者常忽略的小问题, 看看下帖LZ应该就知道LS大牛的质疑
matlab矢量化编程技巧集锦
http://forum.vibunion.com/thread-41583-1-1.html

rocwoods 发表于 2011-1-19 10:04

本帖最后由 rocwoods 于 2011-1-19 10:07 编辑

还好l长度只是8,问题的严重性被掩盖了。
回楼主,bainhome的质疑就是两点:
1、MATLAB不要当成C使。典型的向量除以标量:t = l/c;即可,没必要整个循环。
2、即使非要整循环,t没有预分配内存,l向量要是很长的话,效率成千上万倍的降低。

bainhome 发表于 2011-1-19 11:19

本帖最后由 bainhome 于 2011-1-19 11:29 编辑

补充一下,我第二个问题,一楼同学估计也压根没看懂:
fval的数值在x=864.6738时,达到-1.6544e+097,这样的目标函数值,即使所给出的不同初始点数值,算得结果都接近-inf,这又能算哪门子的极值点?只不过到了一个绝对值很大的地方,MATLAB认为函数值已经足够小,没法算下去,随机停下来了而已。
所以不妨从函数本身开始检查,而不是纠结于初始点的选取,也许能更快接近问题的本质。

btee123 发表于 2011-1-19 12:56

谢谢 各位的帮助,小弟受益很多,祝各位新年快乐~~

ChaChing 发表于 2011-1-20 23:42

bainhome 发表于 2011-1-19 11:19 static/image/common/back.gif
补充一下,我第二个问题,一楼同学估计也压根没看懂:
fval的数值在x=864.6738时,达到-1.6544e+097,这样 ...

别怪初学者没看懂, 说小声些, 个人也没仔细了解!?:@L
页: [1]
查看完整版本: 求助fminsearch用法,如何求得全局极小值