2010-01-18 52 views
16

Tôi đang tìm một thư viện tốt sẽ tích hợp các ODE cứng trong Python. Vấn đề là, odeint của scipy mang lại cho tôi các giải pháp tốt đôi khi, nhưng thay đổi nhỏ nhất trong điều kiện ban đầu khiến nó rơi xuống và bỏ cuộc. Vấn đề tương tự cũng được giải quyết khá an toàn bởi các bộ giải mã cứng của MATLAB (ode15s và ode23s), nhưng tôi không thể sử dụng nó (ngay cả từ Python, vì không có ràng buộc Python nào cho MATLAB C API thực hiện callbacks, và tôi cần truyền một hàm cho bộ giải ODE). Tôi đang cố gắng PyGSL, nhưng nó phức tạp khủng khiếp. Bất kỳ đề xuất sẽ được đánh giá rất cao.Tích hợp các ODE cứng với Python

EDIT: Vấn đề cụ thể mà tôi gặp phải với PyGSL là chọn đúng chức năng bước. Có một số trong số đó, nhưng không có tương tự trực tiếp với ode15s hoặc ode23s (công thức bdf và Rosenbrock đã sửa đổi nếu điều đó có ý nghĩa). Vì vậy, một chức năng bước tốt để lựa chọn cho một hệ thống cứng là gì? Tôi phải giải quyết hệ thống này trong một thời gian dài để đảm bảo rằng nó đạt đến trạng thái ổn định, và GSL giải quyết hoặc chọn một bước thời gian rất nhỏ hoặc một bước quá lớn.

+0

Tôi muốn giúp bạn với PyGSL. Tôi chưa bao giờ sử dụng nó, nhưng tôi có kinh nghiệm với GSL. Tôi chỉ xem xét các ví dụ được cung cấp trong pygsl (odeiv.py) và nó trông khá giống như trong C. Bạn có nghĩ rằng PyGSL là khủng khiếp phức tạp vì giao diện python hoặc GSL mỗi se? – YuppieNetworking

+0

Vâng, phức tạp khủng khiếp có lẽ là một lời nói quá mức :). Nó _is_ một thứ tự của cường độ phức tạp hơn MATLAB hoặc scipy mặc dù. Để làm rõ, giao diện python là khá giống với giao diện C, do đó, nó là thư viện chính nó là phức tạp. Plus, PyGSL không tài liệu odeiv, vì vậy tôi phải sử dụng các tài liệu C để tìm ra những gì cần làm trong Python. Không vui. –

+0

Đã chỉnh sửa câu hỏi. –

Trả lời

11

Python có thể gọi C. Tiêu chuẩn ngành là LSODE trong ODEPACK. Đó là miền công cộng. Bạn có thể tải xuống C version. Những người giải quyết này cực kỳ phức tạp, vì vậy tốt nhất là nên sử dụng một số mã được kiểm tra kỹ lưỡng.

Đã thêm: Đảm bảo bạn thực sự có hệ thống cứng, tức là nếu tỷ lệ (giá trị riêng) khác nhau nhiều hơn 2 hoặc 3 đơn vị độ lớn. Ngoài ra, nếu hệ thống là cứng, nhưng bạn chỉ tìm kiếm một giải pháp ổn định, các giải pháp này cung cấp cho bạn tùy chọn giải một số phương trình đại số. Nếu không, một người giải quyết Runge-Kutta tốt như DVERK sẽ là một giải pháp tốt và đơn giản hơn nhiều.

thêm ở đây vì nó sẽ không phù hợp trong một chú thích: Đây là từ doc tiêu đề DLSODE:

C  T  :INOUT Value of the independent variable. On return it 
C     will be the current value of t (normally TOUT). 
C 
C  TOUT :IN  Next point where output is desired (.NE. T). 

