马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
本帖最后由 牛小贱 于 2014-4-10 18:39 编辑
问题描述: 在一个长(x向)0.2mm,宽(y向)0.4mm,高(z向)0.1mm的方体内有N个有序已知点(顺序相连可成一条曲线,可设N点坐标为一个N*3的矩阵X),要求除第一个点不动外,对其余N-1个点进行微调((N-1)*3的矩阵xd),使调整后的相邻点间距离为一定值lx,当然调整后的点不能出界。 用fmincon进行最优化,但第一个点也被调整了,且不知是提取的数学问题不对还是程序有问题,得到的微调值很大,超限很多,请高手帮忙指点一下,先谢了。 数学问题: 目标函数:Σx(j)^2 x(j)为微调xd的各分量,j=1, 2……3N-3 约束条件:|X(i+1)+xd(i+1)-X(i)- xd(i)|=lx, i=1, 2…..N 0<X(i,1)+xd(i,1)<0.2, 0<X(i,2)+xd(i,2)<0.4,0<X(i,3)+xd(i,3)<0.1 假设N=20,已知这20个点构成的坐标矩阵X, lx=1e-5; 程序: - format long e %因所给量很小,为避免舍入误差太大,用long e
- X=[1.000000000000000e-005 0 5.000000000000000e-005
- 1.084212146258562e-004 1.374317617706318e-004 3.353201365358312e-005
- 1.743335211270057e-004 3.211374518483659e-004 3.183321977317479e-005
- 1.981769753590540e-004 -9.021471158199482e-004 4.409472569732121e-005
- 3.607778176281379e-005 -6.450571057147658e-004 5.362661879261433e-005
- 1.992600048898033e-005 1.115269281749919e-004 5.289233224855776e-005
- 1.830891687691136e-005 3.502329268561499e-004 5.041792172515980e-005
- 1.724894446411056e-005 2.082276257844818e-004 4.989077981552538e-005
- 1.442138466276086e-005 2.856263517830034e-004 4.968606079655937e-005
- 1.599026055319464e-005 2.196338795975163e-004 4.906672591045520e-005
- 2.649812284492222e-005 3.016661141552573e-004 4.797951158729175e-005
- 3.501905903500460e-005 1.947676718678416e-004 4.656622210738030e-005
- 3.715026059364602e-005 2.017765869090804e-004 4.685650795284104e-005
- 5.924772262711515e-005 1.078990962840916e-004 4.935954495744724e-005
- 8.305504484629322e-005 1.320501850534990e-004 5.104872456086212e-005
- 7.104610355191896e-005 1.015464768267407e-004 5.116284821760612e-005
- 9.016579851488848e-005 3.569370145761626e-004 5.109457596677840e-005
- 1.786477300524624e-004 1.542941709813852e-004 5.048413376542842e-005
- 2.247149253348480e-004 1.823588732474208e-004 4.997876808826507e-005
- lx=1e-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进行波动的初始值
- %%%求线性上、下限
- %%x,y,z边界-X(i,1)<=x(i,1)<=2e-4-rx-X(i,1);rx-X(i,2)<=x(i,2)<=4e-4-rx-X(i,2); rx-X(i,3)<=x(i,3)<=1e-4-rx-X(3,1)
- lb=zeros(1,m1*m2);ub=zeros(1,m1*m2);
- for i=2:m1
- mm=3*(i-1);
- lb(mm+1)=rx-X(i,1); ub(mm+1)=2e-4-rx-X(i,1);
- lb(mm+2)=rx-X(i,2); ub(mm+2)=4e-4-rx-X(i,2);
- lb(mm+3)=rx-X(i,3); ub(mm+3)=1e-4-rx-X(i,3);
- end
-
- %options=optimset('LargeScale','off','display','off');
- options=optimset('LargeScale','off','display','off','Algorithm','active-set');
- [x,fval]=fmincon(@myfun,x0,[],[],[],[],lb,ub,@mycon,options);
- for i=1:m1
- for j=1:m2
- xd(i,j)=x((i-1)*m2+j);
- end
- end
- %%%%%%%%%%防止调整的微小位移过大的限制程序
- for i=1:m1
- ifsum(xd(i,:).^2)>1e-12 %既要求微小位移不能大于1e-6mm
- disp('调整的微小距离大于0.001mm,不对')
- end
- end
- xd, %显示的xd值很怪,超限很多
- Jdxyz=X+xd; %满足各项条件的节点坐标
- return
- function f=myfun(x)
- f=sum(x.^2);
- return
- function [c,ceq]=mycon(x)
- %----------从平台引入数据
- X=evalin('base','Xz');
- m1=evalin('base','m1z');
- m2=evalin('base','m2z');
- lx=evalin('base','lxz');
- %----------节点限制条件的数学表示
- for i=1: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
- %防止调整的微小位移过大,限定矢量xd的模小于jx,但这步好像没起作用
- jx=5e-6;
- for i=1:m1
- if m2==3
- c(i)=x((i-1)*m2+1)^2+x((i-1)*m2+2)^2+x((i-1)*m2+3)^2-jx^2;
- end
- end
- return
复制代码
|