dunmin 发表于 2007-8-29 15:35

使用fsolve后出现的Optimization terminated问题

使用fsolve,出现如下提示:Optimization terminated: directional derivative along search direction less than TolFun and infinity-norm of gradient less than 10*(TolFun+TolX).
虽然exitflag = 1,但计算结果显然不对,应该是和上面的提示有关,我试着将TolFun和Tolx减小,但是不行。请问该问题怎么解决呢?先谢谢了

xjzuo 发表于 2007-8-29 16:16

将问题及你的代码贴出来看看.

dunmin 发表于 2007-8-30 09:29

代码和问题

代码如下:
clear
clc
format long
%标定时参数c=
c=;
L1=c(1);L2=c(2);qc=c(3);xp0=c(4);yp0=c(5);m=c(6);n=c(7);dm=c(8);dn=c(9);q1z=c(10);q2z=c(11);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%待标定参数q1z,q2z,qc,xp0,yp0,
%载入测量点的关节角度
encoder=load('ctest2');
=size(encoder);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算
for i=0:(rencoder-1)
    qas(i+1,1)=encoder(i+1,1)+sym('x(1)')/360*pi;
    qas(i+1,2)=encoder(i+1,2)+sym('x(2)')/360*pi;
    p(i+1,1)=L1*cos(qas(i+1,1))+L2*cos(qas(i+1,1)+qas(i+1,2))-rem(i,n)*dn*cos(sym('x(3)'))+fix(i/n)*dm*sin(sym('x(3)'))-sym('x(4)');
    p(i+1,2)=L1*sin(qas(i+1,1))+L2*sin(qas(i+1,1)+qas(i+1,2))-rem(i,n)*dn*sin(sym('x(3)'))-fix(i/n)*dm*cos(sym('x(3)'))-sym('x(5)');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fun=inline(p);
%设定迭代初值,请注意调整迭代初值
x0=;
%进行迭代计算标定。
disp(('>>标定运算中................'))
myoptions=optimset('LevenbergMarquardt','on','NonlEqnAlgorithm','lm','MaxIter',10000,'TolFun',1e-6,'Tolx',1e-6,'MaxFunEvals',10000);
=fsolve(fun,x0,myoptions);
%=fsolve(fun,x0,myoptions);
%myoptions.TolFun;myoptions.TolX
%plot(residual(:,1))
%查看标定结果。
x,Fval,exitflag,output

程序执行结果如下:
>>标定运算中................
Optimization terminated: directional derivative along
search direction less than TolFun and infinity-norm of
gradient less than 10*(TolFun+TolX).

x =

1.0e+002 *

-0.00157063263327   0.01999999639038-0.00018823937648   2.77315197169297-1.45245585453119


Fval =

1.0e-004 *

-0.01594640878011-0.12048655690933
   0.03428882394019-0.03766079572642
   0.03962466678331-0.16617129830365
   0.02481593242010   0.03753617619395
   0.01692886144156   0.00008686754427
-0.05308237234658-0.06403248079323
-0.02576540737209   0.11849102776296
   0.02211054209056-0.01946831304167
-0.00197759675302   0.04430346109530
   0.02211379012351-0.00505518414684
   0.03217430844416   0.08018792101439
-0.07483193201097-0.00094193410405
-0.05233907188540   0.09332183253719
   0.00274875787909   0.01332473601678
   0.06932629389667-0.10225775412209
-0.01252338961422-0.02912995171300
-0.06191226759711   0.06072040690697
   0.03385061916106   0.00057519628172
   0.06426964205275-0.05061323122391
   0.03675691573335-0.04299255465412
-0.01354735786663-0.00303138165236
-0.07229292123156   0.05114632756431
   0.03069964805036   0.00130948251353
   0.06652136391949-0.05083241575221
   0.03795018130859-0.03537865978842
   0.00070312523803   0.00564309232232
-0.09476660068231   0.06300757689814
-0.09079808933166   0.08536141251625
-0.01131872863880   0.02868075029028
   0.08621919846519-0.07459986676395
-0.05258040744138   0.01491118354124
-0.09602083650861   0.05066673139709
   0.01701882069938-0.01661088418814
-0.03767661894472   0.04545984353399
   0.01345104294614-0.01193452618509
   0.02590453675566-0.01323077214010
   0.02501625829154   0.00573993276021
   0.09590536592441-0.02829373215718
-0.02042577989414   0.03779048796559
-0.01059285523297   0.03445793964829


exitflag =

   1


output =

       iterations: 4
      funcCount: 34
         stepsize: 1
   cgiterations: []
    firstorderopt: []
      algorithm: 'medium-scale: Levenberg-Marquardt, line-search'
          message:

理想值应该是0 0 0 280 -140;运算出来的结果和理想值偏差太多,虽然Fval很小,且exitflag = 1,是不是和提示有关:Optimization terminated: directional derivative along
search direction less than TolFun and infinity-norm of
gradient less than 10*(TolFun+TolX).
什么原因导致优化停止。是程序中的rem(i,n)*dn*cos(sym('x(3)'))+fix(i/n)*dm*sin(sym('x(3)'))造成的么?
我将程序中sin(sym('x(3)'))用零代替(因为理论值就是零),只保留cos(sym('x(3)'))这一部分,结果就对了。对于这样待标定值既有正弦又有余弦运算的,怎么才能计算出可用结果。
因为x(3)在零附近,我将sin(sym('x(3)'))用sym('x(3)')代替;cos(sym('x(3)'))用1-(sym('x(3)'))^2/2代替,仍旧不行。难道只能保留正弦或余弦,另外一个用1或0代替。那如果'x(3)'的真实值比方
说pi/8,那就不好办了。

xjzuo 发表于 2007-8-30 10:05

1. 请将附件上传一下,以便于他人调试;
2. 函数可能写为function更合适一些;
3. 估计你还需要调节自定参数,或者先用默认值试试.
4. 你后面的猜测有拼凑的嫌疑。
当然,关键是要将原问题讲一下,以及附件上传一下,别人才能给出好的建议。

dunmin 发表于 2007-9-3 12:00

怎么设置optimset中的参数能保证收敛

发现了问题,原来是弧度和角度换算弄错了。另外一个问题,考虑测量时的随机误差后,导致的solve算法不收敛的问题,一般怎么解决?假设随机误差为0.2,怎么设置Tolx,TolFun才能保证收敛呢?optimset里面的其它参数对此是不是也有影响
页: [1]
查看完整版本: 使用fsolve后出现的Optimization terminated问题