2011-12-13 19 views
0

我是python的新手,一直無法弄清楚如何解決這個問題。我正在嘗試爲數組中的每個值進行迭代,並返回最終值數組。 e是用戶輸入的單個值,而M是長度可變的數組。我試圖循環針對E的每個值迭代,直到它緊密地解決了開普勒方程式,M =的Ee *罪(E),然後返回各自E的成品數組給M.數組的Python ValueError abs

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

你想解決什麼問題?你期望這段代碼能做什麼? (考慮你問一個具體的問題要比徵求建議好得多) –

+2

由於'E = M',你是否嘗試過使用'E [i]'? (E [i] -e * sin(E [i]) - M [i])> 10 **( - 4):...' –

+0

e和M的類型和形狀是什麼? – Benjamin

回答

0

Abs返回它給出的類型,所以你必須要麼選擇E[i],在大腸桿菌
使用的操作如總和,或者僅僅具有對於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) 

如果您正在尋找其他的東西環路有條件加小莫重新信息。現在不可能推斷出你想要的東西。

1

不知道你實際上是試圖做的,但問題是這樣的:

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

所有的ABS(這些操作的)在numpy的陣列的elementwise工作,所以你做一些事情以數組結尾,取該數組中每個元素的絕對值,然後與10 **( - 4)進行比較,最後得到一組布爾值。它抱怨說它不能評估爲「True」或「False」,因爲它是一個可能包含True和False值的數組。

+0

e是用戶輸入的單個值,而M是長度可變的數組。我試圖循環迭代每個E的值,直到它緊密地解開開普勒方程,M = Ee * sin(E)(@DSM在指出我的意圖時是正確的),然後返回給定M的E的完成數組。 我希望這會有所幫助 - 原諒任何錯誤的語言,我正在教自己python的過程! – tes183

+0

好吧,現在總決賽結束了,我仔細看了看OP,我想我已經接近了你想要做的事情;這是用牛頓的方法來求解E-e * sin(E)= M,對嗎?是否你有多個M,你想返回一個數組E,這樣每個E對應一個M,還是還有別的事情發生,我沒有得到? –

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是什麼,以及具體的功能是什麼。