区间逐维分析方法借鉴了代理模型的思想,不同之处在于其利用参考点 (Reference Point) 处输入参数向量每个维度上的超平面截取结构真实响应所形成的曲面,并基于勒让德正交多项式构建所截得曲线的多项式近似模型,进一步可以计算在对应维度上的最大值点与最小值点。
区间逐维分析方法主要使用了高斯采样和勒让德正交多项式拟合两个过程,大致流程图可参考下图。
# 一、输入逐维高斯采样
区间逐维分析方法的第一步就是根据输入的维度依次进行高斯采样。在对第i 维的参数进行高斯采样时,需要固定其他维度的参数为中心值,之后对第i 维的参数进行高斯采样。其中,高斯采样的区间为 [-1, 1]。高斯采样的 matlab
代码如下(输入为 s
时,会返回 s+1
个高斯采样点):
| function y= Gauss(n) |
| |
| if n==0 |
| y=0; |
| else |
| beta = 0.5./sqrt(1-(2*(1:n)).^(-2)); |
| T = diag(beta,1)+diag(beta,-1); |
| [~,D]=eig(T); |
| x=diag(D); |
| [x,~]=sort(x); |
| y=x; |
| end |
| end |
完成高斯采样后,需要将得到的各个标准采样点等比例放缩到响应参数的区间,得到各个真实采样点。之后对每一个真实采样点进行映射运算得到每一个真实采样点对应的目标函数值。对应的 matlab
代码如下
| |
| for i=1:m |
| pC=pC_All(i); |
| pR=pR_All(i); |
| x_gauss=Gauss(s); |
| p_gauss=pC+pR.*x_gauss; |
| |
| |
| S_p_gauss=repmat(pC_All, s+1, 1); |
| for j=1:s+1 |
| S_p_gauss(j,i)=p_gauss(j); |
| end |
| |
| |
| for j=1:s+1 |
| u_all=MyFun(S_p_gauss(j,:)); |
| cd(j+(s+1)*(i-1),:)=u_all; |
| end |
| end |
# 二、勒让德多项式拟合
针对第一章中采样得到的标准采样点,对每一个目标函数维度和输入参数维度,依次使用勒让德多项式进行拟合。勒让德多项式拟合的 matlab
代码如下:
| u=cd((s+1)*(i-1)+1:(s+1)*i,q); |
| |
| syms x |
| for k=0:n |
| |
| A_Tq_k_1=0; |
| for j=1:s+1 |
| if k==0 |
| L_k_x=1; |
| else |
| L_k(x)=Legendre_k(k,x); |
| L_k_x=L_k(x_gauss(j)); |
| end |
| L_s_diff(x)=diff(Legendre_k(s+1,x),1); |
| A_Tq_k_1=A_Tq_k_1+((2*k+1)*u(j)*L_k_x)/((1-x_gauss(j)^2)*vpa((L_s_diff(x_gauss(j)))^2)); |
| end |
| |
| if k==0 |
| T(x)=A_Tq_k_1*Legendre_k(k,x); |
| else |
| T(x)=T(x)+A_Tq_k_1*Legendre_k(k,x); |
| end |
| end |
其中 Legendre_k
表示勒让德多项式函数, k
是拟合阶数, x
代表符号变量(可以替代为 ~
)。 Legendre_k
函数可见如下代码:
| function L_k=Legendre_k(k,x) |
| syms x |
| L_k=1./double((2.^k*prod(1:k)))*diff((x.^2-1)^k,k); |
| end |
拟合完成勒让德多项式后,需要求解勒让德多项式的极值点, n
阶勒让德多项式共有 n+1
个极值点。代码如下:
| |
| T_diff(x)= diff(T(x),x); |
| x_root_q=solve(T_diff==0); |
在获得到极值点后,需要对具有虚部以及超出标准区间范围的标准极值点进行归一化的操作,进行归一化的公式和 matlab
代码如下:
xq,r(i)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧1,Im(xq,r(i))=0−1,Im(xq,r(i))=0 and ∣∣∣∣Re(xq,r(i))∣∣∣∣>1,r=1,2,…,n−1yjk,i,Im(xq,r(i))=0 and ∣∣∣∣Re(xq,r(i))∣∣∣∣≤1
| |
| x_root_q(imag(x_root_q)~=0)=1; |
| x_root_q(abs(x_root_q)>1)=-1; |
| x_root{q}=[double(x_root_q)',-1,1]; |
在完成极值点的标准化后,需要将标准极值点和边界值 -1
和 1
一起使用拟合完成的勒让德多项式进行运算,分别得到对应勒让德多项式最大 / 最小的参考点(某个极值点或 - 1 或 1),在找到响应最大 / 最小参考点后,根据当前参数区间从 [-1, 1]
映射到响应的参数区间,得到对应最大 / 最小目标函数值的真实输入点。响应的 matlab
代码如下:
| T_x_root=T(x_root{q}); |
| x_root_min=x_root{q}(find(T_x_root==min(T_x_root))); |
| x_root_max=x_root{q}(find(T_x_root==max(T_x_root))); |
| p_min(i)=double(vpa(pC_All(i)+pR_All(i).*x_root_min(1))); |
| p_max(i)=double(vpa(pC_All(i)+pR_All(i).*x_root_max(1))); |
在对所有输入维度进行逐维运算后,需要将结果进行保存,响应的 matlab
代码如下:
| u_min=MyFun(p_min); |
| u_max=MyFun(p_max); |
| U(q,:)=[u_min(q),u_max(q)] |
至此 U
中即包含了使用区间逐维得到的区间运算结果。其中第i 行第1 列代表了第i 个输出维度的最小值,其中第i 行第2 列代表了第i 个输出维度的最大值。
# 三、区间逐维运算的全部代码
XMH_IDWA2.m(区间逐维运算的主函数) | function U=XMH_IDWA2(MyFun,pMin,pMax,m,N,n,s) |
| pC_All=(pMin+pMax)/2; |
| pR_All=(pMax-pMin)/2; |
| |
| |
| for i=1:m |
| pC=pC_All(i); |
| pR=pR_All(i); |
| x_gauss=Gauss(s); |
| p_gauss=pC+pR.*x_gauss; |
| |
| |
| S_p_gauss=repmat(pC_All, s+1, 1); |
| for j=1:s+1 |
| S_p_gauss(j,i)=p_gauss(j); |
| end |
| |
| |
| for j=1:s+1 |
| u_all=MyFun(S_p_gauss(j,:)); |
| cd(j+(s+1)*(i-1),:)=u_all; |
| end |
| end |
| |
| |
| for q=1:N |
| for i=1:m |
| u=cd((s+1)*(i-1)+1:(s+1)*i,q); |
| |
| syms x |
| for k=0:n |
| |
| A_Tq_k_1=0; |
| for j=1:s+1 |
| if k==0 |
| L_k_x=1; |
| else |
| L_k(x)=Legendre_k(k,x); |
| L_k_x=L_k(x_gauss(j)); |
| end |
| L_s_diff(x)=diff(Legendre_k(s+1,x),1); |
| A_Tq_k_1=A_Tq_k_1+((2*k+1)*u(j)*L_k_x)/((1-x_gauss(j)^2)*vpa((L_s_diff(x_gauss(j)))^2)); |
| end |
| |
| if k==0 |
| T(x)=A_Tq_k_1*Legendre_k(k,x); |
| else |
| T(x)=T(x)+A_Tq_k_1*Legendre_k(k,x); |
| end |
| end |
| |
| T_diff(x)= diff(T(x),x); |
| x_root_q=solve(T_diff==0); |
| |
| |
| x_root_q(imag(x_root_q)~=0)=1; |
| x_root_q(abs(x_root_q)>1)=-1; |
| x_root{q}=[double(x_root_q)',-1,1]; |
| T_x_root=T(x_root{q}); |
| x_root_min=x_root{q}(find(T_x_root==min(T_x_root))); |
| x_root_max=x_root{q}(find(T_x_root==max(T_x_root))); |
| |
| p_min(i)=double(vpa(pC_All(i)+pR_All(i).*x_root_min(1))); |
| p_max(i)=double(vpa(pC_All(i)+pR_All(i).*x_root_max(1))); |
| |
| end |
| u_min=MyFun(p_min); |
| u_max=MyFun(p_max); |
| |
| U(q,:)=[u_min(q),u_max(q)] |
| |
| end |
| |
| end |
Gauss.m(高斯拟合的函数) | function y= Gauss(n) |
| |
| if n==0 |
| y=0; |
| else |
| beta = 0.5./sqrt(1-(2*(1:n)).^(-2)); |
| T = diag(beta,1)+diag(beta,-1); |
| [~,D]=eig(T); |
| x=diag(D); |
| [x,~]=sort(x); |
| y=x; |
| end |
| end |
Legendre_k.m(用于拟合勒让德多项式的函数) | function L_k=Legendre_k(k,x) |
| syms x |
| L_k=1./double((2.^k*prod(1:k)))*diff((x.^2-1)^k,k); |
| end |
KUF.m(算例使用的函数) | function u=KUF(p) |
| |
| K=[p,1/p;(p-2)^2,1]; |
| F=[2*p;p^2]; |
| u=pinv(K)*F; |
| |
| end |
main.m(算例主函数) | clear all |
| PL=[1.5]; |
| PU=[2.5]; |
| PM=length(PL); |
| PN=2; |
| MyFun=@KUF; |
| Ln=3; |
| Ls=3; |
| Mn=10000; |
| |
| U1=XMH_IDWA2(MyFun,PL,PU,PM,PN,Ln,Ls); |
| disp('区间逐维方法结果如下:'); |
| disp(U1); |
| U2=Monte_Carlo(MyFun,Mn,PL,PU,PM,PN); |
| disp('蒙特卡洛方法结果如下:'); |
| disp(U2); |