RK4, Đạo hàm, Hiểu vật lý trò chơi


8

Gafferon Games có một bài viết tuyệt vời về Tích hợp RK4 để xây dựng các mô phỏng vật lý có thể tìm thấy ở đây: Khái niệm cơ bản về tích hợp

Cá nhân tôi kiến ​​thức toán học và vật lý có thể sử dụng cải tiến. Tôi cảm thấy thoải mái trong lĩnh vực toán học vectơ, trig, một số chỉ số (tôi đã phải sử dụng các công thức hồi quy dòng tuyến tính cho phần mềm, v.v.), và về cơ bản hầu hết mọi thứ từ cấp trung học đến đại học năm thứ nhất.

Bây giờ đến câu hỏi, tôi đã đọc bài viết này, tải xuống nguồn liên quan và gỡ lỗi từng dòng để thử và hiểu về những gì đang xảy ra và vẫn cảm thấy như tôi rõ ràng không hiểu những gì tôi đang xem. Tôi đã tìm kiếm trên mạng để cố gắng tìm các phiên bản "Dành cho người giả", thật lòng tôi học được một chút khác biệt và nhìn chằm chằm vào các công thức cả ngày với sự nhấn mạnh vào việc ghi nhớ sẽ không cắt giảm vì tôi cần phải hiểu những gì đang xảy ra nên tôi có thể linh hoạt áp dụng nó.

Vì vậy, đây là những gì tôi nghĩ rằng tôi hiểu cho đến nay, nhưng tôi hy vọng người khác có thể làm rõ hoặc hoàn toàn sửa chữa tôi. RK4 sử dụng bước Euler, sau đó căn cứ để di chuyển về phía trước kịp thời để tính toán một số bước Euler cơ bản hơn (?) Và xác định sử dụng tổng trọng số vị trí và vận tốc tốt nhất cho khung tiếp theo là gì?

Hơn nữa, phương pháp tăng tốc (được chuyển đổi thành AS3):

private function acceleration(state:State, time:Number):Number
{
    const k:int = 10;
    const b:int = 1;
    return - k*state.x - b*state.v;
}

mất một khối lượng không đổi (10) và lực (1)? và trả về một số tính toán kỳ lạ Tôi không biết tại sao ...- khối lượng * vị trí - lực * vận tốc? gì?

Sau đó, cho sự nhầm lẫn cuối cùng của tôi, trong các phương pháp đánh giá trông giống như (AS3):

private function evaluateD(initial:State, time:Number, dtime:Number, d:Derivative):Derivative
{
    var state:State = new State();
    state.x = initial.x + d.dx*dtime;
    state.v = initial.v + d.dv*dtime;
    var output:Derivative = new Derivative();
    output.dx = state.v;
    output.dv = acceleration(state, time+dtime);
    return output;
}

Chúng tôi lưu trữ một trạng thái mới với bước thời gian, sau đó đặt đạo hàm để trở về ... Tôi sắp xếp hiểu điều này khi nó được sử dụng trong quy trình gần đúng, nhưng đây là gì!:

output.dx = state.v;
output.dv = acceleration(state, time+dtime); 

// ok I get we are getting the new velocity since v = a * t, obviously I   
// don't what acceleration() is returning though. 

Chúng ta đặt thay đổi đầu ra phái sinh ở vị trí để trạng thái vận tốc mới? Huh?

Cuối cùng, mô phỏng thử nghiệm này thực hiện việc này:

var state:State = new State();
state.x = 100;
state.v = 0;

t = 0;
dt = 0.1;

while (Math.abs(state.x)>0.001 || Math.abs(state.v)>0.001)
{
    trace(state.x, state.v);
    integrate(state, t, dt);
    t += dt;
}

Vậy chúng ta đang thiết lập trạng thái mới với giá trị vị trí là 100 và vận tốc bằng 0? Điểm mô phỏng này là gì nếu chúng ta không có vận tốc ...

Dù sao, không cần phải nói tôi khá bối rối và đã trôi dạt khỏi hành tinh Trái đất. Hy vọng ai đó ngoài kia có thể làm rõ điều này cho tôi.


Nếu trò chơi là thứ bạn đang theo đuổi, RK4 là một thứ quá mức cần thiết và do tỷ lệ chi phí so với độ ổn định của nó, không phải là lựa chọn tốt nhất cho những thay đổi đột ngột và đột ngột trong khả năng tăng tốc của bạn. Nếu bạn đang tìm kiếm một cuộc thảo luận về loại tích hợp nào đáng để lựa chọn, cũng như cách xây dựng một trình giả lập khá đơn giản, tôi có thể đề xuất một báo cáo kỹ thuật về chính xác các vấn đề này: arxiv.org/pdf/1311.5018v1.pdf
teodron

