找回密码
 注册
查看: 11809|回复: 0

同一个程序用'interior-point'和'active-set‘算法得不同结果

[复制链接]
发表于 2014-8-11 17:41:35 | 显示全部楼层 |阅读模式

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

您需要 登录 才可以下载或查看,没有账号?注册

x
用函数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=[];
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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