问题遇到的现象和发生
背景
我想用Python的for循环建立一个类似表示这样累加的表达式,然后return出来交给其他算法包计算全局最小值
问题相关代码,请勿粘贴截图
from scipy.optimize import differential_evolution,NonlinearConstraint
import openpyxl
import numpy as np
# 获取excel中注采数据
def get_injector_data():
workbook = openpyxl.load_workbook(r"C:\Users\gongxl3\Desktop\渗流优势通道评价方法研究\CB-B01H1_注采曲线.xlsx")
book_sheet = workbook["Sheet1"]
columns_all = book_sheet.columns
data = []
columns11 = list(columns_all)[10]
for value in columns11:
data.append(value.value)
data2 = data[2:]
return data2
def get_producer_data1():
workbook = openpyxl.load_workbook(r"C:\Users\gongxl3\Desktop\渗流优势通道评价方法研究\CB-A01H1_注采曲线.xlsx")
book_sheet = workbook["Sheet1"]
columns_all = book_sheet.columns
data = []
columns21 = list(columns_all)[21]
for value in columns21:
data.append(value.value)
data2 = data[2:]
return data2
# 定义目标函数
def objfunc(lp, tp, lij, tij, injector_data, producer_data1):
inj = injector_data; pro = producer_data1
obj_sum = 0
obj_sum_square = 0
for n in range(len(pro)):
tij_ = 0
for m in range(n):
t = (1/tij) * np.exp((m - n)/tij) * inj[m]
tij_ = t + tij_
pro_eval = lp * np.exp(-n / tp) + lij * tij_
obj_sum = obj_sum + pro_eval
obj_sum_square = (pro[n] - obj_sum) ** 2 + obj_sum_square
return obj_sum_square
def main():
injector_data = get_injector_data()
producer_data1 = get_producer_data1()
# lp, tp, lij, tij
lp_min, lp_max = 0, 2
tp_min, tp_max = 0, 4
lij_min, lij_max = 0, 2
tij_min, tij_max = 0, 4
bounds = [[lp_min, lp_max], [tp_min, tp_max], [lij_min, lij_max], [tij_min, tij_max]]
objfunc1 = objfunc('lp', 'tp', 'lij', 'tij', injector_data, producer_data1)
result = differential_evolution(objfunc1, bounds)
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['lp', 'tp', 'lij', 'tij']
evaluation = objfunc1(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))
lp, tp, lij, tij,是想要return出来的表达式中的四个未知数,injector_data, producer_data1是两个列表(for循环就是循环这两个列表的值),我知道我代码的问题是str和int不能做算数运算,但是我不知道怎么去改(原谅我刚学两个月python)
运行结果及报错内容
TypeError: unsupported operand type(s) for /: 'int' and 'str'
我的解答思路和尝试过的方法
我想要达到的结果
def objective(v):
x, y = v
return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20
我想要得到这个return中一样的函数,但这个函数是一个比较确定的,我想得到的那个函数需要通过传入两个列表建立,求帮帮忙