通过迭代输入数组获得耦合非线性方程的值数组

时间:2015-02-26 17:29:32

标签: python arrays iteration

我试图解决非线性方程的耦合系统:

x(x + 2y)/(1-x-y)= A

y(x + 2y)/ x = B

其中A和B是两个大小相同的数组中的元素。

我在一个数组中有A的10,000个值,在另一个数组中有B的10,000个值。

我需要使用A [i]和B [i]来确定x [i]和y [i]。但是,当我执行以下操作时:

def Eqs(z):
    x, y = z
    for i in A and B:
        return (x*(x + 2*y) - A[i]*(1 - x - y), y*(x + 2*y) - B[i]*x)

x, y = scopt.fsolve(Eqs, (1,1))

我收到以下错误消息:

ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

对A和B使用适当大小的随机数组,有人可以(1)解释为什么我会收到特定的错误信息,以及(2)建议解决方法吗?

1 个答案:

答案 0 :(得分:2)

for i in A and B:行没有多大意义。 A and B是数组AB上的二进制逻辑运算,它既不是有效的,也不是您需要的操作。

您想要做的事情可能是for a, b in zip(A, B):。这会在每次迭代中产生标量ab。所以a = A [i]和b = B [i]。 zip会创建AB的值对,这些值在for循环中可用作ab

或者,您可以使用索引i进行迭代:for i in range(len(A)):


代码还有另一个问题:return将停止循环并将方法保留在第一次迭代中。因此,您要么为返回值创建两个列表,请在整个for循环中填充它,并在Eqs的末尾返回它。或者你使用列表推导来缩短它:

return [x*(x + 2*y) - a*(1 - x - y) for a in A], [y*(x + 2*y) - b*x for b in B]

这应该产生两个列表。