Mô phỏng quỹ đạo trái đất có tốc độ không chính xác


8

Tôi còn rất mới với lập trình và tôi đã nhận được một bài tập ở trường mà tôi phải tạo ra một mô phỏng quỹ đạo trái đất quanh mặt trời trong p5.js. Chúng tôi đã được cung cấp một cách đơn giản để tính toán lực hấp dẫn nhưng tôi muốn sử dụng công thức thực tế (Fg = G M m / r ^ 2). Trong mã của tôi, một pixel bằng 10 ^ 9 mét hoặc một triệu km. Nếu tôi sử dụng khối lượng thực tế của cả mặt trời và trái đất, cũng như khoảng cách thực tế giữa chúng, tôi phải đặt tốc độ trái đất di chuyển với tốc độ khoảng 1 pixel mỗi giây hoặc một triệu km / giây, xung quanh 30.000 lần tốc độ thực tế của trái đất trên quỹ đạo. Mã của tôi:

x = 550;
y = 400;
vy = -1;
vx = 0;
dt = 1;
sunSize = 80;
planetSize = 10;
// 1 pixel equals 1 million km
canvasSize = 800;
starAmount = 600;

function setup() {
  frameRate(60);
  noStroke()
  solarXY = 0.5 * canvasSize;
  xSun = solarXY;
  ySun = solarXY;
  createCanvas(canvasSize, canvasSize);
  M = 1.989 * pow(10, 30);
  m = 5.972 * pow(10, 24);
  background(0);
  for (i = 0; i < starAmount; i++) {
    starX = Math.random() * canvasSize;
    starY = Math.random() * canvasSize;
    starSize = Math.random() * 3 + 1
    ellipse(starX, starY, starSize, starSize);
  }
  fill(255, 192, 0);
  ellipse(xSun, ySun, sunSize, sunSize);
}

function draw() {
  r = sqrt(sq(xSun - x) + sq(ySun - y)) * pow(10, 9);
  Fg = 6.67 * pow(10, -11) * m * M / sq(r);
  if (x >= xSun) {
    angle = atan((ySun - y) / (x - xSun));
  } else {
    angle = PI + atan((ySun - y) / (x - xSun));
  }
  xOld = x;
  yOld = y;
  Fgx = cos(angle) * Fg
  Fgy = sin(angle) * Fg
  ay = Fgy / m;
  ax = -Fgx / m;
  vy += ay * dt;
  vx += ax * dt;
  y += vy * dt;
  x += vx * dt;
  fill(30);
  ellipse(xOld, yOld, planetSize, planetSize);
  fill(0, 0, 192);
  ellipse(x, y, planetSize, planetSize);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.0.0/p5.min.js"></script>

Bạn có biết nguyên nhân có thể là gì? Cảm ơn trước.


2
Tôi chưa hoàn toàn hiểu mã, nhưng có vẻ như bạn đang trộn lẫn hai mô hình tính toán vị trí của trái đất. Mô hình Kepler giả định quỹ đạo là một hình elip và tính toán vị trí từ các tham số quỹ đạo, trong khi mô hình Newton chỉ xử lý các lực và quỹ đạo hình elip là kết quả của điều đó. Cụ thể, bạn tính toán lực hấp dẫn giữa hai cơ thể nhưng sau đó "chuyển hướng" lực dọc theo hình elip. Bạn có thể chuyển sang mô hình Newton một mình, nhưng điều đó sẽ tự mang đến một số vấn đề. Coi chừng chạy vào các vấn đề chính xác với số lượng lớn / nhỏ.
Etienne Ott

Etienne Ott, tôi không thực sự hiểu ý của bạn là gì. Theo như tôi biết thì lực hấp dẫn có thể được chia thành một thành phần x và ay dựa trên góc của nó với tâm khối lượng. Tôi không chắc đây có phải ý bạn không, vì tôi không chắc sự khác biệt giữa mô hình Kepler và mô hình Newton là gì, vậy bạn có thể mô tả thêm một chút không?
Gijsfwb

Có vẻ như tôi đã hiểu nhầm mã của bạn. Khi làm việc với các lực lượng, tôi thường không bận tâm đến các góc để phân chia lực lượng thành các thành phần của chúng. Việc tính toán vectơ đơn vị (có độ dài 1) dễ dàng hơn theo hướng của lực, sau đó nhân với vô hướng xác định cường độ của lực. Dù sao, mã dường như làm đúng ở đó, vì vậy hãy bỏ qua điều đó. Điều tôi đang thắc mắc bây giờ là các đơn vị của các biến. Ví dụ: dấu thời gian của bạn là 1, nhưng chuyển động có vẻ nhanh hơn so với tiến bộ mô phỏng thêm 1 giây mỗi cuộc gọi. Có lẽ 1 không có nghĩa là 1 giây.
Etienne Ott

Điều tiếp theo tôi muốn là viết các đơn vị xuống và mang chúng qua các phép tính khác nhau để xem các đơn vị thực tế của, nói, vận tốc là gì. Một điều nữa là dấu thời gian đã được sửa, nhưng không rõ mức độ thường xuyên của thời gian được gọi trong một giây thời gian thực nên cũng không rõ thời gian (có nghĩa là bao nhiêu cuộc gọi) mô phỏng sẽ hoàn thành một năm trong khung thời gian mong muốn. Bạn có thể thực hiện mô phỏng theo thời gian thực, nhưng tôi không nghĩ rằng việc nhìn thấy một cuộc cách mạng mỗi năm là rất thú vị. ;)
Etienne Ott

dt tính bằng giây trên mỗi khung hình và tôi khá chắc chắn điều đó đúng, vì tất cả các đơn vị trong tính toán của tôi đều sử dụng giây. Tôi sẽ cố gắng xem tốc độ làm gì và khi nào, nhưng với tôi có vẻ như nó giữ tốc độ ít nhiều giống nhau trên toàn bộ quỹ đạo
Gijsfwb

Câu trả lời:


4

Bạn dường như có gia tốc tính bằng mét trên giây 2 và vận tốc tính bằng pixel trên giây. Sau đó, bạn kết hợp chúng:

vy += ay * dt;
vx += ax * dt;

Gia tốc trọng lực của bạn là một tỷ lần quá mạnh. Vì vậy, hành tinh của bạn phải di chuyển nhanh hơn khoảng 31.623 lần so với bình thường để giữ quỹ đạo tròn.


Điều này đã làm việc! Cảm ơn rất nhiều!
Gijsfwb
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.