我正在尝试使用Python 3.x和PyCharm创建渐变下降。 代码不优雅,但它确实有效。但在运行了几次后,“for”循环停止工作。 我认为它可能是一个内存问题或类似的事情,但如果是,我不知道如何解决它。
thrust_forward()
thrust = neu['d']
thrust_new = 0
def back_and_forward():
randomize_steps_effect()
thrust_backward()
thrust_forward()
global thrust_new
thrust_new = neu['d']
iterations = 5000000
def start_process():
print('')
print('Progress:')
for i in range (0,iterations):
global thrust_new
global thrust
while thrust_new < thrust:
back_and_forward()
thrust = thrust_new
if i%(iterations/100) == 0:
print('|', sep = '', end='', flush=True)
print('')
print('Final: P = ' +str(thrust/9.8) + str(prm))
start_process()
主要参数存储在词典中:
#Parametres
prm = {
'm':3, #kg/s
...
'ph':-50000 #Pa
}
#Parameters steps
stp = {
'a':0.01,
...
'ph':50 #Pa
}
#Additional vars
neu = {
'a':0,
...
'd':0
}
步骤有随机化函数,因此“推力”最终会增加,而循环中断:
#Randomize steps
def randomize_steps_effect():
for key, values in stp.items():
r = random.randint(0,3)
if r != 0 and (key != 'm' or key != 'w'):
stp[key] *= -1
前进和后退功能:
def thrust_forward():
neu['a'] = forward_multiply(prm['m'],prm['w'])
neu['c'] = forward_add(prm['pa'],prm['ph'])
neu['b'] = forward_multiply(neu['c'],prm['Fa'])
neu['d'] = forward_add(neu['a'],neu['b'])
def thrust_backward():
global max_w
neu['a'] += stp['a'] * backward_add()
neu['b'] += stp['b'] * backward_add()
prm['Fa'] += stp['Fa'] * backward_multiply_F_wrt_b(prm['Fa'],neu['c'])
neu['c'] += stp['c'] * backward_multiply_F_wrt_b(neu['c'],prm['Fa'])
prm['pa'] += stp['pa'] * backward_add()
prm['ph'] += stp['ph'] * backward_add()
prm['m'] += stp['m'] * backward_multiply_F_wrt_b(prm['m'],prm['w'])
if prm['w'] >= max_w:
stp['w'] = 0
prm['w'] += stp['w'] * backward_multiply_F_wrt_b(prm['w'],prm['m'])
答案 0 :(得分:0)
你是什么意思&#34; for循环停止工作&#34; ?它在给定的迭代中阻塞,或者你得到一个运行时异常,或者你是否停止看到渐变的改进?
如果它在迭代时阻塞肯定是因为你的内部循环永远不会结束
while P_new < P:
因为你的P_new不断减少
但是,我看到的问题是当你执行P = P_new
然后问P_new < P
时,最后一个语句总是为假。
如果您可以显示前向和后向功能中包含的代码,我们可以帮助您
正如杰里米所说,你也应该避免使用全局变量