2015-01-05 15 views
6

Tôi đang làm việc trên một chương trình nhỏ hiển thị thuyền chèo di chuyển. Phần sau cho thấy một mã mẫu đơn giản (Python 2.x):Mã giống với hành trình chèo thuyền

import time 
class Boat: 
    def __init__(self, pace, spm): 
     self.pace = pace #velocity of the boat in m/s 
     self.spm = spm #strokes per minute 
     self.distance = 0 #distance travelled 

    def move(self, deltaT): 
     self.distance = self.distance + (self.pace * deltaT) 

boat1 = Boat(3.33, 20) 
while True: 
    boat1.move(0.1) 
    print boat1.distance 
    time.sleep(0.1) 

Như bạn có thể thấy một chiếc thuyền có tốc độ và hàng với số lần đột quỵ mỗi phút. Mỗi khi phương pháp move(deltaT) được gọi là nó di chuyển một khoảng cách nhất định theo tốc độ.

Thuyền trên chỉ đi với tốc độ không đổi, không thực tế. Một chiếc thuyền chèo thực sự tăng tốc vào đầu của một cơn đột quỵ và sau đó giảm tốc sau khi lưỡi chèo thuyền rời khỏi nước. Có rất nhiều biểu đồ trực tuyến mà hiển thị một đường cong đặc trưng chèo (lực đưa ra ở đây, vận tốc trông tương tự):

Rowing Stroke Graph Nguồn: highperformancerowing.net

Tốc độ nên không đổi theo thời gian, nhưng nó phải thay đổi trong đột quỵ.

Cách tốt nhất để thay đổi vận tốc không đổi thành một đường cong (ít nhất là về cơ bản) giống như đột quỵ chèo thực tế hơn?

Lưu ý: Bất kỳ ý tưởng nào về cách gắn thẻ câu hỏi này tốt hơn? Đây có phải là một vấn đề về thuật toán không?

+1

Sử dụng nội suy spline, ví dụ: từ SciPy. – nwk

+0

Xem thêm trang web SE để thống kê http://stats.stackexchange.com – smci

+0

Và biến đổi làm mịn stat_smooth trong thư viện ggplot. – smci

Trả lời

2

Nếu mục tiêu của bạn chỉ đơn giản là đưa ra một cái gì đó trực quan đáng tin cậy và không nên làm một mô phỏng vật lý đầy đủ, bạn có thể chỉ cần thêm một làn sóng sin để vị trí này.

class Boat: 
    def __init__(self, pace, spm, var=0.5): 
     self.pace = pace #average velocity of the boat in m/s 
     self.sps = spm/60.0 #strokes per second 
     self.var = var  #variation in speed from 0-1 
     self.totalT = 0  #total time 
     self.distance = 0 #distance traveled 

    def move(self, deltaT): 
     self.totalT += deltaT 
     self.distance = self.pace * (self.totalT + self.var * math.sin(self.totalT * self.sps * 2*math.pi) 

Bạn cần cẩn thận với biến thể var nếu thuyền quá cao có thể quay ngược lại và phá hủy ảo giác.

+0

Kết quả của mã hoạt động, vì tôi đã thử nghiệm một máy chạy với tốc độ 10m/s và SPM 20 hàng trong 30 phút đột quỵ: https://ideone.com/wHjZs3 Vận tốc trong đột quỵ tuy nhiên dường như để nhảy qua lại. Bất kỳ ý tưởng gì là sai trong tính toán? Chúng ta không phải đặt tốc độ vào sóng sin thay vì thời gian sao? – MOnsDaR

+0

@MOnsDaR xin lỗi, tôi đã chỉnh sửa mà tôi đã thực hiện nhưng không sao chép vào câu trả lời. '/ Self.sps' phải là' * self.sps'. –

+0

Điều đó đã làm các trick, giá trị hiện đang tăng/giảm dọc theo một làn sóng sin: https://ideone.com/2Cb6u8 Tuy nhiên đường cong là chính xác đảo ngược với những gì tôi mong đợi: Nó bắt đầu nhanh, đi chậm hơn, kết thúc nhanh chóng. Nó phải là cách khác xung quanh. Tôi chơi xung quanh với phương trình nhưng không thể chạy nó một cách chính xác, bạn có thể giúp đỡ lần cuối không? – MOnsDaR

1

Bạn có thể chuyển đổi một đường cong như thế này thành một phương trình đa thức cho vận tốc.

Mô tả/ví dụ về làm thế nào để làm điều này có thể được tìm thấy tại địa chỉ:

python numpy/scipy curve fitting

này cho bạn thấy làm thế nào để tham gia một bộ x, tọa độ y (mà bạn có thể nhận qua sự kiểm tra của hiện tại của bạn cốt truyện hoặc từ dữ liệu thực tế) và tạo ra một hàm đa thức.

Nếu bạn đang sử dụng cùng một đường cong cho từng đối tượng Thuyền, bạn có thể chỉ cần mã hóa nó vào chương trình của bạn. Nhưng bạn cũng có thể có một phương trình đa thức riêng biệt cho từng đối tượng Thuyền, giả sử mỗi người chèo thuyền hoặc thuyền có một cấu hình khác nhau.

+1

Chỉ cần nhận thấy biểu đồ của bạn có Lực trên trục y. Lực là khối lượng * gia tốc. Vì khối lượng của bạn là hằng số, nó chủ yếu là một âm mưu gia tốc (không phải vận tốc). – jrel

+0

Đây là một cách tiếp cận nâng cao tốt, nó có thể là một chút phức tạp cho bây giờ. Tôi sẽ xem xét điều này khi ứng dụng của tôi cần một giải pháp phức tạp hơn – MOnsDaR

1

Bạn có thể thực hiện tích hợp đơn giản phương trình vi phân của chuyển động. (Đây là những gì bạn đã làm để có được không gian như một hàm của thời gian, với tốc độ không đổi, x' = x + V.dt.)

Giả sử một mô hình đơn giản với lực không đổi trong đột quỵ và không có lực trong khi trượt và kéo tỷ lệ thuận với Tốc độ.

Vì vậy, tăng tốc là a = P - D.v trong đột quỵ và - D.v trong khi trượt (giảm tốc).

Tốc độ xấp xỉ với v' = v + a.dt.

Không gian được xấp xỉ với x' = x + v.dt.

Nếu dt là đủ nhỏ, chuyển động này sẽ trông thực tế. Bạn có thể tinh chỉnh mô hình với một luật lực chính xác hơn và các kỹ thuật tích hợp tốt hơn như Runge-Kutta, nhưng tôi không chắc nó có giá trị hay không.

Dưới một ví dụ về tốc độ và không gian so với thời gian sử dụng kỹ thuật này.Nó cho thấy dao động tốc độ nhanh chóng thiết lập một chế độ định kỳ, và dịch chuyển bán tuyến tính với các đường lượn sóng.

enter image description here

+0

Tôi đoán đây là một giải pháp tổng thể đủ tốt. Tuy nhiên câu hỏi của tôi là có nghĩa là nhiều hơn để yêu cầu "Làm thế nào tôi có thể mô hình đường cong để được giống như một đột quỵ chèo, nhưng giữ tốc độ tổng thể". – MOnsDaR

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