对于这个问题,python中适当的约束优化求解器是什么;并键入错误问题

时间:2011-03-14 03:40:38

标签: python optimization scipy

我希望在非编程相关的工程类中使用python(代替excel)进行赋值。我试图在热交换器中找到几个不同尺寸管的最佳管数。这个数字取决于六个相关数量,并有一些约束。这些方程式中很少是线性的,但管的数量必须是正整数。我知道scipy.optimize包并使用math.ceil将试用数转换成整数,但必须有一个更好的包装出来。

我把代码放在here

以下是有优化问题的部分。问题是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 个答案:

答案 0 :(得分:1)

第二个问题:它看起来像某个地方你有“x ** y”,其中y是一个浮点数,但x是一个NoneType。这可能意味着nre,npr,vsb或vsw在传递给nnuf()时是一个NoneType。尝试打印这些变量并查看。

答案 1 :(得分:1)

如果让优化器使用浮点值,也许你可以假设正确的整数结果是floor(nt)或ceil(nt),所以只需评估这两个并选择。

答案 2 :(得分:1)

scikits.openopt.MILP可能就是你要找的东西。这样您就可以从一开始就将问题视为整数规划问题,而无需ceilfloor.