Python 值错误 数组的绝对值
我刚接触Python,遇到了一些问题,不知道怎么解决。我想对数组中的每个值进行循环计算,最后返回一个包含最终值的数组。这里的e是用户输入的单个值,而M是一个长度不固定的数组。我想对每个E的值进行循环,直到它接近解决开普勒方程M=E-e*sin(E),然后返回每个M对应的E的结果数组。
def eccano(e, M):
E=M
for i in range(0,len(M)):
while abs(E-e*sin(E)-M[i]) > 10**(-4):
E=E-((E-e*sin(E)-M[i])/(1-e*cos(E)))
return E
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "ME.py", line 7, in eccano
while abs(E-e*sin(E)-M[i]) > 10**(-4):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
有什么建议吗?谢谢!
3 个回答
0
Abs
这个函数会返回你给它的类型,所以你需要选择 E[i]
,或者使用像求和这样的操作,或者直接用 for 循环遍历 E
。
举个例子:
abs(np.array([-1, 2, -4])) = array([1, 2, 4])
假设你想要 abs(E-e*sin(E)-M[i])
的2范数大于 10^-4
,你可以这样写:
np.linalg.norm(abs(E-e*sin(E)-M[i]),2) > 10**(-4)
如果你在循环条件中想要查找其他东西,记得多提供一些信息。目前很难理解你想要什么。
0
这看起来像是牛顿-拉夫森方法的实现。具体的帮助我不能给,因为我不知道你用的是什么函数,但我可以告诉你我会怎么在维基百科的页面上写这个例子:
import numpy as np
def newtons(start_value, threshold):
x = start_value
stop = False
while stop == False:
x_previous = x
# x -= function / first derivative of function
x -= (np.cos(x) - x**3 )/ (-np.sin(x) - 3 * x**2)
if np.abs(x - x_previous) < threshold:
stop = True
return x
print newtons(0.5, 0.0001)
如果这正是你想做的,告诉我们 e 和 M 是什么,以及具体的函数是什么。
1
我不太确定你到底想做什么,但问题在这里:
while abs(E-e*sin(E)-M[i]) > 10**(-4):
在numpy数组中,abs()函数的所有操作都是逐个元素进行的,所以你做了一些操作,最后得到一个数组,然后对这个数组里的每个元素取绝对值,再和10的负4次方进行比较,最后得到一个布尔值数组(也就是包含True和False的数组)。它在抱怨说无法将这个数组评估为“真”或“假”,因为这个数组可能同时包含True和False的值。