2016-02-18 137 views
1

我試圖定義阿基米德螺線:當我試圖定義切向量的傾斜角度(含)的軌道(即:棕褐色(含))阿基米德螺旋

我越來越一個錯誤

'numpy.ufunc' object does not support item assignment" and "can't assign to function call"

當我想計算cos(含)和sin(含)時出現同樣的錯誤。 任何建議和幫助。

我的代碼是:

T=100 

N=10000 

dt=float(T)/N 


D= 2 

DII=10 

    a= 2.  
    v= 0.23 

    omega = 0.2 

    r0 = v/omega 

    t=np.linspace(0,T,N+1) 

    r= v*t 

    theta = a + r/r0 

    theta = omega*t 

    x=r* np.cos(omega*t) 

    y=r* np.sin(omega*t) 

    dxdr = np.cos(theta) - (r/r0)*np.sin(theta) 

    dydr = np.sin(theta) + (r/r0)*np.cos(theta) 

    dydx = (r0*np.sin(theta) + r*np.cos(theta))/r0*np.cos(theta) - r*np.sin(theta) 

    np.tan[incl]= dydx 

    incl = np.arctan((dydx)) 

    ### Calculate cos(incl) ,sin(incl) : 

    np.sin[np.incl] = np.tan(np.incl)/np.sqrt(1+ np.tan(np.incl)*2) 

    np.cos[incl] = 1/np.sqrt(1+ np.tan(incl)*2) 

p1, = plt.plot(xx, yy) 

i= 0 # this is the first value of the array

Bx= np.array([np.cos(i), -np.sin(i)]) 

By= np.array([np.sin(i), np.cos(i)])     

n= 1000 

seed(2) 


finalpositions=[] 

for number in range(0, 10): 

    x=[] 

    y=[] 

    x.append(0) 

    y.append(0) 


    for i in range(n): 

     s = np.random.normal(0, 1, 2) 

     deltaX= Bx[0]*np.sqrt(2*DII*dt)*s[0] + Bx[1]*np.sqrt(2*D*dt)*s[1] 

     deltaY= By[0]*np.sqrt(2*DII*dt)*s[0] + By[1]*np.sqrt(2*D*dt)*s[1] 

     x.append(x[-1] + deltaX) 

     y.append(y[-1] + deltaY) 

    finalpositions.append([x[-1], y[-1]]) 


p2,= plt.plot(finalpositions[:,0],finalpositions[:,1],'*') 

plt.show() 
+0

我不認爲'np.tan [含]'或'np.sin [np.incl]'做什麼你認爲它 –

+0

我曾嘗試寫它像np.sin(np.incl),但我得到一個錯誤:不能分配給函數調用 –

+0

這是因爲'np.sin(np.incl)'是一個函數調用,*返回一個值。你不能分配任何東西 –

回答

0

錯誤信息是正確的,你想分配給功能!我認爲你試圖計算一個值,即代表值的sin,cos或tan,但這並不意味着你需要分配給np.sin等等。你想要的是計算值代表三角函數,然後使用逆三角函數拿到角度:

## np.tan[incl]= dydx ## np.tan is a function, so you cannot index it like an array, and you should not assign to it. 

incl = np.arctan((dydx)) ## this is all you need to get "incl" 

### Calculate cos(incl) ,sin(incl) : 
## NOTE: you already have the angle you need!! No need for a complicated formulate to compute the sin or cos! 
sin_incl = np.sin(incl) 
cos_incl = np.cos(incl) 

編輯:一個額外的評論... np是包含大量的數值方法的模塊。當你計算incl,它是而不是部分np!所以沒有必要像np.incl那樣引用它。只需使用incl即可。

EDIT2:我發現的另一個問題是這一行:

dydx = (r0*np.sin(theta) + r*np.cos(theta))/r0*np.cos(theta) - r*np.sin(theta) 

要計算dydx,你只是將dydr通過dxdr,但是這不代碼做了什麼!您需要周圍的分母括號這樣的:

dydx = (r0*np.sin(theta) + r*np.cos(theta))/(r0*np.cos(theta) - r*np.sin(theta)) 
+0

好的,謝謝你的解釋我知道這一點,但重點是我想在其他函數中使用這個角度(包括)包含sin(incl)和cos(incl),當我嘗試使用incl值給我一個錯誤:太多的值來解壓 –

+0

這很好......只需使用上面計算的'sin_incl'和'cos_incl'值。一旦你知道'incl',那個值的所有trig函數都被確定了,你不必爲它們解決。 – gariepy

+0

哦,我看到,包括一系列的角度......堅持... – gariepy