[Python] Why constrained minimization fails in python

Discussão em 'Python' iniciado por Stack, Fevereiro 28, 2025.

  1. Stack

    Stack Membro Participativo

    I'm trying to numerically solve some mechanism design question using the following code. However, the output is not optimal(just stay at my initial guess). How should I make it work?

    I tried different initial guesses ( I can calculate myself so the initial guess is valid, each x0 may give different solutions).

    I also switched methods, but some results (like Nelder-Mead) generate really invalid solutions (violating my constraints).

    import numpy as np
    from scipy.optimize import minimize

    p0=0.3
    r1=0.4
    r2=0.8


    p1s=r1/(r1+1)
    p2s=r2/(r2+1)

    q1=(r1+r1*r2)/(r2+r1*r2)

    q2=r1/r2

    q=(q1+q2)/2

    def v_1(k,p0):
    if p0>p1s and k>p0:
    return r1-p0*r1/k
    elif p0<p1s and k>p1s:
    return p0+p0*r1-p0*r1/k
    return 0

    def v_2(k,p0):
    if p0>p2s and k>p0:
    return r2-p0*r2/k
    elif p0<p2s and k>p2s:
    return p0+p0*r2-p0*r2/k
    return 0

    def V(p):
    if p<p1s:
    return p
    if p>p2s:
    return q*r2*(1-p)
    A=r1-r1/(r2-r1)*(p+p*r2-r1)
    return q*p+(1-q)*A

    def objective(x):
    k1,k2,p1,p2 = x
    return -q*(p2+V(k2))+(1-q)*(p1+V(k1)) # Convert to minimization

    def IR1(x):
    k1,k2,p1,p2 = x
    return v_1(k1,p0)-p1

    def IR2(x):
    k1,k2,p1,p2 = x
    return v_2(k2,p0)-p2

    def IC1(x):
    k1,k2,p1,p2 = x
    return v_1(k1,p0)-p1-v_1(k2,p0)-p2

    def IC2(x):
    k1,k2,p1,p2 = x
    return v_2(k2,p0)-p2-v_2(k1,p0)-p1

    constraints = [
    {'type': 'ineq', 'fun': lambda x: IR1(x)},
    {'type': 'ineq', 'fun': lambda x: IR2(x)},
    {'type': 'ineq', 'fun': lambda x: IC1(x)},
    {'type': 'ineq', 'fun': lambda x: IC2(x)}
    ]

    # Bounds for x1, x2
    bounds = [(p0, 1), (p0, 1), (0,p0), (0,p0)] #k1,k2>=p0,p0>=p1,p2>=0

    # Initial guess
    x0 = [p0, 1, 0,p0 ]

    # Solve the problem
    result = minimize(objective, x0, bounds=bounds, constraints=constraints,method='SLSQP')

    # Print results
    if result.success:
    print("Optimal solution found:")
    print(f"k1 = {result.x[0]:.4f}, k2 = {result.x[1]:.4f}")
    print(f"p1 = {result.x[2]:.4f}, p2 = {result.x[3]:.4f}")
    print(f"Maximum function value: {-result.fun:.4f}")
    else:
    print("Optimization failed:", result.message)**strong text**

    Continue reading...

Compartilhe esta Página