scipy.оптимизируйте, используя дистрибутивы в качестве входных данных моей функции

#python #scipy #distribution #scipy-optimize-minimize #irr

Вопрос:

парни. Я пытаюсь сгенерировать массив оптимизированных значений из функции, которая имеет 3 переменные. Две переменные являются известными распределениями. Задача состоит в том, чтобы найти распределение IRR(внутренней нормы прибыли), когда известно распределение денежных потоков. Я начал с преобразования входных распределений в массивы

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

затем я использовал scipy.оптимизируйте следующим образом

 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: lt;1x1 LbfgsInvHessProduct with dtype=float64gt;  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) lt;ipython-input-109-8b5da553a644gt; in lt;modulegt;  2 squared_error = lambda i : np.abs(NPV(A_samp,salv_samp,i))  3  ----gt; 4 result_b= opt.minimize(fun=squared_error, x0=0.05, method='L-BFGS-B', bounds=((0, 1),))  5 print(result_b)  ~anaconda3libsite-packagesscipyoptimize_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)  617 **options)  618 elif meth == 'l-bfgs-b': --gt; 619 return _minimize_lbfgsb(fun, x0, args, jac, bounds,  620 callback=callback, **options)  621 elif meth == 'tnc':  ~anaconda3libsite-packagesscipyoptimizelbfgsb.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 =  --gt; 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 для обоих. Спасибо!