Python 值错误 数组的绝对值

0 投票
3 回答
1580 浏览
提问于 2025-04-17 08:16

我刚接触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的值。

撰写回答