1
Thật thú vị, tôi sẽ lấy một ít cà phê và đọc nó! Cá nhân, tôi quan tâm đến việc hiểu càng nhiều càng tốt từ mô phỏng cơ bản đến nâng cao. Hiện tại tôi đã thực hiện một vài thứ rất cơ bản, nhưng đây hoàn toàn là một cuộc tìm kiếm kiến ​​thức để tôi có thể phát huy hơn nữa sự linh hoạt của mình với tư cách là một nhà phát triển. Cảm ơn đã tham khảo, đánh giá rất cao nó!
Bennett Yeates

Câu trả lời:


6

RK4 là một ví dụ về tích hợp số . Tích hợp Euler là một khái niệm tương tự, nhưng nó ít chính xác hơn nhiều. Tích hợp số không chính xác, nhưng tốt hơn nhiều cho một máy tính để xử lý trong tình huống thời gian thực như trò chơi. Lý do bạn sử dụng RK4 thay vì Euler là RK4 tính đến việc tích hợp các dẫn xuất thứ hai và thứ ba (tăng tốc và giật), do đó phù hợp với giải pháp phân tích tốt hơn nhiều.

RK4 về cơ bản là sự mở rộng chuỗi Taylor của phương trình vi phân xác định gia tốc liên quan đến chuyển vị và vận tốc. Điều này cho phép bạn tích hợp các lực phụ thuộc vào các đại lượng này, chẳng hạn như trong các ràng buộc và thậm chí cả trọng lực phổ quát. Mở rộng chuỗi Taylor rất hữu ích trong lập trình vì máy tính có thể đánh giá chúng rất hiệu quả.

Các accelerationchức năng sử dụng là một ví dụ đơn giản là một hệ thống lò xo hãm, không hấp dẫn. klà hằng số mùa xuân của Hooke và bđược sử dụng để làm ẩm hệ thống (loại bỏ năng lượng). Đối với hầu hết tất cả các ràng buộc liên quan đến lò xo trong động cơ của bạn, bạn sẽ muốn làm ẩm chúng vì các lỗi số có thể gây ra sự tích lũy năng lượng rất lớn, khiến mô phỏng phát nổ. Nếu bạn đang sử dụng tích hợp Euler, điều này sẽ tồi tệ hơn nhiều.

Liên quan đến acceleration(), một động cơ vật lý hoàn chỉnh hơn sẽ tính toán cả gia tốc tuyến tính và góc dựa trên lực (mô-men xoắn). Các lực tổng hợp có thể bao gồm trọng lực (không đổi hoặc dựa trên Trọng lực phổ quát), độ nổi và lò xo (hầu hết các ràng buộc có thể được mô hình hóa bằng lò xo cứng).

Câu hỏi thứ ba của bạn rất dễ trả lời. Trong động học, có ba đại lượng cơ bản: chuyển vị (vị trí), vận tốc và gia tốc. Gia tốc là đạo hàm của vận tốc, là đạo hàm của sự dịch chuyển (cả về thời gian). Một đạo hàm chỉ là tốc độ mà một cái gì đó thay đổi. Derivative.dxcó nghĩa là "đạo hàm của State.x".

Bởi vì mô phỏng giả định rằng lò xo được neo ở gốc và có độ dài nghỉ bằng 0, độ dịch chuyển 100 có nghĩa là hạt sẽ bắt đầu dao động. Mô phỏng thử nghiệm kết thúc khi hạt không chuyển động và gần với điểm gốc.


Một mô tả khác là bạn có thể nghĩ RK4 là một mở rộng taylor cho phương trình vi phân.
RandyGaul

Đây là một câu trả lời tuyệt vời và thực sự phơi bày một số lỗ hổng trong kiến ​​thức vật lý của tôi. Bạn có thể cung cấp một số tài liệu tham khảo đến một nơi khởi đầu tốt để hiểu hệ thống lò xo ẩm là gì, hình xuyến, v.v.? Tôi tin rằng tôi chắc chắn thiếu các cơ học tiên tiến hơn. Câu trả lời của bạn thực sự làm rõ rất nhiều cho tôi, đặc biệt là khi tôi mới bắt đầu vào đa thức Taylor.
Bennett Yeates

Tôi muốn thử ở đây: khanacademy.org/science/physics
jmegaffin

Hoàn hảo, khanacademy là nơi tôi đã nghĩ đến.
Bennett Yeates
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.