Python fsolve 与对象的回火

Python fsolve tempering with object

我在 Python 中写了一个脚本,它使用 fsolve 找到一个相当复杂的函数的零。它的工作方式如下。有一个class,简单的存放了函数的参数。 class 有一个评估方法,returns 一个基于存储参数的值和另一个方法(反转)找到函数采用提供的输出的参数。

反转方法在每次迭代时更新函数的参数,并一直这样做,直到评估方法返回的值与提供的值之间的不匹配为零。

我遇到的问题是,虽然反转方法返回的值是正确的,但作为对象一部分的参数在反转后始终为 0方法终止。奇怪的是,如果我使用 root 而不是 fsolve,这个问题就会消失。据我所知,fsolve 只是 root 的包装器,对求解器算法进行了一些设置,并强制执行了其他一些操作。

这是 fsolve 的已知问题还是我在这里做了一些愚蠢的事情?下面的脚本演示了我在正弦函数上遇到的问题。

from scipy.optimize import fsolve, root
from math import sin, pi

class invertSin(object):
    def __init__(self,x):
        self.x = x

    def evaluate(self):
        return sin(self.x)

    def arcsin_fsolve(self,y):

        def errorfunc(xnew):
            self.x = xnew
            return self.evaluate() - y

        soln = fsolve(errorfunc, 0.1)
        return soln

    def arcsin_root(self,y):

        def errorfunc(xnew):
            self.x = xnew
            return self.evaluate() - y

        soln = root(errorfunc, 0.1, method = 'anderson')
        return soln

myobject = invertSin(pi/2)
x0 = myobject.arcsin_fsolve(0.5) #find x s.t. sin(x) = 0.5 using fsolve
print(x0) #this prints pi/6
x0obj = myobject.x
print(x0obj) #this always prints 0 no matter which function I invert

myobject2 = invertSin(pi/2)
x1 = myobject2.arcsin_root(0.5) #find x s.t. sin(x) = 0.5 using root
print(x1) #this prints pi/6
x1obj = myobject2.x
print(x1obj) #this prints pi/6

如果您在 errorfunc 中添加 xnew 的打印语句,那么您将看到 fsolve 使用列表(一个元素)。这意味着以这种方式重新解释函数,而不是原始函数。不知何故,类型信息在退出求解器后丢失,因此该列表的 address/reference 被解释为浮点数据,从而给出错误的值。

在那里设置 self.x = xnew[0] 可以恢复所需的行为。