2017-11-27 13 views
-2

次のコードで、 "x01 = rk4(x01、t1 [-1]、h1、fallParabola)行を実行しようとすると、 "float型の非int型配列を掛けることはできません"というエラーが表示されます。私は、これがなぜであるのだろうと思っています。なぜなら、すべての単語を配列の中のすべての項にその数だけ掛け合わせるということです。エラー "'float型のnon-intでシーケンスを掛けることはできません"

** slope1、それはあなたがあなたのルンゲクッタ定義でnumpyの配列タプルによってhを乗算し、していない問題

def rk4(f,t,h,g): 
    k1 = h*g(t,f) 
    k2 = h*g(t+0.5*h, f+0.5*k1) 
    k3 = h*g(t+0.5*h, f+0.5*k2) 
    k4 = h*g(t+h, f+k3) 
    return f + k1/6. + k2/3. + k3/3. + k4/6. 

def fallParabola(t,f): 
    g = 10 
    px = f[0] 
    py = f[1] 
    vx = f[2] 
    vy = f[3] 
    slope = slope1 * (px-shift1) 
    theta = sp.arctan(np.abs(slope)) 
    acc = np.array([vx,vy,g*sp.sin(theta)*sp.cos(theta), 
     g*sp.sin(theta)*sp.sin(theta)]) 
    return acc,slope 

x01 = np.array([0.0,intercept1,0.0,0.0]) 
t01 = 0. 
px1 = [x01[0],] 
py1 = [x01[1],] 
vx1 = [x01[2],] 
vy1 = [x01[3],] 
t1 = [t01,] 
h1 = 0.1 
while py1[-1] > 0: 
    x01 = rk4(x01,t1[-1],h1,fallParabola) 
    px1.append(x01[0]) 
    py1.append(x01[1]) 
    vx1.append(x01[2]) 
    vy1.append(x01[3]) 
    t1.append(t1[-1]+h1) 
+2

実行可能なコードにコードを変更してください。提示されているとおり、これは行いません。さらに、おそらくエラーメッセージの情報の少なくとも50%を捨てているでしょう(完全なスタックトレース!)。 – sascha

+2

... [mcve]の定義を参照してください。誰かが問題を自分自身で見るために使うことができる最短のコードを構築するためのガイダンスがあります。これは、2行で再現可能でなければならないもののように見えます。その1つは 'import'、もう1つは乗算演算です。 –

+1

サイドノート:タプル(fallParabolaの復帰)に '' 'h * g(t、f)' ''を掛けているようです。しかし、それはちょうど推測です。 – sascha

答えて

2

ではありませんのでintercept1はすでに、他の場所で定義されています。

def rk4(f,t,h,g): 
    k1 = h*g(t,f) 
    k2 = h*g(t+0.5*h, f+0.5*k1) 
    k3 = h*g(t+0.5*h, f+0.5*k2) 
    k4 = h*g(t+h, f+k3) 
    return f + k1/6. + k2/3. + k3/3. + k4/6. 

ここgはタプルを返し、あなたの定義によるとfallParabola()である、あなたが渡している機能である:

def fallParabola(t,f): 
    g = 10 
    px = f[0] 
    py = f[1] 
    vx = f[2] 
    vy = f[3] 
    slope = slope1 * (px-shift1) 
    theta = sp.arctan(np.abs(slope)) 
    acc = np.array([vx,vy,g*sp.sin(theta)*sp.cos(theta), 
     g*sp.sin(theta)*sp.sin(theta)]) 
    return acc,slope 

あなたは、あなたがそれを掛けることができるようにnumpyの配列を返すために、この定義を変更する必要があります。

return np.array([acc, slope]) 

非整数に関する特定のエラーメッセージの理由は、単にあなた乗算からです整数によるタプルですが、タプル内部の値は乗算されません。最初に、タプルは不変なので、値を変更することはできませんが、一般的にはシーケンスでは、整数で乗算すると乗数でシーケンスが繰り返されます。例えば、 、脇としても

>>> tup*3.14 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't multiply sequence by non-int of type 'float' 

:あなたはフロートによってここに掛ける場合

>>> tup = (5, 4) 
>>> tup*3 
(5, 4, 5, 4, 5, 4) 

は、それは当然の理にかなっていない、とあなたが持っている同じエラーが出ますあなたのfallParabola()関数はIMOをうまく定義していません。現在、グローバル変数(slope1shift1など)を使用していますが、これらの値を関数に渡すのが最善です。一般的にグローバル変数はPythonでは悪いことではありませんが、関数がいくつかのパラメータを使用する場合は、それらのパラメータを送信してその関数が何を使用しているかを知ることがベストプラクティスです。そして、時間がたつにつれてslope1のような変数を更新する必要がある場合、これは簡単なインターフェースを提供します。

関連する問題