如何确定导致TypeError的原因:/:'float'和'list'`不支持的操作数类型。

时间:2019-10-14 21:41:53

标签: python optimization

我正在执行优化,但是出现了错误错误(TypeError: unsupported operand type(s) for /: 'float' and 'list')。

我在Excel中有几个已知的论点(Jflu,Ci,Rd,O,A)。我首先使用Pandas从excel导入这些参数。 g是一个未知常数,我想获得一个最佳的g以使objfun最小化。

我是Python的新手。我的代码如下:

#import my data 
import pandas as pd
curves=pd.read_excel('C:/Users/Hello World/Curves.xlsx')
j=curves.Jflu
c=curves.Ci
R=curves.Rd
O=curves.O
A=curves.A

# optimize data
from scipy.optimize import minimize
#objective function
def objfun(g):
    return (-(j/g+4.0*c+8.0*O-4.0*R/g)-((j/g+4.0*c+8.0*O-4.0*R/g)**2.0-4.0*(-4.0/g)*(8.0*O*R+4.0*c*R+O*j-c*j))**0.5)/(2.0*(-4.0/g))-A

g0=[0.001]
print(objfun(g0))

#Bounds
bnds=((0,1.0),)

#Minimize the function
res=minimize(objfun,g0,method='SLSQP',bounds=bnds)
print (res)

2 个答案:

答案 0 :(得分:2)

g0=[0.001]
print(objfun(g0))

g0是一个包含单个整数的列表。您将此传递给使用它(列表)进行除法的函数。将g0定义为g0 = 0.001应该可以解决此问题。

答案 1 :(得分:0)

就像调用objfun(g0)一样,您正在传递一个列表。 g0在声明为g0 = [0.001]时被定义为列表。您可以:

  • 将其声明为非列表变量:g0 = 0.001
    • 如果您希望每次都传递一个值,请执行此操作。
  • 使函数使用列表中的值:return (-(j/g[0]+4.0*c+8.0*O-4.0*R/g[0])-((j/g[0]+4.0*c+8.0*O-4.0*R/g[0])**2.0-4.0*(-4.0/g[0])*(8.0*O*R+4.0*c*R+O*j-c*j))**0.5)/(2.0*(-4.0/g[0]))-A
    • 如果您打算扩展代码以处理列表,请执行此操作-假设您有一个g[0]g[i]到{的for循环计数,i将变成0 {1}},并且未使用有范围的for循环。