Python fsolve 使用对象进行调和

标签 python scipy numerical-methods

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

反转方法在每次迭代时更新函数的参数,并持续这样做,直到评估方法返回的值与提供的值之间的不匹配为零。<​​/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

最佳答案

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

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

关于Python fsolve 使用对象进行调和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49896377/

相关文章:

python - 使用jupyter在python3中用字符串替换标准输入

来自 IDLE 的 Python 标准输出重定向

python - 如何计算 scipy 中分布的 AIC?

python - 如何确定滤波器功能是否适用于半幅度或半功率截止

matlab - 解决超定约束系统

logarithm - 使用对数来避免数值下溢的算术问题

python - 带有数值积分的 Sympy 级数展开

Python elif 无法按预期进行字符串查找

python - scipy.stat.norm.pdf 加起来不等于一

c++ - 数值食谱/多维根搜索(使用newt): How to minimize the maximum error