-1

調和振動子を数値的に解く Runge Kutta アルゴリズムであるコードに問題があります。残念ながら、float 型の非 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: タイプ 'float' の非 int でシーケンスを乗算できません

4

1 に答える 1

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を返します:listarray

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])
于 2015-05-05T05:40:06.753 に答える