2014-02-16 118 views
0

我試圖計算以下求和,其中分別爲Q的功能之前計算求和在python使用遞歸函數

enter image description here

f_j,f_jq=sin(theta)where theta varies[0,90],和r_ij是bewteen每兩個元件我做的相應距離這個計算。

我最初使用sum()函數,但它並沒有精確地工作,因爲它返回一個浮點數,但是由於q正在改變,並且沒有求和它,所以我期待一個數組!我放棄了它。

我的第二種方法是計算這個求和的遞歸函數,但是我得到很多錯誤,不知道我的代碼有什麼問題,因爲我所有的語法都是正確的,我不知道爲什麼我會得到錯誤或錯誤一個接一個的價值!

theta=arange(radians(0.5), radians(40.010), radians(0.03)) 
    q=sin(theta) 

    f_q_1= 2*exp(-3*pow(q,2))+4*exp(-5*pow(q,2))+1.95 
    f_q_2=... 
    . 
    f_q_i(or j). 

    atom_positions= open('coordinates.txt','r') 

    lines = atom_positions.readlines() 
    for i in range(0, len(lines)): 
     line = lines[i] 
     values = line.split(" ") 
     for j in range(0,len(lines)): 
     if j<>i: 
      nextLine = lines[j] 
      nextLineValues = nextLine.split(" ") 

      r =sqrt((float(values[5])-float(nextLineValues[5]))**2 + (float(values[6]) 
      -float(nextLineValues[6]))**2+(float(values[7])-float(nextLineValues[7]))**2) 

      line_len = len(lines) 
      def I_tot(line_len,i,f_i,f_j,r): 
      I=0 
      if i<line_len: 
       I=I+(f_i*f_j*sin(q*r)/(q*r)) 
       return I + I_tot(line_len,i,f_i,f_j,r) 
      else: 
       return I 
else: 

    plot(2*theta,I_tot) 
    show() 
    atom_positions.close() 

錯誤:

RuntimeError: maximum recursion depth exceeded while calling a Python object 

+這個問題不是以前在這裏問,當我檢查了,無法找到解決我的問題遞歸求和問題重複。


我自己也嘗試了功能

def I_tot(): 
     I=0 
     for i in range(0,len(lines)): 
      I=I+(f_i*f_j*sin(q*r)/(q*r)) 

     return I 

但我不知道是否能給予我正確的總和與否,因爲我到底得的圖形是遠離我的期望,並表示這個總和不應該是正確的。

+4

這看起來像一個無限遞歸,沒有變化的變化。 – M4rtini

+1

我想你在這裏解決的辦法不正確,爲什麼要通過遞歸? – Netwave

+1

'sum'有什麼問題?爲該表達式返回一個浮點數對我來說似乎相當合理。畢竟,'罪'將會浮出水面。如果你不想使用浮動,你可以將它轉換爲int。 – M4rtini

回答

1

Python中的遞歸是有限的。無論如何,我會嘗試總結。

注意,在與NumPy的SUM函數,你有兩個參數:

def sum(a, axis=None, dtype=None, out=None, keepdims=False): 
    """ 
    Sum of array elements over a given axis. 

    Parameters 
    ---------- 
    a : array_like 
     Elements to sum. 
    axis : None or int or tuple of ints, optional 
     Axis or axes along which a sum is performed. 
     The default (`axis` = `None`) is perform a sum over all 
     the dimensions of the input array. `axis` may be negative, in 
     which case it counts from the last to the first axis. 
... 

軸參數告訴它的尺寸僅爲總和來概括。意思是,如果沿軸加上qj,則仍然可以在q軸上獲得矢量結果。

你應該有類似的東西。

import numpy as np 
qs = np.array([1,2,3]) #Generate sum qs. 
r = np.array([[11,21, 41,51]]) #the r_ij compnent. as a 1D vector 
           #(you can get it using reshape()) 

np.kron(qs,r.T).sum(axis=0) #a vector containing sum(q*r) for each q. 

在這裏,np.krons給你

array([[ 11, 22, 33], 
     [ 21, 42, 63], 
     [ 41, 82, 123], 
     [ 51, 102, 153]]) 

和求和給出

array([124, 248, 372]) 

每行一個元素。

你可以很容易推廣到包括f_i(q)(相同結構的二維數組),加sin

1

還不能確定你的最終結果會是。但這裏有一些起點。

使用此命令可以載入位置,計算距離並將其放入數組中。

import numpy as np 
from scipy.spatial import distance 
values = np.genfromtxt('coordinates.txt', dtype=float, usecols=[5,6,7]) 
r_ij = distance.squareform(distance.pdist(xyz)) 
nPositions = r_ij.shape()[0] 

如果你能做出的f_jf_i數組,你也許可以向量化的總和,利用陣列乘法和求和的numpy的版本。它允許你定義要求和的軸。