2014-12-25 3 views
0

Почему невозможно вставить не квадратную матрицу в одну функцию оптимизации scipy? (я имею в виду функцию F имеет больше строк, чем переменные)Scipy Root Поиск не квадратной матрицы

def F(x): 
    L = numpy.zeros(13) 
    L[0] = x[0]*x[0] - x[0] 
    L[1] = x[1]*x[1] - x[1] 
    L[2] = x[2]*x[2] - x[2] 
    L[3] = x[3]*x[3] - x[3] 
    L[4] = x[4]*x[4] - x[4] 
    L[5] = x[5]*x[5] - x[5] 
    L[6] = x[6]*x[6] - x[6] 
    L[7] = x[7]*x[7] - x[7] 

    L[8] = x[0]+x[1]+x[2]-2 
    L[9] = x[5]+x[6]-x[7]-2 
    L[10] = 3*x[0]+x[1]+x[2]-1 
    L[11] = x[0]+x[4]+x[3]-2 
    L[12] = x[3]-2*x[5]+x[7]-2 
    return L 

x = [1,1,1,1,1,1,1,1] 


print x 
print F(x) 
y = scipy.optimize.root(F, x) 

Что я могу использовать, то вместо этого?

ответ

0

Похоже, что optimize.root требует, чтобы F принял массив формы (N) и возвратил массив формы (N,).

Единственное исключение - то, когда используется method='lm'. The docs say,

Метод лм решает системы нелинейных уравнений в наименьших квадратов толку с использованием модификации алгоритма Левенберга-Marquardt, как реализованный в MINPACK [R110].

Запуск

sol = optimize.root(F, x, method='lm') 
print(sol.x) 
print(sol.fun)) 

дает

[-0.25534031 1.00426132 1.00426132 1.26246697 0.99641747 -0.1852661 
    1.32671248 -0.14183467] 
[ 0.32053899 0.00427948 0.00427948 0.33135589 -0.00356969 0.21958963 
    0.43345353 0.16195174 -0.24681766 -0.71671895 0.24250171 0.00354414 
-0.50883549] 

Так что, хотя "решение" было обнаружено, что это не является корнем F. Почему? С method='lm', optimize.root возвращает решение , которое минимизирует|F|^2. Это то же место, что и вы, используя optimize.minimize:

def Fnorm(x): 
    return (F(x)**2).sum() 

res = optimize.minimize(Fnorm, x) 

print(res['x']) 
# array([-0.25534014, 1.00426118, 1.00426118, 1.26246497, 0.99641833, 
#  -0.1852652 , 1.32672144, -0.14182902]) 

print(res['fun']) 
# 1.3672594815275587 
Смежные вопросы