Python 中的多变量优化

Multivariable Optimization in Python

我有一个包含两个输入变量的函数,我们希望对其进行优化。函数 returns 一个输出,我们想最小化这个输出。在 Python 中执行此操作的最佳方法是什么?

目前函数输入变量已被硬编码,目标是迭代一个范围并找到两个参数的最佳值。

我研究了 scipy 但不确定如何在我的情况下使用它。

我的代码的输出如下所示。

def average_receptance(K_t, C_t):

    frequency_matrix = np.array([])
    alphabetaE11_matrix = np.array([])

    for i in range(first_natural_frequency - natural_frequency_delta,first_natural_frequency + natural_frequency_delta):
    
        frequency_matrix = np.append(frequency_matrix, i)
        alphabetaE11_matrix = np.append(alphabetaE11_matrix, math.log(abs(receptance(K_t, C_t, i))))
        
    receptance_average = np.average(alphabetaE11_matrix)

    return receptance_average

print(average_receptance(600000, 50))
print(average_receptance(626759, 50))
print(average_receptance(650000, 50))

print(average_receptance(600000, 100))
print(average_receptance(626759, 100))
print(average_receptance(650000, 100))

print(average_receptance(600000, 150))
print(average_receptance(626759, 150))
print(average_receptance(650000, 150))

您可以使用 scipy.optimize.minimize 来最小化具有一个或多个变量的标量函数。为此,首先将您的函数更改为:

def average_receptance(x):

    K_t = x[0]
    C_t = x[1]

    frequency_matrix = np.array([])
    alphabetaE11_matrix = np.array([])

    for i in range(first_natural_frequency - natural_frequency_delta,first_natural_frequency + natural_frequency_delta):
    
        frequency_matrix = np.append(frequency_matrix, i)
        alphabetaE11_matrix = np.append(alphabetaE11_matrix, math.log(abs(receptance(K_t, C_t, i))))
        
    receptance_average = np.average(alphabetaE11_matrix)

    return receptance_average

然后使用scipy的最小化函数来最小化变量。您需要通过初始猜测才能开始优化。您可以按如下方式执行此操作:

x0 = [600000, 50] # -> example guess for K_t and C_t
res = minimize(average_receptance, x0, method="Nelder-Mead",
               options={'disp':True, 'fatol':1e-04})
print(res)

以上代码将最小化函数的两个参数。