2015-05-05 67 views
-1

我遇到了我的代碼問題,這是Runge Kutta算法的數值求解諧振子的問題。不幸的是,我收到一個錯誤,說我不能通過類型爲float的非整型來乘序列。考慮到這些代碼幾乎完全來自教育文本,我看不出錯誤在哪裏。有人可以幫我嗎?感謝您友好的鄰居蜘蛛俠。爲什麼我收到我乘以非整型'float'的錯誤?

import numpy as np 
import matplotlib.pyplot as plt 


#Variable Definitions 

N = 500 
x0 = 1.0 
v0 = 0.0 
dur = 10.0 

dt = dur/float(N-1) 

#creating the array 

y = np.zeros([N,2]) 

y[0,0] = x0 
y[0,1] = v0 

#runge kutta algorithm 

def rk4(y, time, dt, deriv) 
    k1 = dt * deriv(y,time) 
    k2 = dt * deriv(y + 0.5*k1,time + 0.5*dt) 
    k3 = dt * deriv(y + 0.5*k2, time + 0.5*dt) 
    k4 = dt * deriv(y + k3, time + dt) 
    y_next = y + (k1 + 2*(k2+k3)+k4)/6 
    return y_next 


#Harmonic oscillator 

def Harmonic(x,time): 
    y0 = x[1] 
    y1 = (-1)*x[0] 
    return ([y0,y1]) 

#forming data points 
for i in range(N-1): 
    y[i+1] = rk4(y[i],0, dt, Harmonic) 

time = np.linspace(0, dur, N) 

#plotting 

plt.plot(time,y[:,1]) 
plt.show() 

該錯誤是33行

類型錯誤:無法按類型「浮動」的非INT繁衍序列

+2

哪條線沒有說發生在你的錯誤? – Loocid

+4

'諧波'返回列表。當你將這些列表中的一個乘以浮點數時,你期望發生什麼? – user2357112

+1

在問題中發佈你的實際異常(帶回溯),不要模糊地描述它。 – abarnert

回答

3

我願意打賭的問題是,你」重新混合NumPy數組和正常的Python列表。


你在你的代碼中使用NumPy數組。這些人知道如何做各種很酷的事情,比如元素操作。例如:

>>> a = np.array([1, 2, 3, 4]) 
>>> a * 1.5 
array([ 1.5, 3. , 4.5, 6. ]) 

但是Python列表不知道該怎麼做。 (另一方面,他們知道如何去做NumPy數組不能做的其他事情,比如在最後添加新值,或者在切片時自動創建副本,而不是僅當您明確告訴他們時。)將Python列表通過數字只是意味着多次重複列表。這是有道理的一個整數,而不是一個浮子這不是你想在這裏即使是一個整數什麼:

>>> a = [1, 2, 3, 4] 
>>> a * 2 
[1, 2, 3, 4, 1, 2, 3, 4] 
>>> a * 1.5 
TypeError: can't multiply sequence by non-int of type 'float' 

Harmonic函數返回一個list,不是array

def Harmonic(x,time): 
    y0 = x[1] 
    y1 = (-1)*x[0] 
    return ([y0,y1]) 

但您試圖將該函數的結果乘以數字。這對數組有意義,但不適用於列表。

所以,你可能只是想改變這種狀況:

def Harmonic(x,time): 
    y0 = x[1] 
    y1 = (-1)*x[0] 
    return np.array([y0,y1]) 
+0

這就是問題所在。謝謝!!!! – user3461947

相關問題