2012-02-18 37 views
5

Tôi thường phải giải quyết các vấn đề phi tuyến trong đó số biến vượt quá số ràng buộc (hoặc đôi khi theo cách khác). Thông thường một số ràng buộc hoặc biến là dư thừa một cách phức tạp. Có cách nào để giải quyết vấn đề như vậy không?Tối ưu hóa SciPy cho hệ thống bị hạn chế

Hầu hết các trình giải mã scipy dường như giả định rằng số lượng các ràng buộc bằng với số lượng biến và Jacobian là vô nghĩa. leastsq hoạt động đôi khi nhưng nó thậm chí không thử khi các ràng buộc ít hơn số lượng các biến. Tôi nhận ra rằng tôi chỉ có thể chạy fmin trên linalg.norm(F), nhưng điều này kém hiệu quả hơn bất kỳ phương pháp nào sử dụng Jacobian.

Dưới đây là ví dụ về sự cố thể hiện những gì tôi đang nói đến. Nó rõ ràng là có một giải pháp, nhưng leastsq đưa ra một lỗi. Tất nhiên, ví dụ này là dễ dàng để giải quyết bằng tay, tôi chỉ cần đặt nó ở đây để chứng minh vấn đề.

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) 

Thông báo lỗi tôi nhận được là:

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 

tôi đã lùng sục mạng cho một câu trả lời và thậm chí còn hỏi trên mailing list scipy, và đã không có phản ứng. Hiện tại tôi đã hack nguồn SciPy để người giải quyết newton_krylov sử dụng pinv(), nhưng tôi không nghĩ đây là giải pháp tối ưu.

+0

Đây có phải là thực sự là một câu hỏi scipy hoặc là nó thực sự là một một trong toán học mặc một bộ râu giả? – talonmies

+0

Tôi tin rằng đó là một câu hỏi scipy. Tôi có thể giải quyết các loại vấn đề này bằng cách sử dụng các giải pháp tùy chỉnh mà tôi đã viết nhưng muốn sử dụng các trình giải mã scipy hiện có. Ngoài ra, fsolve của MATLAB có vẻ như có khả năng giải quyết chúng. Điều này có vẻ là một tình huống phổ biến và nó là loại khó tin rằng scipy không thể xử lý nó (dường như). –

+0

'fsolve' sử dụng phương pháp vùng IIRC tin cậy. Vậy bạn có thực sự muốn biết liệu có một hàm scipy tương tự với 'fsolve' không? – talonmies

Trả lời

3

Làm thế nào về thay đổi kích thước mảng trở về từ F() để số lượng các biến:

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

Cảm ơn, điều này dường như hoạt động. Có lý do nào đó không được thực hiện tự động không? Nếu không có tác dụng phụ có thể tôi sẽ đề nghị tự động đệm như một miếng vá để scipy. –

Các vấn đề liên quan