首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将scipy.optimize.minimize用于三个变量的函数?

如何将scipy.optimize.minimize用于三个变量的函数?
EN

Stack Overflow用户
提问于 2021-12-15 13:22:56
回答 1查看 659关注 0票数 2

我试图优化这个功能:

代码语言:javascript
复制
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阵列。

我试过:

代码语言:javascript
复制
initial_guess = [1, 1, 1]
result = minimize(voce, initial_guess)

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

我有点搞不懂怎么用这个

EN

回答 1

Stack Overflow用户

发布于 2021-12-30 16:23:32

由scipy.optimize.minimize优化的函数应该返回一个标量值。请看这里

也就是说,您可以实现一个for -循环,并为每个应变值求解应力.然后,你可以取压力值之和,并将其最小化。

在此之前,您需要首先按照以下方式重新构造您的语音功能:

代码语言:javascript
复制
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

现在,为了进行优化,引入一个新的函数,比如乐趣,您将传递sigma_ssigma_yepsilon_0以便最小化,strain (一维数组)作为您的语音函数的参数:

代码语言:javascript
复制
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

现在,按以下方式优化和打印结果:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
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是一个一维数组.现在,按以下方式优化和打印结果:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70364467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档