0

伙计们。我正在尝试从具有 3 个变量的函数生成优化值数组。其中两个变量是已知分布。任务是在已知现金流量分布的情况下找到 IRR(内部收益率)的分布。我首先将输入分布转换为数组

s_q = salv_samp.tolist()
a_q = A_samp.tolist()
ax = np.array(a_q)
sx = np.array(s_q)

然后我使用 scipy.optimize 如下

for q,j in zip(ax,sx):
squared_error = lambda i : np.abs(NPV(q,j,i))

result_b= opt.minimize(fun=squared_error, x0=0.05, method='L-BFGS-B', bounds=((0, 1),))
print(result_b)

上面的代码没有给出错误,但我希望我的结果是一个与输入数组相同维度的数组,而不是只得到一个标量值。请参阅下面的代码生成的输出:

fun: array([1.52194751e-07])
 hess_inv: <1x1 LbfgsInvHessProduct with dtype=float64>
      jac: array([192.26050246])
  message: 'ABNORMAL_TERMINATION_IN_LNSRCH'
     nfev: 128
      nit: 6
     njev: 64
   status: 2
  success: False
        x: array([0.24347229])

当我按原样使用分布时,我得到一个错误。

for q,j in zip(A_samp,salv_samp):
squared_error = lambda i : np.abs(NPV(A_samp,salv_samp,i))

result_b= opt.minimize(fun=squared_error, x0=0.05, method='L-BFGS-B', bounds=((0, 1),))
print(result_b)

错误消息:第 0 维必须固定为 1 但得到 15000(实际索引 = 0)

    --------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-109-8b5da553a644> in <module>
      2     squared_error = lambda i : np.abs(NPV(A_samp,salv_samp,i))
      3 
----> 4 result_b= opt.minimize(fun=squared_error, x0=0.05, method='L-BFGS-B', bounds=((0, 1),))
      5 print(result_b)

~\anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    617                                   **options)
    618     elif meth == 'l-bfgs-b':
--> 619         return _minimize_lbfgsb(fun, x0, args, jac, bounds,
    620                                 callback=callback, **options)
    621     elif meth == 'tnc':

~\anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in _minimize_lbfgsb(fun, x0, args, jac, bounds, disp, maxcor, ftol, gtol, eps, maxfun, maxiter, iprint, callback, maxls, finite_diff_rel_step, **unknown_options)
    349     while 1:
    350         # x, f, g, wa, iwa, task, csave, lsave, isave, dsave = \
--> 351         _lbfgsb.setulb(m, x, low_bnd, upper_bnd, nbd, f, g, factr,
    352                        pgtol, wa, iwa, task, iprint, csave, lsave,
    353                        isave, dsave, maxls)

ValueError: 0-th dimension must be fixed to 1 but got 15000 (real index=0)

任何帮助将不胜感激。scipy.optimize 中还有其他方法可用于解决此类问题吗?我的输入分布大小都是 15000。谢谢!

4

0 回答 0