使用Python 3.4和numpy
嘿所有,花了大约一个小时看,并不确定这是否可能。我正在创建一个包含1000次迭代的动态模型。我可以编写从状态1到状态2,状态2到状态3等的转换函数
在我进行1000次迭代之后,我使用np.arange来查找我的一些变量的初始值,这些变量将在给定外生变量的情况下通过第1000次迭代达到收敛。
我想知道是否有办法快速创建所有1000次迭代,即编写一些看起来像这样的代码:
for y_0 in np.arange(0.0001, 2, 0.0001):
x_0 = 2
z_0 = 1
# something # (y_i+1 = x_i + y_i, 1000)
# something # (x_i+1 = z_i + y_i, 1000)
if abs(y_1000 - y_999) < 1:
print(y_0, y_1 ... y_1000)
break
else:
print('fail')
返回类似这样的内容:
y_1 = x_0 + y_0
x_1 = z_0 + y_0
...
y_1000 = x_999 + y_999
x_1000 = z_999 + y_999
这有意义吗?有没有可以帮助我的功能? 提前谢谢。
编辑:
所以,考虑一下,我想有两种方法可以实现我想要的,但我不确定是否有可能。
首先是通过以更新最后一个数字的方式粘贴我的初始转换函数来创建代码。所以我可以生成
y_i+1 = x_i + y_i
x_i+1 = z_i + y_i
一千次(希望以自动方式),导致
y_1 = x_0 + y_0
x_1 = z_0 + y_0
y_2 = x_1 + y_1
x_2 = z_1 + y_1
...
y_1000 = x_999 + y_999
x_1000 = z_999 + y_999
第二个是迭代转换函数的函数,当它找到满足abs(y_1000-y_999)&lt; y的y_0的值时,返回y的1000个值。 1。
我的实际功能要复杂得多,超过20行,所以我不想发布它们。
EDIT2:
所以这就是我到目前为止,感谢你的帮助。但是,这是我得到的输出:
达成了融合 [1.5 1.6473105 0. 0. 0. 0. 0.
等等很多零。这让我感到困惑,因为如果我只是做数学运算,我系统的第三步就是非零。系统似乎只运行了两个时间段,然后在剩余的时间段内恢复为零(不填充数组),然后在后面拍拍自己进行聚合。
再次,非常感谢你提出的任何建议。
编辑:想出来。在第99次收敛时,我需要先运行迭代才能进行代码中断答案 0 :(得分:1)
只需使用Numpy数组索引来存储动态模型的数据,
import numpy as np
dtype = 'float128'
abs_tolerance = 1.0
y = np.arange(0.001, 2, 0.02).astype(dtype)
N = y.shape[0]
x = np.zeros(N, dtype=dtype)
z = np.zeros(N, dtype=dtype)
x[0] = 2
z[0] = 1 # initialize the first step
for idx in range(1, N):
y[idx] = x[idx-1] + y[idx-1]
x[idx] = z[idx-1] + y[idx-1]
if np.abs(y[idx] - y[idx-1]) < abs_tolerance:
print('Convergence reached')
break
else:
print('Convergence failed, exiting after {} steps'.format(idx))
x = np.asarray(x)
z = np.asarray(z)
print(x)
print(y)
print(z)
注意,就像现在一样,x
,y
和z
之间的关系并没有太大的意义,而且会很快溢出(因此使用128位花车)。
此外,如果您可以在state-space representation中制定问题,则应使用专为此类问题设计的scipy.signal.lti
。