最优性准则方法

时间:2017-12-08 12:24:25

标签: matlab math optimization mathematical-optimization topology

该MATLAB代码显示了如何根据拓扑优化理论构建桥。该代码也基于Euler-Bernoulli梁理论。

最后一部分(%% Optimality Criteria Update)由最优性标准方法组成。但是,我在理解这句话时遇到了一些麻烦。

xnew = MAX(0.001,最大值(X-移动,分钟(1个,分钟(X +移动,X * SQRT(-dc./lmid)))));

在这句话的最后,我们将比较1,x + move和 x。* sqrt(-dc./lmid),并找出它们中的最小值。但是,我不明白这个 x。* sqrt(-dc./lmid)意味着什么,以及为什么突然出现。

任何人都可以解释这个 x。* sqrt(-dc./lmid)的含义,为什么我要比较它? This image might be of help.

%% Ground-structure based Topology Optimization by D.-M. Kim, May 2016
function gstop(Nx,Ny,Vlim,penal,maxL)
% Generate Nodes & Elements
[node,elem]=GS(Nx,Ny,maxL);

Ne=size(elem,1);    % Total number of elements
% Initialize
x=zeros(Ne,1);
x(1:Ne)=0.1;     % initial density
loop=0;
change=1;
change2=1;
c=0;
cold=0;
diffc=1;
diffc2=1;
xold=x;

filedir = 'images/Plot_iteration_';

