【问题标题】:How to use scipy.optimize.minimize for function with 3 variables?如何将 scipy.optimize.minimize 用于具有 3 个变量的函数?
【发布时间】:2021-12-15 13:22:56
【问题描述】:

我正在尝试优化这个功能:

def voce(strain, sigma_s, sigma_y, epsilon_0):
    stress = sigma_s - (sigma_s - sigma_y)*np.exp(-strain/epsilon_0)
    return stress

通过找到 sigma_s、sigma_y 和 epsilon_0 的最佳值。应变和应力应该是一维 numpy 数组。

我试过了:

initial_guess = [1, 1, 1]
result = minimize(voce, initial_guess)

但我得到“ValueError:只能将大小为 1 的数组转换为 Python 标量”

我有点困惑如何使用最小化这个

【问题讨论】:

  • 你说stress应该是一维数组。然而scipy.optimize 只能优化标量函数:“最小化一个或多个变量的标量函数。” (docs.scipy.org/doc/scipy/reference/generated/…)。
  • 您可以提供一个您喜欢优化的功能的参考吗?是语音方程吗?
  • 您想在您的应力-应变数据上拟合语音方程吗?并且需要为此目的优化参数?对吗?

标签: python scipy scipy-optimize-minimize


【解决方案1】:

由 scipy.optimize.minimize 优化的函数应该返回一个标量值。请参阅here

话虽如此,您可以实现一个 for 循环并解决每个应变值的应力。之后,您可以取应力值的总和并最小化总和。

在此之前,您需要先重组您的 VOCE 函数,如下所示:

import numpy as np

def voce(sigma_s, sigma_y, epsilon_0, strain):
    stress = sigma_s - (sigma_s - sigma_y)*np.exp(-strain/epsilon_0)
    return stress

现在,为了优化,引入一个新函数,比如 fun,您将在其中传递 sigma_ssigma_yepsilon_0 以最小化和 strain (1-D array) 作为 VOCE 函数的参数:

def fun(x, strain):

    sigma_s = x[0]
    sigma_y = x[1]
    epsilon_0 = x[2]

    stress = []
    sum = 0

    for i in strain:
        s = voce(sigma_s, sigma_y, epsilon_0, i)
        stress.append(s)

    sum = np.sum(stress)

    return sum

现在,优化并打印结果如下:

from scipy.optimize import minimize

# strain = [x,y,z] <-- Assign your strain array here
initial_guess = [1, 1, 1]
res = minimize(fun, initial_guess, method="Nelder-Mead", args=(strain))
print(res)

此外,如果您想将 VOCE 方程拟合到您的应力-应变数据(意味着您已经从实验中测量了应力值),您可以使用以下方法将 VOCE 方程的结果(计算的应力)与测量的应力进行比较来自sklearn 的均方误差。为此,您可以将 fun 更改为:

from sklearn.metrics import mean_squared_error

def fun(x, measured_strain, measured_stress):

    sigma_s = x[0]
    sigma_y = x[1]
    epsilon_0 = x[2]

    calculated_stress = []
    error = 0

    for i in measured_strain:
        s = voce(sigma_s, sigma_y, epsilon_0, i)
        calculated_stress.append(s)

    error = mean_squared_error(measured_stress, calculated_stress)

    return error

其中measured_stress 是一维数组。现在,优化并打印结果如下:

from scipy.optimize import minimize

# measured_strain = [x,y,z] <-- Assign your measured strain array here
# measures_stress = [a,b,c] <-- Assign your measured stress array here
initial_guess = [1, 1, 1]
res = minimize(fun, initial_guess, method="Nelder-Mead",
               args=(measured_strain, measured_stress))
print(res)

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @ErvinSzilagyi 我现在尝试改进我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多