Присвояване на изходите на fmin в scipy.optimize

Имам функция на една променлива, на която бих искал да намеря минималната стойност, както и стойността на променливата, където е постигнат минимумът. В момента постигам това чрез следния скрипт на Python:

import numpy as np
from scipy.optimize import fmin
import math

x1=0.
y1=800.
x2=1100.
y2=-800.

v1=2000.
v2=4000.

def T(xi):
    time=sqrt((x1-xi)**2+y1**2)/v1+sqrt((x2-xi)**2+y2**2)/v2
    return time

fmin(T,0)

Изпълнението на този скрипт произвежда следното ехо:

import numpy as np
from scipy.optimize import fmin
import math

x1=0.
y1=800.
x2=1100.
y2=-800.

v1=2000.
v2=4000.

def T(xi):
    time=sqrt((x1-xi)**2+y1**2)/v1+sqrt((x2-xi)**2+y2**2)/v2
    return time

fmin(T,0)
Optimization terminated successfully.
         Current function value: 0.710042
         Iterations: 41
         Function evaluations: 82
Out[24]: array([ 301.9498125])

Така че минималната стойност на функцията е ~0,71 и се постига при стойност на аргумента ~302. Бих искал обаче да присвоя тези стойности, както следва:

(Tmin,xmin)=fmin(T,0)
Optimization terminated successfully.
         Current function value: 0.710042
         Iterations: 41
         Function evaluations: 82
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
C:\Users\Kurt.Peek\<ipython-input-25-aec613726d59> in <module>()
----> 1 (Tmin,xmin)=fmin(T,0)

ValueError: need more than 1 value to unpack

Така че получавам грешка „ValueError: нужда от повече от 1 стойност за разопаковане“. Някой знае ли как да предотврати тази грешка и да присвои тези два изхода?


person Kurt Peek    schedule 26.04.2014    source източник


Отговори (2)


fmin има full_output=True параметър :

xopt, fopt, iter, funcalls, warnflag = fmin(T,0, full_output=True, disp=False)
print(xopt, fopt)
# (array([ 301.9498125]), 0.71004171552448025)
person unutbu    schedule 26.04.2014
comment
Въпреки че това изглежда като правилния начин за използване на fmin, аз мислех по линията на varargout на Matlab, в който незадължителните изходи имат специфичен ред (varargout{1}, varargout{2} и т.н.) и потребителят може да присвои произволен брой изходи в зависимост от това колко го интересуват. В този пример не се интересувам от iter, funcalls или warnflag, но очевидно трябва да създам променливи за тях, ако искам да използвам full_output=True. Накратко, работи, но изглежда по-малко лесен за използване от Matlab. - person Kurt Peek; 27.04.2014
comment
Да предположим, че сте имали верига от извиквания на функции, всяко от които предава своята върната стойност един на друг: f(*g(*h())). Няма ли да стане объркващо да знаете какво точно се преминава на всеки етап? Мисля, че начинът на Python води до по-чист дизайн. - person unutbu; 27.04.2014

Следното постига същото нещо: в края на скрипта, който добавих

xmin=fmin(T,0)
Tmin=T(xmin)

Това дава желаните резултати:

xmin
Out[30]: array([ 301.9498125])

T(xmin)
Out[31]: array([ 0.71004172])

Така че вместо да посоча няколко изхода за fmin, получих само аргумента и използвах функцията отново, за да получа минималната стойност.

person Kurt Peek    schedule 26.04.2014