Я пытаюсь решить/свести к минимуму набор полиномов (часть вычислений LTE Winterstein-Jensen) с Python.Python Powell минимизирует решатель: введите ошибку - вычитая «список» и «список»
Я использую минимизирующий решатель fmin_Powell от SciPy. Смотрите следующий код:
import numpy as np
import scipy as sp
import scipy.optimize as spo
#start parameters and initial estimates:
average = 128.96530977973006
Stdevv = 355.72971228985256
Skewv = 12913.846528570562
Kurtv = 3.0009847038644031
Exckurtv = 0.00098470386440308033
c = np.zeros (4)
h30 = Skewv/(4.0 + 2.0 * (np.power(abs(1.0 + 1.5 * Exckurtv), 0.5)))
h40 = (np.sqrt((abs(1.0 + 1.5 * Exckurtv))) - 1.0)/18.0
K0 = np.power((1.0 + 2.0 * (np.power(h30,2.0)) + 6.0 * np.power(h40,2.0)), -0.5)
c[1] = Stdevv * K0 * (1.0 - 3.0 * h40)
c[2] = Stdevv * K0 * h30
c[3] = Stdevv * K0 * h40
#multi polynomials
def wj_f(p):
f1 = (np.power(p[0],2.0) + 6.0 * p[0] * p[2] + 2.0 * np.power(p[1],2.0) +
15.0 * np.power(p[2],2.0) - np.power(Stdevv,2.0))
f2 = (p[1] * (6.0 * np.power(p[0],2.0) + 8.0 * np.power(p[1],2.0) + 72.0 * p[0] * p[2] + 270.0 * np.power(p[2],2.0))
- np.power(Stdevv,3.0) * Skewv)
f3 = (60.0 * np.power(p[1],4.0) + 3.0 * np.power(p[0],4.0) + 10395.0 * np.power(p[2],4.0)
+ 60.0 * np.power(p[0],2.0) * np.power(p[1],2.0) + 4500.0 * np.power(p[1],2.0) * np.power(p[2],2.0)
+ 630.0 * np.power(p[0],2.0) * np.power(p[2],2.0) + 936.0 * p[0] * np.power(p[1],2.0) * p[2]
+ 3780.0 * p[0] * np.power(p[2],3.0) + 60.0 * np.power(p[0],3.0) * p[2] - np.power(Stdevv,4.0) * Kurtv)
wj_f = [f1,f2,f3]
return(wj_f)
print('Start solving')
#solver
xopt = spo.fmin_powell(wj_f,c[1:],args=(),xtol=1e-06,ftol=1e- 06,maxiter=None,maxfun=None,full_output=1,disp=1,retall=1,callback=None,direc=None)
print('Solved')
Однако, я получаю следующее сообщение об ошибке:
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
execfile('wj_in_python.py')
File "wj_in_python.py", line 85, in <module>
xopt = spo.fmin_powell(wj_f,c[1:],args=(),xtol=1e-06,ftol=1e-06,maxiter=None,maxfun=None,full_output=1,disp=1,retall=1,callback=None,direc=None)
File "C:\Program Files (x86)\Python\2.7.3\lib\site-packages\scipy\optimize\optimize.py", line 2227, in fmin_powell
res = _minimize_powell(func, x0, args, callback=callback, **opts)
File "C:\Program Files (x86)\Python\2.7.3\lib\site-packages\scipy\optimize\optimize.py", line 2299, in _minimize_powell
tol=xtol * 100)
File "C:\Program Files (x86)\Python\2.7.3\lib\site-packages\scipy\optimize\optimize.py", line 2120, in _linesearch_powell
alpha_min, fret, iter, num = brent(myfunc, full_output=1, tol=tol)
File "C:\Program Files (x86)\Python\2.7.3\lib\site-packages\scipy\optimize\optimize.py", line 1885, in brent
res = _minimize_scalar_brent(func, brack, args, **options)
File "C:\Program Files (x86)\Python\2.7.3\lib\site-packages\scipy\optimize\optimize.py", line 1901, in _minimize_scalar_brent
brent.optimize()
File "C:\Program Files (x86)\Python\2.7.3\lib\site-packages\scipy\optimize\optimize.py", line 1757, in optimize
tmp1 = (x - w) * (fx - fv)
TypeError: unsupported operand type(s) for -: 'list' and 'list'
Самой ошибка ясен: списки не могут быть вычтены из Афоризма.
Вопрос: почему Python/SciPy-скрипт создает два или более списков вместо числа или целых чисел?
вопрос счетчика: почему ваша функция 'wj_f' возвращает список? – cel
@cel: Благодарим вас за ответ/отличный счетчик вопросов. Я уже вижу свою ошибку. Должно было объединить результаты трех функций в одну большую сумму ('wj_f = f1 + f2 + f3'). Теперь он работает и решает. – Willem