Con mèo sẽ đi đâu? (cơ học quỹ đạo)


16

Một con mèo gần như không có khối lượng được thả trong không gian (đừng lo lắng, với bộ đồ không gian và mọi thứ) tại điểm (x, y, z)với vận tốc (vx, vy, vz). Có một hành tinh cố định, vô cùng dày đặc (có thể tích bằng 0) tại điểm (0, 0, 0)và nó thu hút các vật thể ở khoảng cách rvới gia tốc 1/r^2. Theo lực hấp dẫn của Newton, vật thể đi đâu sau thời gian t?

Gần như không có khối lượng trong trường hợp này có nghĩa là bạn đang xuất ra giá trị của lim (mass --> 0) <position of cat>. Khối lượng bị ảnh hưởng bởi trọng lực của hành tinh, nhưng hành tinh không bị ảnh hưởng bởi trọng lực của mèo. Nói cách khác, cơ thể trung tâm là cố định.

Điều này hơi giống với Code Golf: Số phận của tàu vũ trụ là gì? [phiên bản dấu phẩy động] , nhưng điều này khác bởi vì nó đang đo độ chính xác.

Bạn có thể triển khai giải pháp dựa trên mô phỏng, phải chạy trong vòng chưa đầy 3 giây, HOẶC bạn có thể thực hiện chương trình cung cấp giá trị chính xác (cũng phải chạy trong chưa đầy 3 giây). Xem chi tiết ghi bàn dưới đây. Nếu bạn thực hiện một mô phỏng, nó không phải chính xác, nhưng điểm của bạn sẽ thấp hơn vì không chính xác.

Đầu vào : x y z vx vy vz t, không nhất thiết là các số nguyên biểu thị tọa độ x, y, z, vận tốc theo các hướng x, y và z tương ứng. Nó được đảm bảo rằng tốc độ của con mèo hoàn toàn thấp hơn tốc độ thoát ở độ cao đó. Đầu vào có thể được lấy từ bất cứ đâu, bao gồm các tham số cho một chức năng. Chương trình phải chạy trong chưa đầy ba giây trên máy tính xách tay của tôi t < 2^30, điều đó có nghĩa là, nếu bạn đang chạy một mô phỏng, bạn phải điều chỉnh dấu thời gian của mình cho phù hợp. Nếu bạn dự định đạt giới hạn 3 giây cho mọi trường hợp thử nghiệm, hãy đảm bảo có một tham số có thể điều chỉnh có thể làm cho nó chính xác hơn / kém chính xác hơn để tăng tốc độ, để tôi có thể làm cho nó chạy trong ba giây trên máy tính của mình.

Đầu ra : x y z, vị trí sau thời gian t.

Vì vấn đề hai cơ thể có thể được giải quyết một cách hoàn hảo, theo lý thuyết là có thể có được một câu trả lời hoàn hảo, chính xác.

Chấm điểm : Đối với mọi trường hợp kiểm tra, lỗi được xác định là khoảng cách giữa đầu ra của bạn và đầu ra "đúng". Đầu ra thực được định nghĩa là đầu ra mà đoạn trích trường hợp thử nghiệm tạo ra. Nếu sai số nhỏ hơn 10^(-8), lỗi được làm tròn xuống không. Điểm của bạn là lỗi trung bình trên 100 (hoặc nhiều hơn) các trường hợp kiểm tra ngẫu nhiên. Nếu bạn viết một câu trả lời hoàn toàn chính xác, bạn sẽ nhận được điểm 0; Điểm số thấp nhất sẽ thắng và mối quan hệ sẽ bị phá vỡ bởi độ dài mã.

Các trường hợp thử nghiệm :

1 0 0 0 -1 0 1000000000 --> 0.83789 -0.54584 0

Trong trường hợp này, quỹ đạo có hình tròn hoàn hảo với chu kỳ 2 * pi, do đó, sau khi quay vòng 159154943 lần, con mèo kết thúc ở khoảng (0,83789, -0,54584). Đây không phải là trường hợp thử nghiệm mà mã của bạn sẽ được kiểm tra; tuy nhiên, nếu bạn gửi một câu trả lời hoàn toàn chính xác, bạn có thể muốn kiểm tra nó trên này.

Đoạn mã dưới đây tạo ra các trường hợp thử nghiệm bổ sung ngẫu nhiên và sẽ được sử dụng để đánh giá bài nộp; cho tôi biết nếu có lỗi với điều này:


Là thời gian tcho trong vài giây? Nếu vậy, vận tốc sẽ được tính theo đơn vị mỗi giây, hoặc một cái gì đó nhỏ hơn?
R. Kap

@R. Không thành vấn đề. tđược đưa ra trong đơn vị thời gian, bất kể đó là gì, và vận tốc sẽ sử dụng cùng một đơn vị. Cho dù đó là trong vài giây hoặc giờ, câu trả lời sẽ giống nhau.
soktinpk

nearly massless catChà, khối lượng chính xác của con mèo sẽ là bao nhiêu? Chúng ta có nên sử dụng 0như một giá trị cho khối lượng của con mèo này?
R. Kap

