2015-05-05 3 views
-1

У меня возникают проблемы с моим кодом, который является алгоритмом Runge Kutta для численного решения для гармонического осциллятора. К сожалению, я получаю сообщение об ошибке, которое говорит, что я не могу умножить последовательность на non-int типа float. Учитывая, что этот код почти дословно из учебного текста, я не вижу, где ошибка. Может кто-нибудь, пожалуйста, помогите мне? Спасибо, ваш дружелюбный сосед Spiderman.Почему я получаю ошибку, которую я умножаю по типу «float» типа non-int?

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.

TypeError: не может умножать последовательность неисполнением междунар типа «поплавком»

+2

Какая линия это говорит ваша ошибка происходит? – Loocid

+4

'Harmonic' возвращает списки. Что вы ожидаете, когда вы будете умножать один из этих списков на float? – user2357112

+1

Опубликуйте свое фактическое исключение (с трассировкой) в вопросе, не просто смутно его описывайте. – abarnert

ответ

3

Я готов поспорить, проблема в том, что вас» re смешивая массивы 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