我是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()
有什么建议吗?谢谢!
答案 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是什么,以及具体功能是什么。