【问题标题】:Multivariable Optimization in PythonPython中的多变量优化
【发布时间】:2022-01-26 04:52:52
【问题描述】:

我有一个包含两个输入变量的函数,我们希望对其进行优化。该函数返回一个输出,我们希望最小化这个输出。在 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))

【问题讨论】:

标签: python optimization scipy


【解决方案1】:

您可以使用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)

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

【讨论】:

  • 非常感谢!!有用!这是我没有工作的 scypi 代码:i.imgur.com/3Uflt9G.png 再次感谢! :)
  • 很高兴它对您有用!如果我的回答解决了你的问题,你应该看看what should I do when someone answers my question :)。
猜你喜欢
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2020-10-30
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多