Python中有没有可以控制每次迭代的数值求解器?

1 投票
1 回答
1193 浏览
提问于 2025-04-17 16:39

我现在正在解决一个线性方程组的问题,目前我使用的是

   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次迭代,所以看起来前两次调用可能并没有实际用于收敛。

撰写回答