私はSchorschの答えをWhile loop inside for loop in Matlabに適応させています。問題はPython 3.5で使用します。whileループとforループのPythonインデックス問題
t
配列の値を繰り返し処理したいと思います。それぞれの値について、私の計算結果がz
ならば収束します(または最大反復回数の後に収束しません)。これを配列にコピーします。次に、結果をプロットします。
import numpy as np
import matplotlib.pyplot as plt
maxiter = 100 # max no. iterations in convergence loop
t = 0.05*np.arange(10)
z = 0.1 # initial guess
x = np.zeros(len(t)) # array for results
cvec = np.zeros(len(t)) # does loop converge?
for ii in t:
print(ii)
convergence = 0
while convergence == 0:
z_old = z
z = ii*np.random.rand() # perform calculations
# check convergence
if abs(z-z_old) < 0.01: # convergence
# store result
convergence = 1
x[ii] = z
cvec[ii] = convergence
elif abs(z-z_old) >= 0.01 and ii < maxiter: # no convergence but loop again
convergence = 0
else: # no convergence, move on to next value in t array
convergence = 0
x[ii] = 1e3
cvec[ii] = convergence
break
# plot result
plt.figure()
plt.plot(t[cvec==1],x[cvec==1],'x')
plt.xlabel('t')
plt.ylabel('x')
plt.show()
私はエラーを取得する:VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future lines = """
は、この平均は私がどのようにIインデックスwhile
かfor
ループを変更する必要がない、そしてもしそうなら、私はこれをどのようにしたらよいでしょうか?
を収束していない間、それはおそらく、 '[II]は、' xを使って、配列のインデックスを作成していることを意味し、最大倍の値を反復するwhileループを使用して、 「ii」は整数ではない。あなたの 't'配列(forループを反復するために使う配列)に何か問題があります。もし整数配列であると思われていてfloatであれば、 'for ii in np.asarray(t、np.int32)'のようにすることができます。 –
あなたの質問のタイトルは誤解を招くようなものです。 – Psytho
なぜ浮動小数点値でインデックスを作成していますか?ループの前に空のリストに 'x'と' cvec'を設定して、必要に応じて値を追加する、つまり 'x.append(z)'を追加することをお勧めします。あるいは、あなたは 'x'と' cvec'にインデックスを付けるためにカウンタを使い、要素を設定するたびにインクリメントすることができます。時間を保存する必要がある場合は、 'timestamps = []'のようなものを設定し、それにも追加してください。 – pbreach