在python中是否有任何数值解算器控制每次迭代?

时间:2013-02-21 17:18:36

标签: python linear-algebra

我正在解决目前正在使用的线性方程组

   numpy.linalg.solve

它返回线性系统的解。    我希望有一个控件,以便我可以执行迭代

考虑另一种选择

    scipy.optimize.minimize

文档描述了我们可以指定一个被调用的函数    每次迭代后我们都可以获得当前参数。    我不确定他们是否意味着我们可以得到当前的合成矢量。    例如,我想在每次迭代后访问x,而我们正在解决Ax = b

我想知道是否有人使用它并且可以解释!

由于

1 个答案:

答案 0 :(得分:2)

callback的{​​{1}}关键字参数指定了一个函数,该函数将使用参数的当前估计来调用,该参数在每次迭代时最小化函数。

但是scipy.optimize.minimize用于标量函数(一个返回单个值),所以我看不出它如何适用于您的示例。您可能想尝试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]) 报告只进行了5次迭代,因此看起来前两次调用可能实际上并未用于收敛。