Często muszę rozwiązywać problemy nieliniowe, w których liczba zmiennych przekracza liczbę ograniczeń (lub czasami odwrotnie). Zazwyczaj niektóre ograniczenia lub zmienne są zbyteczne w skomplikowany sposób. Czy istnieje sposób na rozwiązanie takich problemów?Optymalizacja SciPy dla systemu o ograniczonym dostępie
Większość rozwiązujących scipy zdaje się zakładać, że liczba wiązań jest równa liczbie zmiennych i że jakobian jest niesłyszalny. leastsq
działa czasami, ale nawet nie próbuje, gdy ograniczenia są mniejsze niż liczba zmiennych. Zdaję sobie sprawę, że mogłem po prostu uruchomić fmin
na linalg.norm(F)
, ale jest to znacznie mniej wydajne niż jakakolwiek metoda wykorzystująca Jacobian.
Oto przykład problemu, który pokazuje, o czym mówię. Oczywiście ma rozwiązanie, ale leastsq
daje błąd. Oczywiście, ten przykład jest łatwy do rozwiązania ręcznie, po prostu umieszczam go tutaj, aby zademonstrować problem.
import numpy as np
import scipy.optimize
mat = np.random.randn(5, 7)
def F(x):
y = np.dot(mat, x)
return np.array([ y[0]**2 + y[1]**3 + 12, y[2] + 17 ])
x0 = np.random.randn(7)
scipy.optimize.leastsq(F, x0)
Komunikat o błędzie pojawia się:
Traceback (most recent call last):
File "question.py", line 13, in <module>
scipy.optimize.leastsq(F, x0)
File "/home/dstahlke/apps/scipy/lib64/python2.7/site-packages/scipy/optimize/minpack.py", line 278, in leastsq
raise TypeError('Improper input: N=%s must not exceed M=%s' % (n,m))
TypeError: Improper input: N=7 must not exceed M=2
mam odtłuszczone netto na odpowiedź i nawet poprosił o liście dyskusyjnej scipy i dostał żadnej odpowiedzi. Na razie włamałem się do źródła SciPy, aby ten solver używał , ale uważam, że nie jest to optymalne rozwiązanie.
Czy to naprawdę scipy pytanie, czy jest to rzeczywiście jeden matematyczny sobie fałszywą brodę? – talonmies
Wierzę, że to pytanie scipy. Mogę rozwiązywać tego typu problemy za pomocą własnych solverów, które napisałem, ale wolałbym móc korzystać z istniejących solverów. Ponadto fsolve firmy matlab wydaje się być w stanie rozwiązać te problemy. Wydaje się, że jest to powszechna sytuacja i trudno jest uwierzyć, że scipy nie poradzi sobie z tym (pozornie). –
'fsolve' używa metody regionu zaufania IIRC. Czy naprawdę chcesz wiedzieć, czy istnieje analogiczna funkcja scipy do 'fsolve'? – talonmies