Python用对象来解决tempering问题

时间:2018-04-18 09:42:53

标签: python scipy numerical-methods

我在Python中编写了一个脚本,它使用fsolve找到了一个相当复杂的函数的零。它的工作方式如下。有一个类只存储函数的参数。该类有一个evaluate方法,它根据存储的参数返回一个值,另一个方法(反转)找到函数获取所提供输出的参数。

反演方法在每次迭代时更新函数的参数,并且一直这样做,直到evaluate方法返回的值与提供的值之间的不匹配为零。<​​/ p>

我遇到的问题是,当反转方法返回的值正确时,参数(即对象的一部分)在反转方法终止后始终为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

1 个答案:

答案 0 :(得分:2)

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

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