我为金融工具定价提供了一些复杂的课程。当我尝试查找执行定价的函数的根时,得到: “ 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,)))
答案 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