我想知道创建LHS设计的命令是什么,如果模型不够好,那么稍后用更多的点来增加它?例如,我将首先创建一个50点LHS设计,然后逐步添加更多点(可能是20个批次),直到模型足够准确。 例如:
Set1=lhsdesign(5,5); %5x5 matrix
%Use of set 1, then determine more points are needed
Set2=%some command that adds 20 points to Set1 to make it a 25x5 matrix
为20个新点再次运行lhsdesign的难度没有考虑到原始点。还有使用原始点完成的工作,因此通过从头开始生成一组新的点浪费这项工作,因为新点不包括在新集中。
答案 0 :(得分:0)
我能够创建一个解决这个问题的函数。我不确定最终矩阵是否是真正的拉丁超立方体,但是如果需要,它会将所需的点数添加到给定点并将它们移动到最近的可用开放“通道”(没有点存在的子范围)。
用法如下:
x1=lhsdesign(200,17);
xF=lhsaugment(x1,200);
其中x1组点数增加了200个点,导致xF为400x17矩阵。功能如下:
function xF = lhsaugment(x1,nPoi)
%function xF = lhsaugment(x1,nPoi)
%Function to augment a given latin hypercube x1 by a number of points,
%nPoi. Only the length is changed, i.e. points are added to the length.
%The original points are left unctouched and appear first in the output
%xF. Thus the size of xF is [size(x1,1)+nPoi size(x1,2)].
x2=lhsdesign(nPoi,size(x1,2));
nPoi=size(x2,1);
oPoi=size(x1,1);
tPoi=nPoi+oPoi;
fInt=1/tPoi;
for i=1:tPoi
cBound(i,:)=[(i-1)*fInt i*fInt];
end
xF=zeros(tPoi,size(x1,2));
bX1=zeros(size(x1));
bX2=zeros(size(x2));
bF=zeros(tPoi,size(x1,2));
iF=zeros(1,size(x1,2));
iMove=0;
for i=1:oPoi
for j=1:size(cBound,1)
for l=1:size(x1,2)
if (x1(i,l)>cBound(j,1))&&(x1(i,l)<=cBound(j,2))&&(bF(j,l)==0)
iF(1,l)=iF(1,l)+1;
xF(iF(1,l),l)=x1(i,l);
bX1(i,l)=1;
bF(j,l)=1;
elseif (x1(i,l)>cBound(j,1))&&(x1(i,l)<=cBound(j,2))&&(bF(j,l)~=0)
iMin=size(cBound,1);
pMin=size(cBound,1);
for m=j:-1:1
if (bF(m,l)==0)
iMin=m;
pMin=j-m;
break
end
end
for m=j:size(cBound,1)
if (bF(m,l)==0)&&(m-j<pMin)
iMin=m;
pMin=j+m;
break
end
end
iF(1,l)=iF(1,l)+1;
xF(iF(1,l),l)=x1(i,l);
bX1(i,l)=1;
bF(iMin,l)=1;
end
end
end
end
for i=1:nPoi
for j=1:size(cBound,1)
for l=1:size(x2,2)
if (x2(i,l)>cBound(j,1))&&(x2(i,l)<=cBound(j,2))&&(bF(j,l)==0)
iF(1,l)=iF(1,l)+1;
xF(iF(1,l),l)=x2(i,l);
bX2(i,l)=1;
bF(j,l)=1;
elseif (x2(i,l)>cBound(j,1))&&(x2(i,l)<=cBound(j,2))&&(bF(j,l)~=0)
iMin=size(cBound,1);
pMin=size(cBound,1);
for m=j:-1:1
if (bF(m,l)==0)
iMin=m;
pMin=j-m;
break
end
end
for m=j:size(cBound,1)
if (bF(m,l)==0)&&(m-j<pMin)
iMin=m;
pMin=j+m;
break
end
end
iF(1,l)=iF(1,l)+1;
xF(iF(1,l),l)=(x2(i,l)-(floor(x2(i,l)/fInt)*fInt))+((iMin-1)*fInt);
bX2(i,l)=1;
bF(iMin,l)=1;
if l==1
iMove=iMove+1;
end
end
end
end
end