声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3251|回复: 10

[编程技巧] 怎么调整优化步长?

[复制链接]
发表于 2006-8-30 21:20 | 显示全部楼层 |阅读模式

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

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

x
优化的时候想要达到更高的精度,请问怎么调整步长啊?
回复
分享到:

使用道具 举报

发表于 2006-8-30 21:33 | 显示全部楼层
不同的优化方法,不同的优化命令,步长的调整方式可能都不一样。
要想让大家帮你解决问题,就把你的问题给描述清楚了,别人看一遍就明白,马上就能给你一些建议或指导。

评分

1

查看全部评分

 楼主| 发表于 2006-8-30 21:45 | 显示全部楼层
clear
x0 = [3.955164E-03,4.855234E-03,4.855234E-03,4.855234E-03,1.775628E-03];
mcanshu55 = 'abs(0.19700000086079e-14+[2.5602e-041 1.0355e-053 1.8955e-033 8.6083e-024 2.4193e-043]*[x(1);x(2);x(3);x(4);x(5)]+[x(1) x(2) x(3) x(4) x(5)]*[-2.5664e-041 -1.6988e-061 -7.7855e-046 2.2380e-049 -7.8867e-057;0 4.5438e-062 -3.1368e-058 9.0490e-062 -3.1903e-069;0 0 -1.8915e-033 1.6579e-041 -1.0026e-048;0 0 0 3.7616e-032 2.1174e-051;0 0 0 0 -2.4194e-043]*[x(1);x(2);x(3);x(4);x(5)]-1.970001259803308e-15)';
lb=[3.955164E-03*0.2,4.855234E-03*0.2,4.855234E-03*0.2,4.855234E-03*0.2,1.775628E-03*0.2];
ub=[3.955164E-03*1.8,4.855234E-03*1.8,4.855234E-03*1.8,4.855234E-03*1.8,1.775628E-03*1.8];
format long;x0
options = optimset('largescale','off','display','iter');
options=optimset(options,'tolx',1e-100);
options=optimset(options,'tolfun',1e-100);
[x,fval,exitflag,output] = fmincon(mcanshu55,x0,[],[],[],[],lb,ub,[],[],options);
运行后结果如下:
x =

   0.00395516400000   0.00485523400000   0.00485523400000   0.00485523400000   0.00177562800000

fval =

    1.251153612607804e-021


exitflag =

     1


output =

       iterations: 1
        funcCount: 13
         stepsize: 1
        algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'
    firstorderopt: 3.944304526105059e-023
     cgiterations: []
请问一下,为什么不发生跌代啊?请加我的QQ365400204,在线等待,谢谢
发表于 2006-8-30 22:32 | 显示全部楼层
看我这边的提示,matlab7.1版本,貌似这个命令不适合你的问题,要不就是你给的参数有问题。没有用过这个命令,不太了解。你可以仔细看一下fmincon的命令说明。Good luck!

x0 =

  Columns 1 through 4

   0.00395516400000   0.00485523400000   0.00485523400000   0.00485523400000

  Column 5

   0.00177562800000

Warning: Large-scale (trust region) method does not currently solve this type of problem,
switching to medium-scale (line search).
> In fmincon at 274
  In check_fmincon at 10
Optimization terminated: first-order optimality measure less
than options.TolFun and maximum constraint violation is less
than options.TolCon.
No active inequalities.
发表于 2006-8-31 00:55 | 显示全部楼层
以前看过一篇有关于“在结构工程师中计算机被滥用”的文章,现在看来,这样的警告绝非耸人听闻,而是一个真正的现实问题,绝对不仅仅是结构工程师存在这个问题...
1.无论何种优化算法,古典的或者现代的,步长都是在算法中每一步按某一法则自适应调整的,怎么可能在外部进行调整?!改变优化结果的精度只能通过对目标函数的三种(设计变量范数、目标函数接近程度和梯度任选其一)收敛法则进行。
2.你所给出的算例我不知道你仔细分析目标函数没有,愚钝如我,也能看出最前面一个大大的“abs”意思是求绝对值,意思是最小只能是0。
3.在MATLAB里运行如下一个语句:
  1. >>eps
  2. ans =2.2204e-016
复制代码

