该问题适合使用哪种Python约束优化求解器,以及类型错误问题

1 投票
3 回答
540 浏览
提问于 2025-04-16 13:38

我想用Python(代替Excel)来完成一个非编程相关的工程课程作业。我正在尝试找出在不同大小的管子中,热交换器的最佳管子数量。这个数量依赖于六个相关的量,并且有一些限制条件。其中一些方程是线性的,但管子的数量必须是一个正整数。我知道有一个叫做scipy.optimize的库,可以用math.ceil把试验的数字变成整数,但我觉得应该还有其他更好的库可以用。

我把目前的代码放在这里

下面是关于优化问题的代码部分。问题是,fsolve的结果变化不够,导致用m.ceil处理初始猜测时没有改变。

def ntf():
    fdn = 0.85 * 62.43 
    #            lb/ft^3
    vsb = fdn * 5 * (1.076 * 10 ** -5)
    #     lb/ft^3 * Cst * (ft^2/s) / Cst
    kf  = 0.08
    fcp  = 0.5
    #     Btu/ft^2-hr-(F/ft)
    dua = uaf()

    for i, x in enumerate(bwg16):
        def func(nt):
            nt   = m.ceil(nt)
            vel  = velf(nt, x)
            nre  = nref(vel, bwg16[x][1], fdn, vsb)
            npr  = nprf(fcp, vsb, kf)
            nnu  = nnuf(nre, npr, vsb, vsb)
            idc  = idcf(nnu, bwg16[x][1], kf)
            ohtc = ohtcf(idc, x)
            fa   = nt * bwg16[x][3]
            sa   = 40 * nt * bwg16[x][2] 
            ua   = ohtc * sa
            diff = ua - dua
            return diff

        nts[x] = opt.fsolve(func, 40, xtol = 0.01)
        # TODO:  Optimize nt such that diff is positive but as close to zero as
        # possible.  nt needs to be an integer.  Then, I need to be able to
        # extract nt, nre, vel, and sa into a dictionary to compare later.  If
        # all else fails, I suppose I could recalculate the rest later given
        # the working nt.

    return nts

总之,你能推荐一个更好的Python库或函数来处理这个问题吗?

编辑:我解决了一个类型错误的问题,之前是因为忘记了一些返回语句。

3 个回答

1

第二个问题:看起来你在某个地方使用了"x ** y",其中y是一个浮点数,但x却是NoneType。这可能意味着在传入nnuf()之前,nre、npr、vsb或vsw中的某一个是NoneType。你可以试着打印这些变量,看看它们的值。

1

scikits.openopt.MILP 可能正是你需要的东西。这样一来,你可以从一开始就把问题当作一个整数规划问题来处理,不需要使用 ceilfloor 这些函数。

1

如果你让优化器使用浮点数值进行计算,那么你可以认为正确的整数结果要么是向下取整的值(floor(nt)),要么是向上取整的值(ceil(nt))。所以你只需要计算这两个值,然后选择一个就可以了。

撰写回答