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.