scipy 如何在Pyhon中找到函数的最大最小点?

k10s72fa  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(90)

我需要找到一个函数的最大最小点。
有两个矩阵M_AM_B,其中M_A < M_BI > M_B(按元素比较),其中I是所有1的矩阵。
我需要找到x(在0和1之间),使得:
x*M_A+(1-x)*I >= M_B(逐元素比较)
为了做到这一点,我试图找到下面表达式x*M_A+(1-x)*I - M_B的根。为此,我定义了一个标量函数,取上面表达式(x*M_A+(1-x)*I - M_B)中所有负数项的和。目标是找到x的值,使得my_f(x)=0。然而,有无限个x s满足这个条件,例如my_f(0)=0。我想得到最大的x

def my_f(x):
    matrix_comb = x*M_A + (1-x)*np.ones((n, n))
    matrix_diff = matrix_comb - M_B
    summ = 0
    for i in range(0, len(matrix_diff)):
        for j in range(0, len(matrix_diff)):
            if matrix_diff[i,j] <= 0:
                summ = summ + matrix_diff[i,j]
    return -summ

my_f(scipy.optimize.fminbound(my_f, 0, 1))

代码返回0.85。然而,还有其他更大的x值满足条件。

px9o7tmv

px9o7tmv1#

我从字面上理解你的问题;也就是说,你真的是在寻找最大值x服从你的不等式;我忽略了一切之后 * 这样做我. *。因为寻根无助于实现这一目标。

import numpy as np
import scipy

rand = np.random.default_rng(seed=0)
m = 13
n = 7
M_A = rand.uniform(low=-1, high=1, size=(m, n))
M_B = rand.uniform(low=M_A, high=1, size=(m, n))

'''
Maximize x s.t.
0 <= x <= 1
x*M_A + (1-x)*ones >= M_B
x(MA - 1) >= MB - 1
'''

result = scipy.optimize.milp(
    c=-1,           # maximize
    integrality=0,  # continuous
    bounds=scipy.optimize.Bounds(lb=0, ub=1),
    constraints=scipy.optimize.LinearConstraint(
        A=M_A.reshape((m*n, 1)) - 1,
        lb=M_B.ravel() - 1,
    )
)
assert result.success, result.message

print('x =', result.x)

相关问题