我试图解决非线性方程的耦合系统:
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)建议解决方法吗?
答案 0 :(得分:2)
for i in A and B:
行没有多大意义。 A and B
是数组A
和B
上的二进制逻辑运算,它既不是有效的,也不是您需要的操作。
您想要做的事情可能是for a, b in zip(A, B):
。这会在每次迭代中产生标量a
和b
。所以a = A [i]和b = B [i]。 zip
会创建A
和B
的值对,这些值在for循环中可用作a
和b
。
或者,您可以使用索引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]
这应该产生两个列表。