2016-12-02 99 views
0

這兩節我的代碼給出了以下錯誤消息。ValueError:使用序列設置數組元素

def Simpsons(a, b, n, f, x): 
    h=(b-a)/n 
    s = 0. 
    step = a + h 
    for i in range(1, int(n/2)): 
     s += 4*f(x) 
     #step += 2*h 

    step = a + 2 * h 
    for i in range(2, int(n/2 - 1)): 
     s += 2*f(x) 
     #step += 2 * h 

    area = (h/3) * (f(a) + f(b) + s) 
    return area 

for i in range(0, len(list_n)): 
    for j in range(0, len(Functions)): 
     x = np.linspace(a, b, list_n[i]) 
     error_simp[j, i] = Exact_intergrals[j] - Simpsons(0, 1,   list_n[i], Functions[j], x) 
print(error_simp) 

給此消息:

error_simp[j, i] = Exact_intergrals[j] - Simpsons(0, 1, list_n[i], Functions[j], x) 
ValueError: setting an array element with a sequence. 

這是爲什麼?我所嘗試過的一切都沒有擺脫它。

+0

確保您發佈的Python代碼能夠準確地再現您的縮進。否則,你會在代碼中引入新的問題,人們試圖發現問題。 – khelwood

+0

方面的評論:如果n是偶數或奇數,你應該在Simpson(集成)中做出一個案例的定位。辛普森規則可以擴展到奇數個intervalls,通過單獨處理最後一個intervall(將拋物線擬合到最後3個點並僅在最後2個點之間進行積分) –

+0

什麼是'error_simp'?形狀,dtype? RHS產生了什麼? – hpaulj

回答

0

我想你正試圖加載數組到error_simp [j,i],它可能只能包含浮點數。

下面是一個簡單的例子示出這樣的錯誤:

import numpy 
b = numpy.zeros(5) 
b[0] = numpy.zeros(5) - 1 

產生相同的誤差。

看起來像Simpsons函數返回一個數組或Exact_intergrals[j]包含一個數組。

如果您需要保存數組中error_simp矩陣,儘量增加一個維度:

error_simp = np.zeros((rows, cols, additional_dimension_size)) 

(另一種選擇是明確設置在構造dtype=object選項,但它是慢得多,不推薦)。

有可能會幫助一些類似的問題:this onethis

0

你辛普森函數給出一個數組時,返回相同大小的數組:

In [335]: Simpsons(0,1,10, lambda x:x**2, np.linspace(0,1,3)) 
Out[335]: array([ 0.03333333, 0.2  , 0.7  ]) 

你沒有表現如何error_simp被初始化。使用error_simp[j, i]=...和錯誤暗示

np.zeros((n,m), float) 

或類似的東西。

如需進一步的幫助,您需要指定您期望在error_simp中放置的內容。如果所有元素的x都相同,則可以創建一個匹配的3d數組。如果x具有不同的長度,則它必須是dtype=object。但我喜歡勸阻初學者這種用法。這樣的數組只不過是一個榮耀(或貶低)的列表清單。對這樣一個數組可以做什麼有着不切實際的期望。

=========

尋找更仔細

for i in range(0, len(list_n)): 
    for j in range(0, len(Functions)): 
     x = np.linspace(a, b, list_n[i]) 

你可能要創建不同大小x。您不顯示list_n,但它可能類似於[10,12,14,...],測試此功能的不同n

相關問題