User Tools

Site Tools


optimization

Example: Shape optimization of cross-hinge

This example provides a shape optimization of a single cross flexure by using matlab's fmincon function. For this optimization a crosshinge is considered with a mass and inertia connected to node 3. Furthermore, the optimization objective is to maximize the first parasitic frequency of the system (note: rotation of the cross-hinge is prescribed to de desired rotation angle. Therefore, the first parasitic frequency of the system is given by the first eigenfrequency). A rotation of 0.5rad, a maximum stress of 300MPa and and a maximum actuation force of 2.5Nm is considered.

The cost function of the optimization is defined by the inverse of the first eigenfrequency. Additionally, a limit on the maximum stress and actuation force is implemented by applying a penalty on the value of the cost function. The matlab function which calls spacarlight and computes the cost function is defined by:

run_sim.m
function [cost, out] = run_sim(P, Silent)% EXAMPLE SCRIPT FOR RUNNING SPACAR LIGHT
if nargin == 1
    Silent = true; %run in silent mode when called by optimizer
end 
 
% DESIGN PARAMETERS
H = P(1);
B = P(2);
w = P(3);
t = P(4);
 
% Optimization parameters
stressmax = 300e6; %Max stress [MPa]
Mmax = 2.5; %Max actuation moment [Nm]
Stroke = 0.5; %Max stroke [Rad]
 
 
%% NODE POSITIONS
%           x y z
nodes = [   0 0 0;    %node 1  
            0 H 0;    %node 2  
            B H 0;    %node 3
            B 0 0];   %node 4
 
 
%% ELEMENT CONNECTIVITY
%               p   q
elements = [    1   3;  %element 1
                2   3;  %element 2
                2   4]; %element 3
 
%% NODE PROPERTIES  
%node 1
nprops(1).fix               = true;         %Fix node 1
 
%node 3
nprops(3).rot_z           = Stroke;
nprops(3).mass            = 1;
nprops(3).mominertia      = [1e-3 0 0 1e-3 0 1e-3];
 
%node 4
nprops(4).fix               = true;         %Fix node 4
 
 
%% ELEMENT PROPERTIES
%Property set 1
eprops(1).elems    = [1 3];            %Add this set of properties to elements 1 and 3
eprops(1).emod     = 210e9;            %E-modulus [Pa]
eprops(1).smod     = 70e9;             %G-modulus [Pa]
eprops(1).dens     = 7800;             %Density [kg/m^3]
eprops(1).cshape   = 'rect';           %Rectangular cross-section
eprops(1).dim      = [w t];   %Width: 50 mm, thickness: 0.2 mm
eprops(1).orien    = [0 0 1];          %Orientation of the cross-section as a vector pointing along "width-direction"
eprops(1).nbeams   = 2;                %Number of beams used to model this element 
eprops(1).flex     = 1:6;              %Consider all deformation modes (1 to 6) as flexible
eprops(1).color    = 'grey';           %Color
eprops(1).opacity  = 0.7;              %Opacity
eprops(1).cw       = true;             %Constrain warping at nodes (typical condition for flexure clamped at both ends). For a "free" end, warping is typically not constrained
 
%Property set 2
eprops(2).elems    = 2;                %Add this set of properties to element 2
eprops(2).dens     = 3000;             %Density [kg/m^3]
eprops(2).cshape   = 'rect';           %Rectangular cross-section
eprops(2).dim      = [w 10e-3];    %Width: 50 mm, thickness: 10 mm
eprops(2).orien    = [0 0 1];          %Orientation of the cross-section as a vector pointing along "width-direction"
eprops(2).nbeams   = 1;                %1 beam for simulating this element (as it is rigid an no more elements are required)
eprops(2).color    = 'darkblue';
 
 
%% OPTIONAL ARGUMENTS
opt.filename    = 'crosshinge';     %Filename
opt.calccompl   = false;            %Disable calculation of compliance matrices (can reduce computation time for large simulations)
opt.silent      = Silent;            %Run in silent mode
 
%% CALL SPACAR_LIGHT AND COMPUTE COST FUNCTION
try
    out = spacarlight(nodes, elements, nprops, eprops, opt);
    cost = 1/min(out.freq(1,:)); %cost function (inverse of first frequency )
    stress = max(out.stressmax); %max stress
    Mact = max(out.node(3).Mreac(3,:));%max actuation moment
 
    %add penalty if limits are exceeded
    if stress > stressmax
        cost = cost * (1 + (stress-stressmax)/stressmax)^5;
    end
    if Mact > Mmax
        cost = cost * (1 + (Mact-Mmax)/Mmax)^5;
    end
catch %if sumulation fails, cost is inf
    cost = inf;
end

An example to conduct the optimization is provided below, taking into account additional boundary conditions on the design parameters of the cross-hinge. See matlab's documentation on fmincon for more information.

optimization.m
%filename
simulation = @run_sim;
 
%starting point
x0 = [0.1;  0.1;  50e-3; 0.2e-3];
 
%constraints
b1 = [0.05; 0.05; 25e-3; 0.1e-3];   % Lower bound (b1 < x)
b2 = [0.2;  0.2;  75e-3; 1e-3  ];       % Upper bound (x < b2)
 
A = [-eye(4); eye(4)];
b = [-b1;b2];
 
%optimization
x_opt = fmincon(simulation, x0, A, b);
 
%show results
[cost, out] = run_sim(x_opt,false);

Note: prescribing input rotation is only supported for SPACAR light version 1.27 or higher.

optimization.txt · Last modified: 2022/01/12 13:41 by jan.dejong