我试图优化这个功能:
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标量“
我有点搞不懂怎么用这个
发布于 2021-12-30 16:23:32
由scipy.optimize.minimize优化的函数应该返回一个标量值。请看这里。
也就是说,您可以实现一个for -循环,并为每个应变值求解应力.然后,你可以取压力值之和,并将其最小化。
在此之前,您需要首先按照以下方式重新构造您的语音功能:
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_s、sigma_y和epsilon_0以便最小化,strain (一维数组)作为您的语音函数的参数:
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)此外,如果您想将声音方程与您的应力应变数据(意味着您已经从实验中测量到的应力值)进行拟合,您可以使用来自sklearn的均方误差将声音方程的结果(计算的应力)与实测的应力进行比较。为此,您可以将乐趣更改为:
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)https://stackoverflow.com/questions/70364467
复制相似问题