意思是当浮点数小于这个数字的时候MATLAB自动认为其等于0,而你给的初值直接代入表达式就等于1e-21,早超过MATLAB所给的阈值,既然一个有关于某个表达式的绝对值计算机已经认为等于零,那要是还能继续迭代都鬼了!
当然你的初衷是好的,给出的
  1. options.tolx=1e-100
复制代码
但这个愿望根本不可能达到。
4.你在另一个帖子里所说的“给了一个很远的初值”,我只能说还不够远!
看看你表达式后面所给的系数就明白了——里面有1e-69量级的,在MATLAB中,这样的数字认为就是零。
5.楼上所说的问题与版本无关,该警告信息是算法的不适合,此时大规模信赖域算法自动转为newtonSQP算法。只要让
  1. options.largescale='off'
复制代码
就不会出现该警告信息。
最后,给出你这个“约束优化问题”的求解格式错误:
1).你用
  1. options = optimset('largescale','off','display','iter');
  2. options=optimset(options,'tolx',1e-100);
  3. options=optimset(options,'tolfun',1e-100);
复制代码

三行语句定义的options根本就是白辛苦!
最后一行
  1. [x,fval,exitflag,output] = fmincon(mcanshu55,x0,[],[],[],[],lb,ub,[],[],options)
复制代码

最后多了一个中括号,你的options根本就没有用上,你的这个语句相当于使用默认的options,然后又给主优化程序莫名其妙传递了一个结构数组options
2).你把设计变量的上、下边界定义到这么小的范围里,这个范围内随便给个值都是小于1e-16,让计算机给你迭代显然没可能。
你想让程序迭代?好办!我给你个初值+设计变量上下边界你试试:
  1. function ttt
  2. clc
  3. x0 =40000*[3.955164E-03,4.855234E-03,4.855234E-03,4.855234E-03,1.775628E-03];
  4. mcanshu55 = 'abs(0.19700000086079e-14+[2.5602e-041 1.0355e-053 1.8955e-033 8.6083e-024 2.4193e-043]*[x(1);x(2);x(3);x(4);x(5)]+[x(1) x(2) x(3) x(4) x(5)]*[-2.5664e-041 -1.6988e-061 -7.7855e-046 2.2380e-049 -7.8867e-057;0 4.5438e-062 -3.1368e-058 9.0490e-062 -3.1903e-069;0 0 -1.8915e-033 1.6579e-041 -1.0026e-048;0 0 0 3.7616e-032 2.1174e-051;0 0 0 0 -2.4194e-043]*[x(1);x(2);x(3);x(4);x(5)]-1.970001259803308e-15)';
  5. ff=inline(mcanshu55,'x');
  6. aaa=ff(x0)
  7. lb=zeros(1,5);ub=5000*ones(1,5);
  8. format long
  9. options = optimset('largescale','off','display','iter','tolx',1e-100,'tolfun',1e-100);
  10. [x,fval,exitflag,output] = fmincon(mcanshu55,x0,[],[],[],[],lb,ub,[],options)
复制代码

迭代结果:
  1. Maximum number of function evaluations exceeded;
  2. increase OPTIONS.MaxFunEvals.
  3. x =
  4.   1.0e+002 *
  5.   Columns 1 through 4
  6.    1.58206560000000   1.94209360000000   1.94209360000000   1.94209360000000
  7.   Column 5
  8.    0.71025120000000
  9. fval =
  10.     4.206183733940587e-022
  11. exitflag =
  12.      0
  13. output =
  14.        iterations: 83
  15.         funcCount: 504
  16.          stepsize: 1
  17.         algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'
  18.     firstorderopt: 8.586589827117003e-024
  19.      cgiterations: []
  20.           message: [1x79 char]
复制代码

评分

2

查看全部评分

发表于 2006-8-31 09:25 | 显示全部楼层
层层剖析,有理有据。
赞一个。
完全解决问题的范例。
 楼主| 发表于 2006-8-31 09:59 | 显示全部楼层
谢谢!
发表于 2006-8-31 11:01 | 显示全部楼层
原帖由 bainhome 于 2006-8-31 00:55 发表
以前看过一篇有关于“在结构工程师中计算机被滥用”的文章,现在看来,这样的警告绝非耸人听闻,而是一个真正的现实问题,绝对不仅仅是结构工程师存在这个问题...
1.无论何种优化算法,古典的或者现代的,步长都是 ...


