由 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_s、sigma_y 和 epsilon_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)