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
我正在编写一个 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