lwu5885 发表于 2006-8-30 21:20

怎么调整优化步长?

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

心灯 发表于 2006-8-30 21:33

不同的优化方法,不同的优化命令,步长的调整方式可能都不一样。
要想让大家帮你解决问题,就把你的问题给描述清楚了,别人看一遍就明白,马上就能给你一些建议或指导。

lwu5885 发表于 2006-8-30 21:45

clear
x0 = ;
mcanshu55 = 'abs(0.19700000086079e-14+*+*[-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]*-1.970001259803308e-15)';
lb=;
ub=;
format long;x0
options = optimset('largescale','off','display','iter');
options=optimset(options,'tolx',1e-100);
options=optimset(options,'tolfun',1e-100);
= 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.

bainhome 发表于 2006-8-31 00:55

以前看过一篇有关于“在结构工程师中计算机被滥用”的文章,现在看来,这样的警告绝非耸人听闻,而是一个真正的现实问题,绝对不仅仅是结构工程师存在这个问题...
1.无论何种优化算法,古典的或者现代的,步长都是在算法中每一步按某一法则自适应调整的,怎么可能在外部进行调整?!改变优化结果的精度只能通过对目标函数的三种(设计变量范数、目标函数接近程度和梯度任选其一)收敛法则进行。
2.你所给出的算例我不知道你仔细分析目标函数没有,愚钝如我,也能看出最前面一个大大的“abs”意思是求绝对值,意思是最小只能是0。
3.在MATLAB里运行如下一个语句:
>>eps
ans =2.2204e-016
意思是当浮点数小于这个数字的时候MATLAB自动认为其等于0,而你给的初值直接代入表达式就等于1e-21,早超过MATLAB所给的阈值,既然一个有关于某个表达式的绝对值计算机已经认为等于零,那要是还能继续迭代都鬼了!
当然你的初衷是好的,给出的options.tolx=1e-100但这个愿望根本不可能达到。
4.你在另一个帖子里所说的“给了一个很远的初值”,我只能说还不够远!
看看你表达式后面所给的系数就明白了——里面有1e-69量级的,在MATLAB中,这样的数字认为就是零。
5.楼上所说的问题与版本无关,该警告信息是算法的不适合,此时大规模信赖域算法自动转为newtonSQP算法。只要让options.largescale='off'就不会出现该警告信息。
最后,给出你这个“约束优化问题”的求解格式错误:
1).你用options = optimset('largescale','off','display','iter');
options=optimset(options,'tolx',1e-100);
options=optimset(options,'tolfun',1e-100);
三行语句定义的options根本就是白辛苦!
最后一行 = fmincon(mcanshu55,x0,[],[],[],[],lb,ub,[],[],options)
最后多了一个中括号,你的options根本就没有用上,你的这个语句相当于使用默认的options,然后又给主优化程序莫名其妙传递了一个结构数组options
2).你把设计变量的上、下边界定义到这么小的范围里,这个范围内随便给个值都是小于1e-16,让计算机给你迭代显然没可能。
你想让程序迭代?好办!我给你个初值+设计变量上下边界你试试:
function ttt
clc
x0 =40000*;
mcanshu55 = 'abs(0.19700000086079e-14+*+*[-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]*-1.970001259803308e-15)';
ff=inline(mcanshu55,'x');
aaa=ff(x0)
lb=zeros(1,5);ub=5000*ones(1,5);
format long
options = optimset('largescale','off','display','iter','tolx',1e-100,'tolfun',1e-100);
= fmincon(mcanshu55,x0,[],[],[],[],lb,ub,[],options)
迭代结果:
Maximum number of function evaluations exceeded;
increase OPTIONS.MaxFunEvals.
x =
1.0e+002 *
Columns 1 through 4
   1.58206560000000   1.94209360000000   1.94209360000000   1.94209360000000
Column 5
   0.71025120000000
fval =
    4.206183733940587e-022
exitflag =
   0
output =
       iterations: 83
      funcCount: 504
         stepsize: 1
      algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'
    firstorderopt: 8.586589827117003e-024
   cgiterations: []
          message:

toes 发表于 2006-8-31 09:25

层层剖析,有理有据。
赞一个。
完全解决问题的范例。

lwu5885 发表于 2006-8-31 09:59

谢谢!

心灯 发表于 2006-8-31 11:01

原帖由 bainhome 于 2006-8-31 00:55 发表
以前看过一篇有关于“在结构工程师中计算机被滥用”的文章,现在看来,这样的警告绝非耸人听闻,而是一个真正的现实问题,绝对不仅仅是结构工程师存在这个问题...
1.无论何种优化算法,古典的或者现代的,步长都是 ...

赞~~~ 昨天我根本就没有考虑到matlab的eps,汗颜....

shues 发表于 2006-12-26 16:40

高手

236415430 发表于 2011-4-28 23:51

我也遇到类似的问题,请问下列优化问题为什么只迭代一次,我找了很久都找不到错误,希望了解fmincon的朋友能够批评指正,谢谢
function sansan()
clear;

options = optimset('LargeScale','off','Display','iter','TOLFUN',1e-30,'TOLX',1e-30);
x0=;   % Starting guess
lb=;
ub=;
=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;
页: [1]
查看完整版本: 怎么调整优化步长?