2012-02-18 26 views
5

Genellikle, değişken sayısının kısıtlama sayısını (veya bazen başka bir şekilde) aştığı doğrusal olmayan problemleri çözmem gerekiyor. Genellikle bazı kısıtlamalar veya değişkenler karmaşık bir şekilde gereksizdir. Bu tür sorunları çözmenin bir yolu var mı?Kısıtlı sistem için SciPy optimizasyonu

Scipy çözücülerinin çoğu, kısıtlamaların sayısının değişken sayısına eşit olduğunu ve Jacobian'ın nonsingular olduğunu varsayar. leastsq bazen çalışır, ancak kısıtlamaların değişken sayısından daha az olduğu zaman bile denemez.numaralı telefondan fmin'u çalıştırabileceğimin farkındayım, ancak bu, Jacobian'ı kullanan herhangi bir yöntemden çok daha az verimlidir.

İşte ben neden bahsettiğimi gösteren bir soruna bir örnektir. Açıkçası bir çözümü var, ancak leastsq bir hata veriyor. Tabii ki, bu örnek el ile çözmek kolaydır, sadece sorunu göstermek için buraya koymuştum.

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) 

alıyorum hata iletisi:

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 

Bir cevap net dolaştılar ve hatta scipy posta listesinde istediler ve hiçbir yanıt aldı. Şimdilik, newton_krylov çözücüsünün pinv() kullanması için SciPy kaynağını hackledim, ancak bunun ideal bir çözüm olduğunu düşünmüyorum. yaklaşık değişkenlerin sayısı F() dönüş dizisi yeniden boyutlandırmak nasıl

+0

bu gerçekten bir scipy soru mi yoksa aslında sahte sakal takan bir matematiksel biridir? – talonmies

+0

Ben bunun bir scipy soru olduğuna inanıyorum. Yazdığım özel çözücüleri kullanarak bu tür problemleri çözebilirim fakat mevcut scipy çözücülerini kullanabilmeyi tercih ederim. Ek olarak, matlab'ın fsolve bunları çözebiliyor gibi görünüyor. Bu yaygın bir durum gibi görünüyor ve scipy'nin (görünüşte) işleyemeyeceğine inanmak zor. –

+0

'fsolve', bir güven bölgesi yöntemi IIRC kullanır. Yani gerçekten 'fsolve' için benzer bir scipy işlevi olup olmadığını bilmek istiyor musunuz? – talonmies

cevap

3

:

import numpy as np 
import scipy.optimize 

mat = np.random.randn(5, 7) 

def F(x): 
    y = np.dot(mat, x) 
    return np.resize(np.array([ y[0]**2 + y[1]**3 + 12, y[2] + 17]), 7) 

while True:  
    x0 = np.random.randn(7) 
    r = scipy.optimize.leastsq(F, x0) 
    err = F(r[0]) 
    norm = np.dot(err, err) 
    if norm < 1e-6: 
     break 

print err 
+0

Teşekkürler, bu işe yarıyor. Bunun otomatik olarak yapılmaması için bir neden var mı? Herhangi bir yan etki yoksa, scipy için bir yama olarak otomatik dolgu öneririm. –