楼主: guohf00001
11099 10

[问答] 同一个程序用'interior-point'和'active-set‘算法得不同结果 [推广有奖]

  • 0关注
  • 0粉丝

初中生

38%

还不是VIP/贵宾

-

威望
0
论坛币
2 个
通用积分
0.0355
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1251 点
帖子
10
精华
0
在线时间
13 小时
注册时间
2014-5-22
最后登录
2019-5-5

楼主
guohf00001 发表于 2014-8-11 17:45:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
用函数fmincon进行优化,调用不同算法(用'interior-point'和'active-set‘)得到不同结果?不知道为什么,请指点一下,先谢谢了。
目标函数:                             sum((x(i))^2)          i=1,......48

非线性等式约束(即相邻两点距离为lx):
((X(i+1,1)+x(i*m2+1))-(X(i,1)+x((i-1)*m2+1)))^2+((X(i+1,2)+x(i*m2+2))-(X(i,2)+x((i-1)*m2+2)))^2+((X(i+1,3)+x(i*m2+3))-(X(i,3)+x((i-1)*m2+3)))^2-lx^2
其中X为已知的16*3矩阵,lx=2e-5

线性等式约束:  X(1,1)+x(1)=5e-6;  X(1,2)+x(2)=0; X(1,3)+x(3)=5e-5; 目的是想使第一点X(1,:)调整后为[5e-6 0 5e-5]

程序如下:
clear all;clc;
format long e   %因所给量很小,为避免舍入误差太大,用long e

X=[
     5.000000807112509e-006    4.438188823382536e-012    4.999999999999996e-005
     5.000019466734432e-006    2.000041484956790e-005    5.000000000002813e-005
     5.000005381785101e-006    4.000035630116146e-005    4.999999999986301e-005
     5.000002199111159e-006    6.000030338908418e-005    5.000000003855406e-005
     5.000001310800677e-006    8.000028270773177e-005    4.999999999985877e-005
     5.000001139999288e-006    1.000002859376575e-004    5.000000000002505e-005
     5.000001105374056e-006    1.200002691391569e-004    4.999999999996041e-005
     5.000001422126761e-006    1.400002717169680e-004    5.000000001477024e-005
     5.000002175749727e-006    1.600002906163810e-004    4.999999999994554e-005
     5.000002819890397e-006    1.800002762363458e-004    5.000000000002112e-005
     5.000003503360227e-006    2.000002586221355e-004    4.999999999999951e-005
     5.000004206050277e-006    2.200002365369250e-004    4.999999999999058e-005
     5.000004822397571e-006    2.400002100393004e-004    4.999999999983640e-005
     5.000004457864783e-006    2.600001628445900e-004    5.000000004171483e-005
     5.000004410493534e-006    2.800001298186233e-004    4.999999999984020e-005
     5.000004786826385e-006    3.000001055148235e-004    4.999999999999983e-005
];
lx=2e-5;
m1=size(X,1);m2=size(X,2);             %m1,m2分别为杆件各节点坐标矩阵的行数、列数
%-------------数据传送到平台
assignin('base','Xz',X);
assignin('base','m1z',m1);
assignin('base','m2z',m2);
assignin('base','lxz',lx);

%-------------程序主体
x0=zeros(1,m1*m2);                     %x的初始值
x0(1)=5e-6-X(1,1);x0(2)=-X(1,2);x0(3)=5e-5-X(1,3);    %想令X的第一行(第一点)的值在分别用x1, x2, x3调整后值为[5e-6 0 5e-5],即线性约束


options=optimset('LargeScale','off','display','off','Algorithm','active-set','TolX',1e-13); %  采用不同算法
%options=optimset('LargeScale','off','display','off','Algorithm','interior-point','TolX',1e-13); % 屏蔽上一句
[x,fval]=fmincon(@myfun,x0,[],[],[],[],[],[],@mycon,options);

%%%将得到的x(i)值构成16*3的矩阵xd
xd=zeros(m1,m2);
for i=1:m1
    for j=1:m2
        xd(i,j)=x((i-1)*m2+j);
    end
end

xd,fval     %用'interior-point'得到的xd除第一行(X(1,:)+xd(1,:)值为[5e-6 0 5e-5]为想要调整的值)外,全为初值0(好像没调整),且fval=2.034895063404301e-023
%用'active-set'xd除第一行外,值全部为负值,但X(1,:)+xd(1,:)不是想要调整的值,且fval=3.644862515945357e-015

调用子函数分别为:
function f=myfun(x)
f=sum(x.^2);

function [c,ceq]=mycon(x)
%----------从平台引入数据
X=evalin('base','Xz');
m1=evalin('base','m1z');
m2=evalin('base','m2z');
lx=evalin('base','lxz');

ceq(1)=((X(1,1)+x(1))-5e-6)^2+(X(1,2)+x(2))^2+((X(1,3)+x(3))-5e-5)^2-lx^2; %%第一行为固定值[5e-6 0 5e-5]
for i=2:m1-1
    if m2==3
        ceq(i)=((X(i+1,1)+x(i*m2+1))-(X(i,1)+x((i-1)*m2+1)))^2+...
            ((X(i+1,2)+x(i*m2+2))-(X(i,2)+x((i-1)*m2+2)))^2+...
            ((X(i+1,3)+x(i*m2+3))-(X(i,3)+x((i-1)*m2+3)))^2-lx^2;
      
    end
end
c=[];
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:interior Active Point inter Inte 程序

沙发
zsuphoenix 发表于 2014-8-12 01:23:23
xd =
    -8.071125089139362e-13    -4.438188823382536e-12     4.065758146820642e-20
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
fval =
     2.034895063404301e-23

xd =
    -8.071125089139362e-13    -4.438188823382536e-12     4.065758146820642e-20
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
fval =
     2.034895063404301e-23

我算出来都一样啊

藤椅
zsuphoenix 发表于 2014-8-12 01:25:03
可能是精度的问题,比如1+2.220446049250313e-16==1

板凳
guohf00001 发表于 2014-8-12 09:59:06
zsuphoenix 发表于 2014-8-12 01:25
可能是精度的问题,比如1+2.220446049250313e-16==1
你算的结果是一样的吗?是不是没把其中一个算法屏蔽了啊。
我是用matlab2008a算的,用'active-set'算fval=3.644862515945357e-015。和用'interior-point'算的fval=2.034895063404301e-023。量级差的很大,而且我也换了其他的X矩阵,算的结果就是不一样啊。
我再试下其他matlab版本看看

报纸
guohf00001 发表于 2014-8-12 10:37:50
zsuphoenix 发表于 2014-8-12 01:25
可能是精度的问题,比如1+2.220446049250313e-16==1
试过matlab2013版本,两种算法算出的结果是一样的fval=2.034895063404301e-023。怎么版本精度会差这么多呢。
另外,我修改了'TolX'值,发现结果好像不受'TolX'的影响。

还有,如果调整值xd为0,相当于对X矩阵没有调整(这样是不是就不对了?),若将该程序调用到其他程序里对点位置进行调整的话,应会造成第一点(行)与第二点(行)间的距离增大(拉伸)吧??

地板
zsuphoenix 发表于 2014-8-12 11:51:21
guohf00001 发表于 2014-8-12 09:59
你算的结果是一样的吗?是不是没把其中一个算法屏蔽了啊。
我是用matlab2008a算的,用'active-set'算fva ...
我用的是matlab2012a,我是屏蔽其中一个跑一次,再屏蔽另一个,把前面那个屏蔽的解掉,重新跑一次,两个结果都一样。你的结果不同差别大吗?如果在绝对数上没啥差别的话,就应该是一样的。你把你的结也跟我一样贴出来看看。

7
zsuphoenix 发表于 2014-8-12 11:57:45
guohf00001 发表于 2014-8-12 09:59
你算的结果是一样的吗?是不是没把其中一个算法屏蔽了啊。
我是用matlab2008a算的,用'active-set'算fva ...
你把数据都乘以1e6再跑下看看呗,反正优化结果不存在绝对值上的差别,那就没错,想你的这种量级差别在绝对值下是没有差别的。优化方法都是针对数值的绝对大小。再说,采用不同优化方法,本来就有可能得到不同的结果,只有在优化函数和约束well behaved的情况下才有可能相同。

8
guohf00001 发表于 2014-8-13 09:52:50
zsuphoenix 发表于 2014-8-12 11:57
你把数据都乘以1e6再跑下看看呗,反正优化结果不存在绝对值上的差别,那就没错,想你的这种量级差别在绝对 ...
没太明白“数据都乘以1e6”,是不是X矩阵和lx都乘以1e6运行下两种算法看结果是否一致??
另外,我用matlab2011算的两种算法得到结果和你的结果(的'interior-point'算的)是一样的,看来是版本精度问题了。
原程序用matlab2008的'interior-point'算的
xd =
   -8.071125089139362e-013   -4.438188823382536e-012    4.065758146820642e-020
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0
                         0                         0                         0


fval =
    2.034895063404301e-023
原程序用matlab2008的'active-set算的(很怪之前算的fval=3.644862515945357e-015,今天再算就变成下面结果了,真搞不懂???):
xd =
   -8.738134142284361e-006   -8.738137766268732e-006    8.738133336748286e-006
   -9.765560635666406e-012   -1.002229448544859e-011   -9.765560816353253e-012
   -9.765450515811102e-012   -9.950359516053950e-012   -9.765450406435402e-012
   -9.765374576441257e-012   -9.883963465263920e-012   -9.765374529051413e-012
   -9.765323967389013e-012   -9.849068199258565e-012   -9.765323949096813e-012
   -9.765284953522390e-012   -9.837535470343637e-012   -9.765284949255188e-012
   -9.765256600413764e-012   -9.806454397152846e-012   -9.765256587740984e-012
   -9.765239038868240e-012   -9.794306354539799e-012   -9.765239020084320e-012
   -9.765223531989526e-012   -9.798099484941966e-012   -9.765223535822268e-012
   -9.765214271360418e-012   -9.769399372626643e-012   -9.765214269602272e-012
   -9.765220139107683e-012   -9.737556018864146e-012   -9.765220139289196e-012
   -9.765243019748218e-012   -9.701363441012222e-012   -9.765243025147864e-012
   -9.765285061926630e-012   -9.660880992841788e-012   -9.765285097244276e-012
   -9.765352492534199e-012   -9.600211727715299e-012   -9.765352479907938e-012
   -9.765446783687065e-012   -9.553405952365999e-012   -9.765446778849815e-012
   -9.765562389388268e-012   -9.515139099991147e-012   -9.765562394098400e-012

fval =
    2.290650141259307e-010

9
zsuphoenix 发表于 2014-8-13 11:59:13
guohf00001 发表于 2014-8-13 09:52
没太明白“数据都乘以1e6”,是不是X矩阵和lx都乘以1e6运行下两种算法看结果是否一致??
另外,我用mat ...
你这两个结果在我认为都是没有区别的,xd和fval全是0。如果interior-point的算法收敛速度更快,迭代次数更多,其结果自然更接近于0。

10
wujianjack2 发表于 2014-8-14 12:41:31
   楼主要求精度略高啊,一般TolX设置为1e-6,你这结果都可以认为是0了呢。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 21:12