Python -- 无量纲化

Python -- nondimensionalize

我正在编写一个 python 模块以允许我进行基于单位的计算,并且我正在尝试实现对单位敏感的函数集成。我的想法基本上是为 scipy.integrate 编写一个包装器——采用给定的函数和参数,包括积分的限制,将它们全部无量纲化,传递给 scipy.integrate.quad 或类似的东西,得到答案, 然后在最后乘以正确的单位。

为了实现这一点,我正在尝试弄清楚如何对任意函数进行无量纲化。我已经实现了单位,所以如果你用相同的单位划分两个数量,它 return 是一个普通数字,所以我的第一个想法就是这样做:

def nonDimensionalize(func, *args):
    val = func(*args)
    dimensions = val / val.value
    return lambda args : (func(args) / dimensions)

这对函数的输出无量纲化很有用,但我在输入方面遇到了困难。我真正需要的是 return 一个接受普通数字的函数,将它们乘以正确的 SI 维度(我可以弄清楚该怎么做),获取输出,将其除以正确的 SI 维度,然后return作为普通数字的值。然后我可以将所述函数传递给 scipy.integrate(或 scipy.fslove,等等)。我尝试了以下方法:

def nonDimensionalize(func, *args):
    argDims = []
    for arg in args:
        aDim = arg / arg.value
        argDims.append(aDim)
    nDargs = []
    index = 0
    for arg in args:
        nDargs.append(arg / argDims[index])
        index += 1
    val = func(*args)
    dimensions = val / val.value
    return lambda args : (func(args) / dimensions)

但是没用;它与我上面的四行函数具有完全相同的效果。我不确定此时如何进行。帮忙?

What I really need is to return a function that takes in ordinary numbers, multiplies them by the correct SI dimensions (which I can figure out how to do), gets the output, divides it by the correct SI dimensions, and returns that value as an ordinary number.

我不确定我是否完全理解你dimensionalize/non-dimensionalize的价值观,所以只需根据需要修改相应的功能,但你可以这样做:

def dimensionalizeValue(nonDimValue, dimensions):
    return nonDimValue * dimensions

def nonDimensionalizeValue(dimValue):
    dimensions = dimValue / dimValue.value
    return dimValue / dimensions

def nonDimensionalizeFunction(function):
    def wrapper(*nonDimArgs):
        # Figure out the correct dimensions.
        dimensions = None
        # Transform/dimensionalize the arguments.
        dimArgs = [dimensionalizeValue(arg, dimensions) for arg in nonDimArgs]
        # Get output using dimensionalized arguments.
        dimVal = function(*dimArgs)
        # Non-dimensionalize the output.
        nonDimVal = nonDimensionalizeValue(dimVal)
        return nonDimVal
    return wrapper