% Start Iteration
while ((change>0.001 && change2>0.001) || (diffc>1e-2 && diffc2>1e-2))
    loop=loop+1;
    xold2=xold;
    xold=x;
    cold2=cold;
    cold=c;
    % FE-analysis
    [U]=FE(Nx,Ny,node,elem,x,penal);
    % Objective Function and Sensitivity Analysis
    [KE]=stiffness(elem);       % element stiffness matrix
    c=0.;
    dc=zeros(Ne,1);
    for jj=1:Ne
        n1=elem(jj,1);
        n2=elem(jj,2);
        Ue=U([3*n1-2;3*n1-1;3*n1;3*n2-2;3*n2-1;3*n2],1);
        c=c+x(jj)^penal*Ue'*KE(:,:,jj)*Ue;
        dc(jj)=-penal*x(jj)^(penal-1)*Ue'*KE(:,:,jj)*Ue;
    end
    % Design Update by the Optimality Criteria Method
    [x]=OC(x,elem,Vlim,dc);
    % Print Results
    change=max(abs(x-xold));
    change2=max(abs(x-xold2));
    diffc=abs((c-cold)/c);
    diffc2=abs((c-cold2)/c);
    disp(['It.:' sprintf('%4i',loop) ' / Obj.:' sprintf('%10.4f',c)...
        ' / Vol.:' sprintf('%6.3f',x'*elem(:,3))...
        ' / ch.:' sprintf('%6.3f',change)])
    % Plot Densities
    clf
    hold on
    plot(node(:,1),node(:,2),'.','color','r','markersize',3)
    [xsort,order]=sort(x);
    for jj=1:Ne
        if xsort(jj)>0.01
            n1=elem(order(jj),1);
            n2=elem(order(jj),2);            
            % undeformed
            x1=node(n1,1); y1=node(n1,2);
            x2=node(n2,1); y2=node(n2,2);
              % deformed
              x1=node(n1,1)+U(3*n1-2); y1=node(n1,2)+U(3*n1-1);
              x2=node(n2,1)+U(3*n2-2); y2=node(n2,2)+U(3*n2-1);
            r=3*xsort(jj);
            rr=1-xsort(jj);
            plot([x1,x2],[y1,y2],'linewidth',r,'color',rr*[0 0 0])

            % plotting the mirror image
            hold on
            plot([-x1, -x2], [y1, y2],'linewidth',r,'color',rr*[1 1 1])
        end
    end
    axis equal; axis tight; axis off; pause(1e-6);

    print(strcat(filedir, int2str(loop)), '-dpng');
end

%% Generate Ground-structure (Nodes & Elements)
function [node,elem]=GS(Nx,Ny,maxL)
Nn=Nx*Ny;       % Total Number of nodes
node=zeros(Nn,2);   % Location of nodes (col1: x-dir / col2: y-dir)
Lx=80; Ly=40;
% Generate Nodes
no=0;
for jy=1:Ny
    for jx=1:Nx
        no=no+1;
        node(no,1)=(Lx/(Nx-1))*(jx-1);    % x-dir. position
        node(no,2)=(Ly/(Ny-1))*(jy-1);    % y-dir. position
    end
end

% Generate Elements
elem=zeros(10000,4);    % Element data (node 1 / node 2 / elem. length / rotation angle)
no=0;
for n1=1:Nn
    no_temp=0;
    the_temp=[];
    for n2=n1+1:Nn
        x1=node(n1,1); y1=node(n1,2);
        x2=node(n2,1); y2=node(n2,2);
        dx=x2-x1; dy=y2-y1;
        E_len=norm([dx,dy]);
        E_theta=acos(dx/E_len);
        max_length=maxL*(Lx/(Nx-1));
        % Save element data only if the length is shorter than maxL
        if (E_len<=max_length)&&(no_temp==0||isempty(find(abs(the_temp-E_theta)<1e-3,1)))
            no=no+1;
            elem(no,:)=[n1,n2,E_len,E_theta];
            no_temp=no_temp+1;
            the_temp(no_temp,1)=E_theta;
        end
    end
end
elem=elem(1:no,:);

%% FE-analysis
function [U]=FE(Nx,Ny,node,elem,x,penal)
[KE]=stiffness(elem);       % element stiffness matrix
Nn=size(node,1);    % Total number of nodes
Ne=size(elem,1);    % Total number of elements
K=zeros(3*Nn,3*Nn);     % global stiffness matrix
F=zeros(3*Nn,1);        % load vector
U=zeros(3*Nn,1);        % displacement vector
for jj=1:Ne
    n1=elem(jj,1);
    n2=elem(jj,2);
    edof=[3*n1-2;3*n1-1;3*n1;3*n2-2;3*n2-1;3*n2];
    K(edof,edof)=K(edof,edof)+x(jj)^penal*KE(:,:,jj);
end
% Define Loads and Supports
F(2,1)=-10;    %kN
fixeddofs=union([1:3*Nx:3*Nx*(Ny-1)+1],[3:3*Nx:3*Nx*(Ny-1)+3]);
fixeddofs=union([3*Nx-1],fixeddofs);
alldofs=[1:3*Nn];
freedofs=setdiff(alldofs,fixeddofs);
% Solving
U(freedofs,:)=K(freedofs,freedofs)\F(freedofs,:);
U(fixeddofs,:)=0;

%% Stiffness matrix
function [KE]=stiffness(elem)
E=10000;
b=0.2;
h=0.4;
inertia=b*h^3/12;
csarea=b*h;
Ne=size(elem,1);    % Total number of elements
KE1=zeros(6,6,Ne);
KE2=zeros(6,6,Ne);
KE=zeros(6,6,Ne);
KEL=zeros(6,6,Ne);
for jj=1:Ne
    EL=elem(jj,3);
    KE1(:,:,jj)=inertia*E/(EL^3)*...
        [0  0       0       0   0       0;
        0   12      6*EL    0   -12     6*EL;
        0   6*EL    4*EL^2  0   -6*EL   2*EL^2;
        0   0       0       0   0       0;
        0   -12     -6*EL   0   12      -6*EL;
        0   6*EL    2*EL^2  0   -6*EL   4*EL^2];
    KE2(:,:,jj)=csarea*E/EL*...
        [1  0   0   -1  0   0;
        0   0   0   0   0   0;
        0   0   0   0   0   0;
        -1  0   0   1   0   0;
        0   0   0   0   0   0;
        0   0   0   0   0   0];
    cs=cos(elem(jj,4));
    si=sin(elem(jj,4));
    T=[cs si  0   0   0   0;
        -si cs  0   0   0   0;
        0   0   1   0   0   0;
        0   0   0   cs  si  0;
        0   0   0   -si cs  0;
        0   0   0   0   0   1];
    KEL(:,:,jj)=KE1(:,:,jj)+KE2(:,:,jj);
    KE(:,:,jj)=T'*KEL(:,:,jj)*T;
end

%% Optimality Criteria Update
function [xnew]=OC(x,elem,Vlim,dc)
l1=0; l2=100000; move=0.1;
while (l2-l1>1e-4)
    lmid=0.5*(l2+l1);
    xnew=max(0.001,max(x-move,min(1,min(x+move,x.*sqrt(-dc./lmid)))));
    vol=xnew'*elem(:,3);
    if vol-Vlim>0
        l1=lmid;
    else
        l2=lmid;
    end
end

1 个答案:

答案 0 :(得分:0)

TL; DR:直接回答问题

  

x。* sqrt(-dc./lmid)的含义是什么,为什么我必须比较它?

(1) x。* sqrt(-dc./lmid) x·B e η ,更新后的值 x e new

(2)您必须对其进行比较,以确保它在适当的间隔内(大于或等于 x min x e -m ,并且小于或等于 1 x e + m )。

说明

什么是 B e η

按照最优性准则,您想将以前的 x e 估算值更新为更准确的值。通过将 x e 乘以因子 q

xenew = xe·q

  • 如果 q 恰好是 1 ,则 x e 已经在(可能 本地)。
  • 如果 q> 1 ,则您低估了 x e
  • 如果 q <1 ,则您高估了 x e

在您的示例中, q B e η

η的含义

首先要注意的是η是一个调整参数,即,它用于帮助该方法的收敛。之所以称为“阻尼系数”,是因为它会限制 B e η 的大小(请注意, 0 <η<= 1 < / em>)。在您的示例中,根据经验将其设置为0.5,即平方根。

为什么要进行比较

x e 限于 x min <= x e <= 1 。因此,我们必须确保 x e e new 小于 x min 或大于 1 ,我们将截断它。作为参考,该操作通常称为clamping。此外,我们还希望限制 x e new 一定程度上接近 x e em>(以帮助收敛)。因此,我们需要再次钳制 x e new 以使其比 m 值更近。两种比较都会确保 x e new 是有效的( x min <= x e ·B e η <= 1 )并接近先前的值( x e -m <= x e ·B e η <= x e + m )。

什么是sqrt(-dc./lmid)

B e η 。查看您添加的图像,我们可以看到 sqrt 来自η -dc -∂c/∂x e lmid 来自λ·∂V/∂x e 。在这种情况下,元素的体积总是相同, dV = 1 ,因此脱离了方程式。因此, lmid 仅是λ。之所以称为“中间”,是因为找到它,代码运行了bisection algorithm,它将每次迭代的间隔除以一半。