2015-04-02 8 views
1

Я пытаюсь решить/свести к минимуму набор полиномов (часть вычислений 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-скрипт создает два или более списков вместо числа или целых чисел?

+2

вопрос счетчика: почему ваша функция 'wj_f' возвращает список? – cel

+3

@cel: Благодарим вас за ответ/отличный счетчик вопросов. Я уже вижу свою ошибку. Должно было объединить результаты трех функций в одну большую сумму ('wj_f = f1 + f2 + f3'). Теперь он работает и решает. – Willem

ответ

0

Следует объединить результаты трех функций в одну большую сумму (wj_f = f1 + f2 + f3).

Решатель не может работать со списком/матрицей/вектором.

 Смежные вопросы

  • Нет связанных вопросов^_^