如何确定“TypeError:不支持/:”float“和”list“的操作数类型的原因`

2024-10-03 04:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做优化,但我得到了一个错误(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)

Tags: importcidata参数functionrdexcelpd
2条回答
g0=[0.001]
print(objfun(g0))

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

看起来当你调用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循环计数i0len(g),并且没有使用ranged for循环

相关问题 更多 >