如何解决使用对象时无法解决的fsolve错误?

时间:2019-10-17 17:13:20

标签: python numpy scipy nonlinear-optimization

我为金融工具定价提供了一些复杂的课程。当我尝试查找执行定价的函数的根时,得到: “ RuntimeWarning:根据最近十次迭代的改进,该迭代没有取得良好的进展。”

到目前为止,我可以解决问题,而不是更新相同的对象,而是在每个函数调用中创建一个新对象,但这会使过程非常缓慢,并且速度对此过程很重要。

这会重现使用python 3.7和scipy 1.3的错误。

import numpy as np
from scipy.optimize import fsolve

class Obj:
    def __init__(self, values):
        self.values = values

    def process(self):
        self.proc_values = 3*self.values**2 - 27
        return self.proc_values

    def set_val(self, new_val):
        self.values = int(new_val)

ob_test = [Obj(10),Obj(10),Obj(10)]

def polyn_class(x, ob_test):
    sol = np.ones(len(ob_test))
    for i in range(len(ob_test)):
        ob_test[i].set_val(x[i])
        sol[i] = ob_test[i].process()
    return sol

print(fsolve(polyn_class, np.ones(3), args=(ob_test,)))

1 个答案:

答案 0 :(得分:0)

我添加了:

train_loader

并运行:

def __repr__(self):
    return '<Obj> ' + str(self.values)

def polyn_class(x, ob_test):
    sol = np.ones(len(ob_test))
    for i in range(len(ob_test)):
        #ob_test[i].set_val(x[i])   # first
        ob_test[i] = Obj(x[i])      # second
        sol[i] = ob_test[i].process()
    print(ob_test)
    return sol

带有注释版本:

1001:~/mypy$ python3 stack58437679.py 
[<Obj> 1, <Obj> 1, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 1]
[<Obj> 101, <Obj> 101, <Obj> 101]
[<Obj> 0, <Obj> 1, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 1]
[<Obj> 101, <Obj> 101, <Obj> 101]
[<Obj> 0, <Obj> 1, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 0]
[<Obj> 0, <Obj> 0, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 0]
[<Obj> 0, <Obj> 0, <Obj> 1]
[<Obj> 1, <Obj> 1, <Obj> 0]
[<Obj> 0, <Obj> 0, <Obj> 1]
/usr/local/lib/python3.6/dist-packages/scipy/optimize/minpack.py:162: RuntimeWarning: The iteration is not making good progress, as measured by the 
  improvement from the last ten iterations.
  warnings.warn(msg, RuntimeWarning)

使用1003:~/mypy$ python3 stack58437679.py [<Obj> 1.0, <Obj> 1.0, <Obj> 1.0] [<Obj> 1.0, <Obj> 1.0, <Obj> 1.0] [<Obj> 1.0, <Obj> 1.0, <Obj> 1.0] [<Obj> 1.0000000149011612, <Obj> 1.0, <Obj> 1.0] [<Obj> 1.0, <Obj> 1.0000000149011612, <Obj> 1.0] [<Obj> 1.0, <Obj> 1.0, <Obj> 1.0000000149011612] [<Obj> 5.000000000008725, <Obj> 5.000000000008725, <Obj> 5.000000000008725] [<Obj> 2.3333333333313933, <Obj> 2.333333333331395, <Obj> 2.333333333331394] [<Obj> 3.400000000001398, <Obj> 3.400000000001393, <Obj> 3.4000000000013957] [<Obj> 2.953488372092719, <Obj> 2.9534883720927243, <Obj> 2.9534883720927207] [<Obj> 2.997071742313299, <Obj> 2.9970717423132904, <Obj> 2.9970717423132958] [<Obj> 3.0000228882708972, <Obj> 3.000022888270916, <Obj> 3.000022888270905] [<Obj> 2.999999988824147, <Obj> 2.9999999888241096, <Obj> 2.999999988824131] [<Obj> 2.999999999999922, <Obj> 2.9999999999999964, <Obj> 2.999999999999954] [3. 3. 3.] 时,对象值始终是整数;创建新对象时,对象值可以为float。这使得迭代中的所有差异。

哪个是对的?

set_val