Python ValueError数组的abs

时间:2011-12-13 03:48:14

标签: python numpy

我是python的新手,并且无法弄清楚如何解决这个问题。我正在尝试对数组中的每个值进行迭代,并返回最终值的数组。 e是用户输入的单个值,而M是不同长度的数组。我试图为E的每个值循环迭代,直到它紧密解决Kepler方程,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 :(得分:1)

不确定你真正想做什么,但问题是:

while abs(E-e*sin(E)-M[i]) > 10**(-4):

abs()中的所有这些操作在numpy数组中按元素工作,所以你做了一些以数组结尾的东西,取该数组中每个元素的绝对值,然后比较10 **( - 4)最后得到一系列布尔值。它抱怨它无法将其评估为“True”或“False”,因为它是一个可能包含True和False值的数组。

答案 1 :(得分:0)

Abs返回它给出的类型,因此您必须选择E[i],使用诸如sum之类的操作,或者只是为了E中的i。 例如:

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)

如果您在循环条件中寻找其他内容,请添加更多信息。现在,不可能推断出你想要的东西。

答案 2 :(得分:0)

这看起来像Newton–Raphson method的实现。我不能给出具体的帮助,因为我不知道这个函数是什么,但是这就是我在维基百科页面中编写示例的方法:

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是什么,以及具体功能是什么。