function Jdxyz=jizhi(lx,X,rx)
%这是三维节点间在满足各点间距离要求条件下的位置调整,lx是点间距离值,
%X是还没有施加杆间约束时的节点坐标,为n行3列;x是各点坐标微调距离的值,为3n;
%要求X+x满足节点间距离要求lx,第一点没调到固定点[5e-6 0 5e-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);
assignin('base','rxz',rx);
%-------------程序主体
x0=zeros(1,m1*m2); %x进行波动的初始值
options=optimset('LargeScale','off','display','off','Algorithm','interior-point','TolX',1e-13);
[x,fval]=fmincon(@myfun,x0,[],[],[],[],[],[],@mycon,options);
xd=zeros(m1,m2);
for i=1:m1
for j=1:m2
xd(i,j)=x((i-1)*m2+j);
end
end
%%%%%%%%%%防止调整的微小位移过大的限制程序
for i=1:m1
if sum(xd(i,:).^2)>2.5e-11 %既要求微小位移不能大于5e-6mm
disp('调整的微小距离大于0.01mm,不对')
end
end
%%%%%%%%%%%%%%%
%xd,X;
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');
%%%保证调整后第一点位置固定到[5e-6 0 5e-5]
ceq(m1)=X(1,1)+x(1)-5e-6;
ceq(m1+1)=X(1,2)+x(2);
ceq(m1+2)=X(1,3)+x(3)-5e-5;
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;