@R. Có Nhưng nó vẫn bị ảnh hưởng bởi trọng lực (thông thường, Newton đã không coi các vật thể không có khối lượng bị ảnh hưởng bởi trọng lực). Vì vậy, chúng ta nên xem xét nó có khối lượng nhỏ tùy ý và câu trả lời của bạn thực sự là vị trí khi khối lượng của con mèo về không. Điểm chính là bản thân hành tinh không bị ảnh hưởng bởi con mèo.
soktinpk

2
@soktinpk có thể dễ dàng hơn khi chỉ nói rõ ràng rằng cơ thể trung tâm là cố định.
Maltysen

Câu trả lời:


6

Python 3.5 + NumPy, chính xác, 186 byte

from math import*
def o(r,v,t):
 d=(r@r)**.5;W=2/d-v@v;U=W**1.5;b=[0,t*U+9]
 while 1:
  a=sum(b)/2;x=1-cos(a);y=sin(a)/U;k=r@v*x/W+d*y*W
  if a in b:return k*v-r*x/W/d+r
  b[k+a/U-y>t]=a

Đây là một giải pháp chính xác, sử dụng một công thức tôi thiết kế dựa trên Jesper Göranssonhis, Symmetries của vấn đề Kepler, năm 2015 . Nó sử dụng tìm kiếm nhị phân để giải phương trình siêu việt Ax + B cos x + C sin x = D, không có giải pháp dạng đóng.

Hàm dự kiến ​​vị trí và vận tốc sẽ được truyền vào dưới dạng mảng NumPy:

>>> from numpy import array
>>> o(array([1,0,0]),array([0,-1,0]),1000000000)
array([ 0.83788718, -0.54584345,  0.        ])
>>> o(array([-1.1740058273269156,8.413493259550673,0.41996042044140003]),array([0.150014367067652,-0.09438816345868332,0.37294941703455975]),7999.348650387233)
array([-4.45269544,  6.93224929, -9.27292488])

Làm gì @?
R. Kap

1
Đây là một toán tử mới trong Python 3.5 mà NumPy quá tải cho numpy.dot(phép nhân sản phẩm / ma trận điểm). Xem PEP 465.
Anders Kaseorg

Thật tuyệt khi chơi gôn, nhưng đây là một thử thách về mã, bạn có thể làm cho nó rõ ràng hơn một chút không, tôi đã thực hiện một số thao tác trong Python và có thể tính toán sự bất thường, theta, độ lệch tâm, thời gian, v.v. dấu hiệu của theta và xác định phép quay từ mặt phẳng tham chiếu xy sang không gian 3d. Tuy nhiên, đây là công cụ thực sự tuyệt vời
dặm

@miles Vì các mối quan hệ bị phá vỡ bởi độ dài mã, nên có ý nghĩa cho việc này được đánh gôn.
Mego

Đó là sự thật, như tôi đã làm việc trên một giải pháp chính xác quá, kể từ khi phát test chỉ tạo ra quỹ đạo hình elip
dặm

2

Javascript

Đây chỉ là để có được quả bóng lăn, vì dường như không ai được đăng câu trả lời. Đây là một cách rất ngây thơ, đơn giản có thể được cải thiện rất nhiều:

function simulate(x, y, z, vx, vy, vz, t) {
  var loops = 1884955; // tune this parameter
  var timestep = t / loops;
  for (var i = 0; i < t; i += timestep) {
    var distanceSq = x*x + y*y + z*z; // distance squared from origin
    var distance = Math.sqrt(distanceSq);
    var forceMag = 1/distanceSq; // get the force of gravity
    var forceX = -x / distance * forceMag;
    var forceY = -y / distance * forceMag;
    var forceZ = -z / distance * forceMag;
    vx += forceX * timestep;
    vy += forceY * timestep;
    vz += forceZ * timestep;
    x += vx * timestep;
    y += vy * timestep;
    z += vz * timestep;
  }
  return [x, y, z];
}

Kiểm tra:

simulate(1, 0, 0, 0, -1, 0, Math.PI*2) --> [0.9999999999889703, -0.0000033332840909716455, 0]

Này, đó là khá tốt. Nó có lỗi khoảng 3.333 * 10 ^ (- 6) không đủ để làm tròn xuống ... nó gần.

Chỉ để cho vui:

console.log(simulate(1, 0, 0, 0, -1, 0, 1000000000))
--> [-530516643639.4616, -1000000000.0066016, 0]

Ồ tốt; vì vậy nó không phải là tốt nhất

Và trên một trường hợp thử nghiệm ngẫu nhiên từ máy phát điện:

simulate(-1.1740058273269156,8.413493259550673,0.41996042044140003,0.150014367067652,-0.09438816345868332,0.37294941703455975,7999.348650387233)
-->    [-4.528366392498373, 6.780385554803544, -9.547824236472668]
Actual:[-4.452695438880813, 6.932249293597744, -9.272924876103785]

Với một lỗi chỉ khoảng 0,32305!

Điều này có thể được cải thiện rất nhiều bằng cách sử dụng một cái gì đó như tích hợp Verlet hoặc một số thuật toán ưa thích. Trên thực tế, những thuật toán đó thậm chí có thể đạt được điểm hoàn hảo, mặc dù là mô phỏng.

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.