Python中有没有可以控制每次迭代的数值求解器?
我现在正在解决一个线性方程组的问题,目前我使用的是
numpy.linalg.solve
这个方法会给出线性方程组的解。
我想要一个控制,让我可以执行多次迭代。
考虑另一种选择
scipy.optimize.minimize
文档中提到,我们可以指定一个函数,这个函数会在每次迭代后被调用,这样我们就可以获取当前的参数。
我不太确定他们是否是说我们可以得到当前的结果向量。
举个简单的例子,我想在每次迭代后访问x的值,当我们在求解Ax=b的时候。
我想知道有没有人用过这个,能不能解释一下!
谢谢
1 个回答
2
在scipy.optimize.minimize
这个函数中,callback
这个参数是用来指定一个函数的。这个函数会在每次迭代时被调用,并且会传入当前的参数估计值,这个参数是用来最小化目标函数的。
不过,minimize
主要是用来处理标量函数的,也就是那种只返回一个值的函数,所以我觉得这和你的例子不太适用。你可以试试scipy.optimize.fsolve
,不过它不支持callback
这个参数。为了绕过这个限制,你可以把你的线性方程包装成一个可调用的函数对象(这个函数返回Ax-b
),然后就可以使用传给这个可调用对象的参数了。
class Ab:
def __init__(self, A, b):
self.A = A
self.b = b
def __call__(self, x):
print 'x =', x
return A.dot(x) - b
然后可以这样使用:
>>> A = np.array([[2, 3], [4, 9]], float)
>>> b = np.array([5, 5])
>>> f = Ab(A, b)
>>> optimize.fsolve(f, [0, 0])
x = [0 0]
x = [ 0. 0.]
x = [ 0. 0.]
x = [ 1.49011612e-08 0.00000000e+00]
x = [ 0.00000000e+00 1.49011612e-08]
x = [ 5. -1.66666667]
x = [ 5. -1.66666667]
array([ 5. , -1.66666667])
fsolve
报告说只用了5次迭代,所以看起来前两次调用可能并没有实际用于收敛。