2013-04-10 20 views
5

Bây giờ câu hỏi của how to parse a string for magnitude and physical unit được giải quyết, câu hỏi tiếp theo là, cách tốt nhất nên thực hiện về việc đóng gói hai cái này lại với nhau theo cách mà một mặt không tốn quá nhiều hiệu suất nhưng mặt khác .Làm thế nào để pythonically tuple độ lớn và các đơn vị vật lý?

Để làm rõ ý tôi, hãy xem ví dụ hai vận tốc v = 5 m/su = 10 mph. Các previous question đã chăm sóc chuyển đổi mọi thứ thành SI units (vì vậy bạn sẽ không crash another Mars mission do rằng). Vì vậy, nội bộ sẽ có một ví dụ một tuple v = (5, m/s)u = (4.4704, m/s) và thường trình đầu ra sẽ xử lý việc sử dụng các đơn vị ưu tiên cho đầu ra. Trong khi áp dụng các hoạt động tương thích đơn vị trên cả hai, ví dụ: Ngoài ra, hoặc trừ các ô vuông của chúng, là hợp lệ, những người khác như v - 1/u là vô nghĩa và hoàn toàn vô nghĩa. Nhưng cách tốt nhất nên được thực hiện như thế nào? Một số khả năng mà tôi đã xem xét cho đến thời điểm này:

  • Không. Vì các đơn vị SI nội bộ chỉ được sử dụng, nên có thể là là điều hiển nhiên. Nhưng bỏ qua thông tin đó rất có khả năng trở thành nguồn gốc của các lỗi nếu các công thức trở nên phức tạp hơn
  • Phân lớp tuple và ghi đè tất cả kiểm tra tính nhất quán của đơn vị tiền tố hoạt động hợp lệ. Âm thanh vui nhộn ...
  • Lưu các giá trị là sympy.core.mul.Mul giây của thời gian lớn nhất (hàm có ý nghĩa) sympy.physics.unit.Unit, ví dụ: v = 5*unit.m/unit.s. Tôi không mong đợi hiệu suất tuyệt vời của điều này, cộng với tôi vẫn sẽ phải kiểm tra xem kết quả của một hoạt động vẫn là hình thức magnitude * unit.
  • Sử dụng numpy.array với mục nhập bổ sung sympy.physics.unit.Unit, đã triển khai các hoạt động theo nguyên tắc. Đây vẫn sẽ đòi hỏi một hướng dẫn kiểm tra đơn vị thống nhất sau đó (thực tế là ví dụ m+m=2m cũng sẽ cần phải được điều trị ...)
  • Subclass numpy.array thay vì tuple, ghi đè lên các nhà khai thác thêm vào trước các đơn vị thống nhất kiểm tra trước gọi super - các toán tử trên mảng mà không cần đơn vị. Có lẽ một số phép thuật __getattribute__ có thể đơn giản hóa điều này vì tất cả các hoạt động hợp lệ đã được triển khai cho cả hai đơn vị ...

Là một trong những giải pháp tốt/pythonic? Hay còn cách nào khác? Liệu một thư viện xử lý điều này đã tồn tại chưa?

chỉnh sửa Lưu ý rằng điều này không nên bị hạn chế đối với các giá trị vô hướng; vectơ, ma trận (thậm chí có thể sympy.Symbol s) cũng nên làm việc

Trả lời

1

Sử dụng Magnitude thư viện:

from magnitude import mg 

m = mg(5, 'kg') 
a = mg(9.82, 'm/s2') 
f = m * a 
print f, f == mg(49.1, 'N') 

u = mg(70, 'km/h') 
g = mg(9.82, 'm/s2') 
s = (u**2)/(2*g) 
print s, s > mg(10, 'm') 

Điều thú vị xảy ra khi có một đơn vị không phù hợp:

>>> m = mg(5, 'kg') 
>>> a = mg(9.82, 'm/s') 
>>> f = m * a 
>>> print f, f == mg(49.1, 'N') 
MagnitudeError: Incompatible units in comparison: [1, -2, 0, 1, 0, 0, 0, 0, 0] and [1, -1, 0, 1, 0, 0, 0, 0, 0] 

Không phải là lỗi tốt nhất tin nhắn có lẽ, nhưng nó có hiệu quả ngăn cản bạn xử lý các giá trị theo cách sai.

+0

Có vẻ tốt (thông báo lỗi về quyền hạn đơn vị SI tôi đoán). Nó cũng có thể điều trị mảng? –

+0

Bạn có nghĩa là danh sách?'[mg (t, 's') * mg (70, 'km/h') cho t trong phạm vi (10)]' –

+0

Tôi đã suy nghĩ về vectơ và ma trận, ví dụ: Vectơ tốc độ 3D, và một cái gì đó như 'mg ([. 5,0,3], 'm/s')' có thể trông đẹp hơn '[mg (.5, 'm/s'), mg (0, ' m/s '), mg (3,' m/s ')] ' –

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