我正在使用
scipy.optimize.least_square
来尝试最小化函数的残差。
这是代码:
def solido_3parameters(time, strain0, eta1, time0, stiffness2, eta):
return strain0 + (sigma0 / eta1) * (time-time0) + sigma0 / stiffness2 * (1 - np.exp(-(time time0) * stiffness2/eta))
def residual(parameters):
strain0 = parameters[0]
eta1 = parameters[1]
time0 = parameters[2]
stiffness2 = parameters[3]
eta = parameters[4]
strain_fitted = solido_3parameters(time, strain0, eta1, time0, stiffness2, eta)
RSS = np.sum(np.square(strain - strain_fitted))
return RSS
initial_params = [1.0, 2, 1.5, 1.0, 1.0]
leastsq(residual, x0=initial_params)
但我收到此错误消息:
TypeError: Improper input: func input vector length N=5 must not exceed func output vector length M=1.
问题可能是什么?我尝试阅读源码,但没有找到这个错误的可能原因。
您共享的代码的某些部分不起作用。 例如,在你的函数中
def solido_3parameters(time, strain0, eta1, time0, stiffness2, eta):
return strain0 + (sigma0 / eta1) * (time-time0) + sigma0 / stiffness2 * (1 - np.exp(-(time time0) * stiffness2/eta))
sigma0
未定义,并且 np.exp(-(time time0)
不是有效的表达式。
但是既然你收到了错误消息
TypeError: Improper input: func input vector length N=5 must not exceed func output vector length M=1.
,你必须有一个可用的代码。
为此,第一个更正是使用 Scipy,您应该导入
scipy.optimize.leastsq
而不是 scipy.optimize.least_square
,因为您想使用该函数 leastsq()
from scipy.optimize import leastsq
而你得到错误的原因是你传递给
leastsq()
的函数必须返回与参数相同数量(或更多)的点。由于您传递了 5 个参数,因此您必须返回一个包含 5 个或更多数字的数组。
例如,这段代码不会抛出错误:
from scipy.optimize import leastsq
import numpy as np
def solido_3parameters(time, strain0, eta1, time0, stiffness2, eta):
sigma0 = 0
return strain0 + (sigma0 / eta1) * (time-time0) + sigma0 / stiffness2 * (1 - np.exp(-(time - time0) * stiffness2/eta))
def residual(parameters):
strain0 = parameters[0]
eta1 = parameters[1]
time0 = parameters[2]
stiffness2 = parameters[3]
eta = parameters[4]
time = 0
strain_fitted = solido_3parameters(time, strain0, eta1, time0, stiffness2, eta)
strain = 0
RSS = np.sum(np.square(strain - strain_fitted))
return [RSS, 0, 0, 0, 0]
initial_params = [1.0, 2, 1.5, 1.0, 1.0]
leastsq_result = leastsq(residual, x0=initial_params)
print(leastsq_result)