Назначение выходов 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