Ngoài ra, vâng Michaelis-Menten động học là phi tuyến. Tuy nhiên, khả năng tăng tốc Aitken hoạt động với nó. (Nếu bạn muốn có một lời giải thích ngắn, trước tiên hãy xem xét trường hợp đơn giản của Y là một vô hướng. Bạn chạy hệ thống để có được 3 điểm Y (T). Bây giờ chỉ cần khái quát hóa Y là một vectơ. Giả sử 3 điểm nằm trong mặt phẳng - không sao nếu chúng không.) Ngoài ra, trừ khi bạn có hàm cưỡng bức (như giọt IV không đổi), việc loại bỏ MM sẽ phân rã đi và hệ thống sẽ tiếp cận tuyến tính. Hy vọng rằng sẽ giúp.

+0

Cảm ơn mẹo LSODE. Tôi thấy rằng ai đó đã viết một giao diện Python cho nó tại http://www.cs.uiuc.edu/homes/mrgates2/ode/. Sẽ thử điều này vào ngày mai và chấp nhận câu trả lời của bạn nếu nó hoạt động. –

+0

@Chinmay: Bingo! Hi vọng nó sẽ giúp ích cho bạn. –

+0

Tôi biết tôi thực sự có một hệ thống cứng, nhưng nhìn vào các nguồn LSODE, tôi nhận ra tôi có một lỗi có thể có trong chương trình của tôi. Trình giải mã scipy.integrate.odeint dựa trên LSODA, và giống như tất cả các bộ giải mã LS *, phải mất một vectơ các điểm thời gian để tính toán giải pháp. Hóa ra, tôi đang tính toán vectơ thời gian này quá thô. Tôi chuyển sang Python từ MATLAB và nghĩ rằng numpy.arange sẽ làm việc tương tự như i = t0: tn trong MATLAB. Nó không. Vì vậy, tôi đã được giải quyết chỉ cho số nguyên lần tất cả trong khi ... –

1

Tôi hiện đang nghiên cứu một chút ODE và giải quyết nó, vì vậy câu hỏi của bạn là rất thú vị với tôi ...

Từ những gì tôi đã nghe và đọc, cho các vấn đề gay gắt một cách đúng đắn để đi là để lựa chọn một phương thức ngầm định như là một hàm bước (đúng với tôi nếu tôi sai, tôi vẫn đang học về những người giải quyết ODE). Tôi không thể trích dẫn bạn, nơi tôi đọc này, bởi vì tôi không nhớ, nhưng đây là một thread từ gsl-help, nơi một câu hỏi tương tự đã được hỏi.

Vì vậy, trong ngắn hạn, có vẻ như phương pháp bsimp đáng để chụp, mặc dù nó yêu cầu chức năng jacobian. Nếu bạn không thể tính toán Jacobian, tôi sẽ thử với rk2imp, rk4imp hoặc bất kỳ phương pháp thiết bị nào.

17

Nếu bạn có thể giải quyết vấn đề của mình với số ode15s của Matlab, bạn sẽ có thể giải quyết vấn đề với trình giải mã vode của scipy. Để mô phỏng ode15s, tôi sử dụng các cài đặt sau:

ode15s = scipy.integrate.ode(f) 
ode15s.set_integrator('vode', method='bdf', order=15, nsteps=3000) 
ode15s.set_initial_value(u0, t0) 

và sau đó bạn hạnh phúc có thể giải quyết vấn đề của bạn với ode15s.integrate(t_final). Nó sẽ làm việc khá tốt trên một vấn đề cứng.

(Xem thêm http://www.scipy.org/NumPy_for_Matlab_Users)

+0

Tốt! Cảm ơn vì điều đó. Tôi đến ít nhiều một giải pháp tương tự cuối cùng, sử dụng 'vode'. –

+1

Lệnh tối đa cho '' 'bdf''' là 5. Không có điểm nào để thiết lập thứ tự cao hơn 12. Bởi vì 12 là mức tối đa cho Adams. –

2

PyDSTool kết thúc tốt đẹp giải Radau, mà là một tuyệt vời ngầm cứng tích hợp. Điều này có nhiều thiết lập hơn odeint, nhưng ít hơn nhiều so với PyGSL. Lợi ích lớn nhất là hàm RHS của bạn được chỉ định như một chuỗi (thông thường, mặc dù bạn có thể xây dựng một hệ thống sử dụng các thao tác biểu tượng) và được chuyển đổi thành C, vì vậy không có callbacks trăn chậm và toàn bộ điều sẽ rất nhanh.