10

假设我想生成一个函数,稍后将其合并到一组方程中,用 scipy nsolve 函数求解。我想创建一个这样的函数:

xi + xi+1 + xi+3 = 1

其中变量的数量将取决于组件的数量。例如,如果我有 2 个组件:

 f = lambda x: x[0] + x[1] - 1

3:

 f = lambda x: x[0] + x[1] + x[2] - 1

我将组件指定为要调用的函数的参数中的数组:

 def my_func(components):
        for component in components:
        .....
        .....
        return f

我不能只是找到这样做的方法。我必须能够做到这一点,因为这个函数和其他函数需要与 nsolve 一起解决:

 x0 = scipy.optimize.fsolve(f, [0, 0, 0, 0 ....])

任何帮助,将不胜感激

谢谢!


由于我不确定哪种方法是最好的方法,我将充分解释我正在尝试做的事情:

-我正在尝试生成这两个函数以供稍后解决:

在此处输入图像描述

在此处输入图像描述

所以我想创建一个函数 teste([list of components]),它可以返回这两个方程(Psat(T) 是一个我可以根据组件调用的函数,P 是一个常数(值 = 760))。

例子:

  teste(['Benzene','Toluene'])

会返回:

x苯 + x甲苯 = 1

xBenzene Psat ('苯') + xToluene Psat ('甲苯') = 760

在调用的情况下:

   teste(['Benzene','Toluene','Cumene'])

它会返回:

x苯 + x甲苯 + x异丙苯 = 1

xBenzene Psat ('苯') + xToluene Psat ('甲苯') + xCumene*Psat('Cumene') = 760

所有这些 x 值都不是我可以计算并变成我可以求和的列表的东西。它们是根据我在系统中拥有的组件数量创建的变量...

希望这有助于找到最好的方法

4

5 回答 5

6

直接翻译是:

f = lambda *x: sum(x) - 1

但不确定这是否真的是你想要的。

于 2013-07-12T01:21:48.353 回答
5

您可以使用字符串动态构建 lambda,然后使用 eval 函数对其进行解析,如下所示:

a = [1, 2, 3]

s = "lambda x: "
s += " + ".join(["x[" + str(i) + "]" for i in xrange(0, 3)]) # Specify any range
s += " - 1"

print s

f = eval(s)
print f(a)
于 2013-07-12T01:38:59.117 回答
2

我会利用 numpy 并执行以下操作:

def teste(molecules):
    P = np.array([Psat(molecule) for molecule in molecules])
    f1 = lambda x: np.sum(x) - 1
    f2 = lambda x: np.dot(x, P) - 760
    return f1, f2

实际上,您要解决的是一个可能欠定的线性方程组,其形式为 Ax = b。您可以按如下方式构造 A 和 b:

A = np.vstack((np.ones((len(molecules),)),
               [Psat(molecule) for molecule in molecules]))
b = np.array([1, 760])

然后,您可以创建一个返回 2 元素向量的 lambda 函数:

return lambda x: np.dot(A, x) - b

但我真的不认为这是求解方程的最佳方法:要么你有一个可以得到的单一解np.linalg.solve(A, b),要么你有一个具有无限多个解的线性系统,在这种情况下,你想要找到的是一个基础解空间中的一个点,而不是该空间中的单个点,这是您将从以函数作为输入的数值求解器中获得的结果。

于 2013-07-12T03:27:35.827 回答
0

如果您真的想通过迭代构建函数来定义它,您可以。我想不出任何情况下这将是最好的答案,甚至是合理的答案,但这是你所要求的,所以:

def my_func(components):
    f = lambda x: -1
    for component in components:
        def wrap(f):
            return lambda x: component * x[0] + f(x[1:])
        f = wrap(f)
    return f

现在:

>>> f = my_func([1, 2, 3])
>>> f([4,5,6])
44

当然,调试起来不会很有趣。例如,查看调用的回溯f([4,5])

于 2013-07-12T01:32:00.283 回答
-3
def make_constraint_function(components):
    def constraint(vector):
        return sum(vector[component] for component in components) - 1
    return constraint

您可以使用 lambda 来完成,但命名函数可能更具可读性。deffed 函数可以做任何 lambda 可以做的事情,甚至更多。确保为函数提供良好的文档字符串,并使用适合您程序的变量和函数名称。

于 2013-07-12T01:52:54.507 回答