在 Python 中最小化具有约束的函数

Minimization of a function with constraints in Python

我正在尝试最小化包含我要查找的最小化参数的三个 N 大小数组的函数。例如,假设为了最小化函数我想要找到的参数由数组 x = x[0],x[1],...,x[N-1]a = a[0],a[1],...,a[N-1]b = b[0],b[1],...,b[N-1] 给出。此外,在该问题中,最小化边界受到约束,约束条件为:

0 <= x[i]  and  sum(x[i])-1=0  for all  i=0,...,N-1
0 <= a[i] <= Pi/2  for all  i=0,...,N-1
0 <= b[i] <= Pi/2  for all  i=0,...,N-1

问题之后,我能够如下定义这些约束:

import numpy as np

#defining the constraints for minimization
#constraints on x:
Dx_lhs = np.diag(np.ones(N))
def xlhs(x): #left hand side
    return Dx_lhs @ x
def xrhs(x): #right hand side
    return np.sum(x) -1
con1x = {'type': 'ineq', 'fun': lambda x: xlhs(x)}
con2x = {'type': 'eq', 'fun': lambda x: xrhs(x)}

#constraints on a:
Da_lhs = np.diag(np.ones(N))
Da_rhs = -np.diag(np.ones(N))
def alhs(a):
    return Da_lhs @ a
def arhs(a): 
    return Da_rhs @ a + (np.ones(N))*np.pi/2
con1a = {'type': 'ineq', 'fun': lambda a: alhs(H)}
con2a = {'type': 'ineq', 'fun': lambda a: -1.0*Hrhs(H)}

# Restrições em b:
Db_lhs = np.diag(np.ones(N))
Db_rhs = -np.diag(np.ones(N))
def blhs(b):
    return Db_lhs @ b
def brhs(b): 
    return Db_rhs @ b + (np.ones(N))*np.pi/2
con1b = {'type': 'ineq', 'fun': lambda b: alhs(H)}
con2b = {'type': 'ineq', 'fun': lambda b: -1.0*Hrhs(H)}

现在假设我有一个像这样的函数:

def fun(mins): #just an example
    x, a, b = mins
    for i in range(N):
        sbi=0; sai=0
        for j in range(i+1):
            sbi += 2*x[j]*np.tan(b[j])
            sli += 2*x[j]*np.tan(a[j])
        B[i]=sbi
        A[i]=sai
    return (B @ C)

这不起作用,因为函数的第一行可能不是定义它的正确方法(我不知道应该如何声明包含我想要最小化的变量的数组)。任何人都可以帮我解决这个问题并应用 scipy.optimize.minimize 来找到 x[], a[]b[] 的值来最小化我的功能吗?

P.S.: 给出的函数只是为了说明目的,最小化解决方案可能是显而易见的。

to-be-minimized 函数应接受所有参数的一维数组。如果要将此数组拆分为 3 个不同的数组,可以使用重塑操作:

x, a, b = mins.reshape(3, N)