Что было бы подходящим ограниченным решателем оптимизации в python для этой проблемы;и проблема типа ошибки - PullRequest
1 голос
/ 14 марта 2011

Я собираюсь использовать 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 голос
/ 14 марта 2011

Если вы позволите оптимизатору работать со значениями с плавающей запятой, возможно, вы можете предположить, что правильным целочисленным результатом является либо floor (nt), либо ceil (nt), поэтому просто оцените эти два и выберите.

1 голос
/ 14 марта 2011

scikits.openopt.MILP может быть то, что вы ищете.Таким образом, вы рассматриваете проблему как целочисленную проблему программирования с самого начала, без необходимости ceil или floor.

1 голос
/ 14 марта 2011

Второй вопрос: похоже, где-то у вас есть «x ** y», где y - это число с плавающей точкой, а x - это NoneType. Это, вероятно, означает, что nre, npr, vsb или vsw является NoneType к тому времени, когда он передается в nnuf (). Попробуйте напечатать эти переменные и посмотрите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...