Tôi đang cố gắng tạo mô phỏng đơn giản về sóng 1 chiều với một chuỗi các bộ dao động điều hòa. Các phương trình vi phân cho vị trí x[i]
của dao động thứ i (giả định trạng thái cân bằng tại x[i]=0
) hóa ra là - theo sách giáo khoa - một trong những điều này:Cố gắng mô phỏng sóng 1 chiều
m*x[i]''=-k(2*x[i]-x[i-1]-x[i+1])
(đạo hàm được WRT các thời gian) vì vậy tôi đã cố gắng tính toán động lực bằng thuật toán sau đây. Dưới đây osc[i]
là dao động thứ i như một đối tượng với các thuộc tính loc
(tuyệt đối vị trí), vel
(vận tốc), acc
(tăng tốc) và bloc
(cân bằng vị trí), dt
là tăng thời gian:
for every i:
osc[i].vel+=dt*osc[i].acc;
osc[i].loc+=dt*osc[i].vel;
osc[i].vel*=0.99;
osc[i].acc=-k*2*(osc[i].loc-osc[i].bloc);
if(i!=0){
osc[i].acc+=+k*(osc[i-1].loc-osc[i-1].bloc);
}
if(i!=N-1){
osc[i].acc+=+k*(osc[i+1].loc-osc[i+1].bloc);
}
Bạn có thể xem thuật toán trong hành động here, chỉ cần nhấp để đưa xung vào bộ dao động thứ 6. Bạn có thể thấy rằng không chỉ nó không tạo ra một làn sóng nào cả, nhưng nó cũng tạo ra một chuyển động với tổng năng lượng ngày càng tăng (thậm chí nếu tôi thêm sự giảm chấn!). Tôi đang làm gì sai?
Imlemented 2nd order Runge-Kutta và nó có vẻ là tốt nhất ngay cả với rất thấp dampt và cao dt. Kết quả có thể được nhìn thấy [ở đây] (http://pokipsy.0fees.net/sandbox.html). Cảm ơn bạn rất nhiều cho bạn và cho những người khác trả lời. –