lala_1994 2022-04-20 10:18 采纳率: 100%
浏览 115
已结题

python中使用定义一个函数,使用for循环return一个带参数的表达式,然后把这个表达式给其他包做最优化

问题遇到的现象和发生

img


背景
我想用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中一样的函数,但这个函数是一个比较确定的,我想得到的那个函数需要通过传入两个列表建立,求帮帮忙

  • 写回答

3条回答 默认 最新

  • 张一毛 2022-04-20 10:50
    关注

    你首先要确定,你的objfunc函数返回的是函数,还是你函数的计算结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月20日

悬赏问题

  • ¥15 NeRF的代码复现以及人工智能入门
  • ¥15 centos如何做一个可以让ikuai连接的openvpn
  • ¥15 Protege 中的Entities下面的界面删除了如何复原
  • ¥15 scrapy爬虫求帮
  • ¥15 imageEnView绘图问题
  • ¥15 关于#python#的问题:您好可以加您一下联系方式吗,在复现的时候确实有点问题难以解决
  • ¥15 联想电脑重装系统时无法发现硬盘
  • ¥15 MATLAB与UR10e实体机械臂建立通讯
  • ¥15 c++题需要快一点不用opencv
  • ¥15 关于#java#的问题:想要咨询Flowable流程引擎框架的问题