"only length-1 arrays can be converted to Python scalars" 在 Sage 中使用 scipy.optimize
"only length-1 arrays can be converted to Python scalars" using scipy.optimize in Sage
我想根据给定的一组数据调整模型的参数。
我正在尝试在 Sage 中使用 scipy
的函数 curve_fit
,但我不断得到
TypeError: only length-1 arrays can be converted to Python scalars
这是我的代码:
from numpy import cos,exp,pi
f = lambda x: exp( - 1 / cos(x) )
import numpy as np
def ang(time): return (time-12)*pi/12
def temp(x,maxtemp):
cte=(273+maxtemp)/f(0)**(1/4)
if 6<x and x<18:
return float(cte*f(ang(x))**(1/4)-273)
else:
return -273
lT=list(np.linspace(15,40,1+24*2))
lT=[float(num) for num in lT] #list of y data
ltimes=np.linspace(0,24,6*24+1)[1:]
ltimes=list(ltimes) #list of x data
u0=lT[0]
def u(time,maxtemp,k): #the function I want to fit to the data
def integ(t): return k*exp(k*t)*temp(t,maxtemp)
return exp(-k*time)*( numerical_integral(integ, 0, time)[0] + u0 )
import scipy.optimize as optimization
print optimization.curve_fit(u, ltimes, lT,[1000,0.0003])
scipy.optimize.curve_fit
期望模型函数向量化:也就是说,它必须能够接收一个数组(准确的说是ndarray),并且return 一组值。您可以通过添加调试打印输出立即看到问题
def u(time,maxtemp,k):
print time % for debugging
def integ(t): return k*exp(k*t)*temp(t,maxtemp)
return exp(-k*time)*( numerical_integral(integ, 0, time)[0] + u0 )
print 的输出将是您传递给 curve_fit
的整个数组 ltimes
。这是 numerical_integral
无法处理的问题。你需要一个一个地给它赋值。
像这样:
def u(time,maxtemp,k):
def integ(t): return k*exp(k*t)*temp(t,maxtemp)
return [exp(-k*time_i)*( numerical_integral(integ, 0, time_i)[0] + u0) for time_i in time]
这将解决“只能转换长度为 1 的数组”错误。然后您将有另一个错误,因为您的列表 ltimes 和 lT 的长度不同,这没有意义,因为 lT 是应该是输入 ltimes 的目标输出。您应该修改这些数组的定义以确定您想要的大小。
我想根据给定的一组数据调整模型的参数。
我正在尝试在 Sage 中使用 scipy
的函数 curve_fit
,但我不断得到
TypeError: only length-1 arrays can be converted to Python scalars
这是我的代码:
from numpy import cos,exp,pi
f = lambda x: exp( - 1 / cos(x) )
import numpy as np
def ang(time): return (time-12)*pi/12
def temp(x,maxtemp):
cte=(273+maxtemp)/f(0)**(1/4)
if 6<x and x<18:
return float(cte*f(ang(x))**(1/4)-273)
else:
return -273
lT=list(np.linspace(15,40,1+24*2))
lT=[float(num) for num in lT] #list of y data
ltimes=np.linspace(0,24,6*24+1)[1:]
ltimes=list(ltimes) #list of x data
u0=lT[0]
def u(time,maxtemp,k): #the function I want to fit to the data
def integ(t): return k*exp(k*t)*temp(t,maxtemp)
return exp(-k*time)*( numerical_integral(integ, 0, time)[0] + u0 )
import scipy.optimize as optimization
print optimization.curve_fit(u, ltimes, lT,[1000,0.0003])
scipy.optimize.curve_fit
期望模型函数向量化:也就是说,它必须能够接收一个数组(准确的说是ndarray),并且return 一组值。您可以通过添加调试打印输出立即看到问题
def u(time,maxtemp,k):
print time % for debugging
def integ(t): return k*exp(k*t)*temp(t,maxtemp)
return exp(-k*time)*( numerical_integral(integ, 0, time)[0] + u0 )
print 的输出将是您传递给 curve_fit
的整个数组 ltimes
。这是 numerical_integral
无法处理的问题。你需要一个一个地给它赋值。
像这样:
def u(time,maxtemp,k):
def integ(t): return k*exp(k*t)*temp(t,maxtemp)
return [exp(-k*time_i)*( numerical_integral(integ, 0, time_i)[0] + u0) for time_i in time]
这将解决“只能转换长度为 1 的数组”错误。然后您将有另一个错误,因为您的列表 ltimes 和 lT 的长度不同,这没有意义,因为 lT 是应该是输入 ltimes 的目标输出。您应该修改这些数组的定义以确定您想要的大小。