[SciPy-user] Handling of constraints in cobyla

Nils Wagner nwagner at mecha.uni-stuttgart.de
Fri Jun 17 10:03:44 CDT 2005

Hi all,

How can I replace the first two constraints (con1 and con2) in my 
program (see below) ?
In general the constraints con1 and con2 are not given explicitely in my 
problem, but they follow from an eigenvalue analysis.

w = linalg.eigvals(K,M)
w[0].real - xi0
w[1].real - xi0

If I have more constraints like con3 and con4 is there a way to simplify 
the procedure ?

I would be grateful for your help

Thanks in advance


from scipy import *

def test2(x,xi0):
        function = lambda x: dot(c,x)
        con1 = lambda x: (4*x[0]+2*x[1])/3-xi0   # First Eigenvalue is 
no lower than xi0
        con2 = lambda x: 4*x[0]-xi0              # Second eigenvalue is 
no lower than xi0
        con3 = lambda x: x[0]                    # Stiffness parameter >= 0
        con4 = lambda x: x[1]                    # Stiffness parameter >= 0

        x = optimize.fmin_cobyla(function, x0, [con1, con2, con3, con4], 
                           rhoend=1e-5, iprint=0, maxfun=1400)
        return x

c = array(([3,1]))
# Initial stiffness parameters
x0 = array(([1.3,1]))
# Parameter-dependent stiffness matrix
K = array(([4*x0[0]+x0[1],x0[1]],[x0[1],4*x0[0]+x0[1]]))
# Constant mass matrix
M = array(([2,1],[1,2]))

w = linalg.eigvals(K,M)

print 'Eigenvalues of the initial design',w
print 'Exakt eigenvalues',(4*x0[0]+2*x0[1])/3, 4*x0[0]
# Find the smallest eigenvalue
ind = argsort(w.real)
ws = take(w,ind)
xi0 = ws[0].real

x = test2(x0,xi0)

print 'Optimal stiffness parameters',x

M = array(([2,1],[1,2]))
K = array(([4*x[0]+x[1],x[1]],[x[1],4*x[0]+x[1]]))

w = linalg.eigvals(K,M)
print 'Eigenvalues of the optimal design',w

More information about the SciPy-user mailing list