Решение неявной функции и передача трех аргументов - PullRequest
0 голосов
/ 01 июля 2018

enter image description here

В приведенном выше уравнении я хочу решить для f и передать в Re, D и epsilon. Вот мой код ниже:

import math
from scipy.optimize import fsolve

# Colebrook Turbulent Friction Factor Correlation
def colebrook(Re, D, eps):
    return fsolve(-(1 / math.sqrt(f)) - 2 * math.log10(((eps / D) / 3.7) + (2.51 / Re * math.sqrt(f))), f)

Буду ли я использовать fsolve () или решить ()? Я прочитал о fsolve () на главном сайте Python, однако я не понимаю некоторые входные данные, которые он хочет. Заранее спасибо!

Также я использую Spyder (Python 3.6)

1 Ответ

0 голосов
/ 02 июля 2018

На странице в Википедии "Формулы коэффициента Дарси" есть раздел по уравнению Коулбрука и показано, как f можно выразить через другие параметры с помощью Функция Ламберта W .

SciPy имеет реализацию функции W Ламберта , так что вы можете использовать ее для вычисления f без использования числового решателя:

import math
from scipy.special import lambertw


def colebrook(Re, D, eps):
    """
    Solve the Colebrook equation for f, given Re, D and eps.

    See
        https://en.wikipedia.org/wiki/Darcy_friction_factor_formulae#Colebrook%E2%80%93White_equation
    for more information.
    """
    a = 2.51 / Re
    b = eps / (3.7*D)
    p = 1/math.sqrt(10)
    lnp = math.log(p)
    x = -lambertw(-lnp/a * math.pow(p, -b/a))/lnp - b/a
    if x.imag != 0:
        raise ValueError('x is complex')
    f = 1/x.real**2
    return f

Например,

In [84]: colebrook(125000, 0.315, 0.00015)
Out[84]: 0.019664137795383934

Для сравнения, калькулятор на https://www.engineeringtoolbox.com/colebrook-equation-d_1031.html дает 0,0197.

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