赞~~~ 昨天我根本就没有考虑到matlab的eps,汗颜....
发表于 2006-12-26 16:40 | 显示全部楼层
高手
发表于 2011-4-28 23:51 | 显示全部楼层
我也遇到类似的问题,请问下列优化问题为什么只迭代一次,我找了很久都找不到错误,希望了解fmincon的朋友能够批评指正,谢谢
function sansan()
clear;

options = optimset('LargeScale','off','Display','iter','TOLFUN',1e-30,'TOLX',1e-30);
x0=[50;1.35;1.37];   % Starting guess
lb=[1;0.95;0.97];
ub=[5;1.15;1.17];
[x,fval,exitflag,output]=fmincon(@myfun,x0,[],[],[],[],lb,ub,[],options) %后面两个向量是变量的LB和UB

function f=myfun(x)
u=1;
for b=1:1:50;
s=((b-1)*x(1)*1000):(b*x(1)*1000);
for m=0:100;
F1=((exp(-2.5*10^-5*s).* (1.896*10^-5*s).^m)/ gamma(m+1)).*normcdf((1250-(8.4823*10^-3*s+100*m))./sqrt(3.6*10^-7*s.^2+400*m)).^2.*normcdf((1270-(8.4823*10^-3*s+100*m))./sqrt(3.6*10^-7*s.^2+400*m)).^2;
Z1= trapz(s,F1);%积分
Zrecord1(m+1)=Z1;%用于记录每个m值所对应的积的值,之所以Zrecord后加1,因为matlab不允许序号为零的数组元素
end
Ztotal(u)=sum(Zrecord1);%分母在这
u=u+1;
end
for k=2:51  %时间间隔前的倍数
     for j=1:50   %打击次数
     a=-2.5*10^-5;
     b=1.896*10^-5;
     c=8.4823*10^-3;
     d=3.6*10^-7;
     K1a(j,k)=exp(a*(k-1).*x(1)*1000)* (b*(k-1).*x(1)*1000).^j./ gamma(j+1).* normcdf((1000*x(2)-(c*(k-1).*x(1)*1000+100*j))./sqrt(d*((k-1).*x(1)*1000)^2+400*j)).^2.*normcdf((1000*x(3)-(c*(k-1).*x(1)*1000+100*j))./sqrt(d*((k-1).*x(1)*1000)^2+400*j)).^2;
     K1b(j,k)=exp(a*(k-1).*x(1)*1000)* (b*(k-1).*x(1)*1000).^j./ gamma(j+1).* normcdf((1250-(c*(k-1).*x(1)*1000+100*j))./sqrt(d*((k-1).*x(1)*1000)^2+400*j)).^2.*normcdf((1270-(c*(k-1).*x(1)*1000+100*j))./sqrt(d*((k-1).*x(1)*1000)^2+400*j)).^2;
%给定t,在固定打击j下,t前倍数k的值
  end
  K2a(k)=1-sum(K1a(:,k));          %给定t,t前倍数k的值,j求和
  K2a(1)=0;
  K2b(k)=1-sum(K1b(:,k));          %给定t,t前倍数k的值,j求和
  K2b(1)=0;
end

for k=2:50;
K3a(k)=-x(1)*1000*K2a(k);
end
K3=sum(K3a)+50*x(1)*1000*K2a(51);  %t前倍数累加, EK

for k=2:50;
K4a(k)=-K2a(k);
end
K4=sum(K4a)+50*K2a(51);        %t前倍数累加, EN

for k=2:50;
K5(k)=-x(1)*1000*K2b(k).*K2b(k+1);
end                             %t前倍数累加, EP1
K5=sum(K5(k));
for k=2:50;
K6(k)=x(1)*1000*K2b(k).^2;
end
K6=sum(K6(k));
                            %t前倍数累加, EP2
for k=2:50;
K7(k)=K2b(k).*(x(1)*1000-Ztotal(k-1));
end
K7=sum(K7(k));                            %t前倍数累加, EP3
for k=2:50;
K8(k)=-K2b(k).*(x(1)*1000-Ztotal(k));    %t前倍数累加, EP4
end         %t前倍数累加, EP4
K8=sum(K8(k));
K9=K5+K6+K7+K8;       %downtime expected value
f=(2000*K4+5000*K9+27000)./K3;
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-16 08:56 , Processed in 0.055681 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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