使用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)
我的实际功能要复杂得多,超过20行,所以我不想发布它们。
编辑2:
因此,这是我到目前为止所拥有的,感谢您的帮助。但是,这是我得到的输出:
达到收敛
[1.5 1.6473105 0. 0. 0. 0. 0。
等等很多零。这使我感到困惑,因为如果我只是做数学运算,那么系统中的第三步非零。看来系统仅运行了两个周期,然后在剩余的周期中恢复为零(不填充阵列),然后将自身拍在背面进行收敛。
再次感谢您提供的任何建议。
编辑:想通了。在第99次收敛时,我需要运行迭代才能使代码中断
最佳答案
只需使用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
。