แมวจะไปไหน (กลศาสตร์วงโคจร)


16

แมวเกือบเยอะจะลดลงในพื้นที่ (ไม่ต้องกังวลกับชุดอวกาศและทุกอย่าง) ที่จุดด้วยความเร็ว(x, y, z) (vx, vy, vz)มีการคงเพียบหนาแน่นดาวเคราะห์ (กับปริมาณของ 0) ที่จุด(0, 0, 0)และจะดึงดูดวัตถุในระยะไกลด้วยความเร่งr 1/r^2ตามแรงโน้มถ่วงของนิวตันวัตถุจะไปหลังเวลาtไหน?

lim (mass --> 0) <position of cat>เกือบเยอะในกรณีนี้หมายความว่าคุณจะแสดงผลค่าของ มวลได้รับผลกระทบจากแรงโน้มถ่วงของโลก แต่ดาวเคราะห์ไม่ได้รับผลกระทบจากแรงโน้มถ่วงของแมว กล่าวอีกนัยหนึ่งศูนย์กลางของร่างกายได้รับการแก้ไข

นี่คล้ายกับCode Golf: ชะตากรรมของยานอวกาศคืออะไร? [รุ่นจุดลอยตัว]แต่นี่แตกต่างเพราะมันเป็นการวัดความแม่นยำ

คุณอาจใช้โซลูชันตามการจำลองซึ่งต้องทำงานในเวลาน้อยกว่า 3 วินาทีหรือคุณอาจใช้โปรแกรมที่ให้ค่าที่แน่นอน (ต้องทำงานในเวลาน้อยกว่า 3 วินาที) ดูรายละเอียดการให้คะแนนด้านล่าง หากคุณใช้แบบจำลองมันไม่จำเป็นต้องเหมือนกัน แต่คะแนนของคุณจะต่ำกว่าเนื่องจากความไม่ถูกต้อง

อินพุต : x y z vx vy vz tไม่จำเป็นต้องเป็นจำนวนเต็มที่แทน x, y, z พิกัดความเร็วในทิศทาง x และ y, y และ z ตามลำดับ มีการรับประกันว่าความเร็วของแมวนั้นน้อยกว่าความเร็วการหลบหนีที่ระดับความสูงนั้นอย่างเคร่งครัด อินพุตอาจถูกนำมาจากที่ใดก็ได้รวมถึงพารามิเตอร์ของฟังก์ชัน โปรแกรมต้องทำงานในเวลาน้อยกว่าสามวินาทีบนแล็ปท็อปของฉันt < 2^30ซึ่งหมายความว่าหากคุณใช้การจำลองคุณต้องปรับการประทับเวลาตามนั้น หากคุณวางแผนที่จะกดปุ่มขีด จำกัด 3 วินาทีสำหรับทุกกรณีทดสอบตรวจสอบให้แน่ใจว่ามีพารามิเตอร์ที่ปรับแต่งได้ที่สามารถทำให้แม่นยำยิ่งขึ้น / น้อยลงสำหรับการเพิ่มความเร็วเพื่อให้ฉันสามารถทำงานได้ในสามวินาทีบนคอมพิวเตอร์ของฉัน

เอาท์พุท : ตำแหน่งหลังจากเวลาx y zt

เนื่องจากปัญหาสองตัวสามารถแก้ไขได้อย่างสมบูรณ์แบบดังนั้นในทางทฤษฎีจึงเป็นไปได้ที่จะได้คำตอบที่สมบูรณ์แบบและถูกต้อง

การให้คะแนน : สำหรับกรณีทดสอบข้อผิดพลาดถูกกำหนดให้เป็นระยะห่างระหว่างเอาต์พุตของคุณและเอาต์พุต "จริง" เอาต์พุตจริงถูกกำหนดให้เป็นสิ่งที่ข้อมูลโค้ดกรณีทดสอบสร้างขึ้น หากข้อผิดพลาดน้อยกว่า10^(-8)ข้อผิดพลาดจะถูกปัดเศษเป็นศูนย์ คะแนนของคุณเป็นข้อผิดพลาดโดยเฉลี่ยในกรณีทดสอบสุ่ม 100 (หรือมากกว่า) หากคุณเขียนคำตอบที่ถูกต้องสมบูรณ์แบบคุณควรได้คะแนน 0 คะแนนต่ำสุดชนะและความสัมพันธ์จะถูกทำลายโดยความยาวรหัส

กรณีทดสอบ :

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

ในกรณีนี้วงโคจรเป็นวงกลมอย่างสมบูรณ์แบบด้วยระยะเวลา 2 * pi ดังนั้นหลังจากวงรอบ 159154943 ครั้งแมวก็จบลงที่ประมาณ (0.83789, -0.54584) นี่ไม่ใช่กรณีทดสอบรหัสของคุณจะถูกทดสอบ อย่างไรก็ตามหากคุณส่งคำตอบที่ถูกต้องสมบูรณ์แบบคุณอาจต้องการทดสอบคำตอบนี้

ตัวอย่างด้านล่างสร้างกรณีทดสอบเพิ่มเติมแบบสุ่มและจะใช้ในการตัดสินการส่ง แจ้งให้เราทราบหากมีข้อผิดพลาดกับสิ่งนี้:


tกำหนดเวลาเป็นวินาทีหรือไม่? ถ้าเป็นเช่นนั้นความเร็วจะได้รับในหน่วยต่อวินาทีหรืออะไรที่เล็กกว่านี้?
R. Kap

@R Kap มันไม่สำคัญ tมีให้ในหน่วยเวลาไม่ว่าจะเป็นอะไรและความเร็วจะใช้หน่วยเดียวกัน ไม่ว่าจะเป็นในไม่กี่วินาทีหรือชั่วโมงคำตอบจะเหมือนกัน
soktinpk

nearly massless catทีนี้มวลของแมวที่แน่นอนจะเป็นเท่าไหร่? เราควรใช้0เป็นค่าสำหรับมวลของแมวตัวนี้หรือไม่?
R. Kap

@R แคปใช่ แต่มันก็ยังได้รับผลกระทบจากแรงโน้มถ่วง (โดยปกติแล้วนิวตันไม่ได้พิจารณาวัตถุที่ไม่มีมวลที่จะได้รับผลกระทบจากแรงโน้มถ่วง) ดังนั้นเราควรพิจารณาให้มีมวลขนาดเล็กโดยพลการและคำตอบของคุณคือตำแหน่งในขณะที่มวลของแมวไปถึงศูนย์ ประเด็นหลักก็คือว่าตัวแมวเองไม่ได้รับผลกระทบเลยแม้แต่น้อย
soktinpk

2
@soktinpk มันอาจจะง่ายกว่าที่จะพูดอย่างชัดเจนว่าเนื้อหาส่วนกลางได้รับการแก้ไขแล้ว
Maltysen

คำตอบ:


6

Python 3.5 + NumPy, แน่นอน, 186 ไบต์

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

นี้เป็นทางออกที่แน่นอนโดยใช้สูตรผมออกแบบมาบนพื้นฐานของJesper Göranssonhis“Symmetries ของปัญหาที่เคปเลอร์” 2015 มันใช้การค้นหาแบบไบนารีเพื่อแก้สมการยอดเยี่ยม Ax + B cos x + C sin x = D ซึ่งไม่มีวิธีแก้ปัญหาแบบปิด

ฟังก์ชันคาดว่าตำแหน่งและความเร็วจะถูกส่งผ่านเป็นอาร์เรย์ 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])

อะไร@ทำอย่างไร
R. Kap

1
เป็นตัวดำเนินการใหม่ใน Python 3.5 ที่ NumPy โอเวอร์โหลดสำหรับnumpy.dot(การคูณผลิตภัณฑ์ดอท / เมทริกซ์) ดู PEP 465.
Anders Kaseorg

เป็นเรื่องที่ยอดเยี่ยมมากที่ได้เล่นกอล์ฟ แต่นี่เป็นความท้าทายของรหัสคุณช่วยให้ชัดเจนขึ้นได้ไหมฉันได้ทำการลบบางส่วนใน Python เสร็จแล้วและสามารถคำนวณความผิดปกติ, ทีต้า, ประหลาด, ระยะเวลา ฯลฯ แต่ฉันติดอยู่กับการพิจารณา เครื่องหมายของ theta และพิจารณาการหมุนจากระนาบอ้างอิง xy ไปยังพื้นที่ 3d ถึงกระนั้นนี่ก็เป็นสิ่งที่ยอดเยี่ยมจริงๆ
ไมล์

@miles เนื่องจากความสัมพันธ์ถูกทำลายโดยความยาวของรหัสจึงเหมาะสมสำหรับการเล่นกอล์ฟ
Mego

นั่นเป็นความจริงในขณะที่ฉันกำลังทำงานกับวิธีแก้ปัญหาที่ถูกต้องเช่นกันเนื่องจากตัวสร้างเคสทดสอบสร้างวงโคจรรูปวงรีเท่านั้น
ไมล์

2

จาวาสคริ

นี่เป็นเพียงการทำให้ลูกบอลกลิ้งเนื่องจากไม่มีใครโพสต์คำตอบ นี่เป็นวิธีที่ง่ายและไร้เดียงสาที่สามารถปรับปรุงได้มากมาย:

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];
}

การทดสอบ:

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

เฮ้มันค่อนข้างดี มันมีข้อผิดพลาดประมาณ 3.333 * 10 ^ (- 6) ซึ่งไม่เพียงพอที่จะปัดเศษลง ... มันปิด

แค่เล่น ๆ:

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

โอ้สบายดี ดังนั้นมันจึงไม่ดีที่สุด

และในกรณีทดสอบแบบสุ่มจากเครื่องกำเนิด:

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]

ด้วยข้อผิดพลาดเพียงประมาณ 0.32305!

สิ่งนี้สามารถปรับปรุงได้มากมายโดยใช้บางอย่างเช่นการรวม Verlet หรืออัลกอริทึมแฟนซี ในความเป็นจริงอัลกอริทึมเหล่านั้นอาจได้รับคะแนนสมบูรณ์แบบแม้จะเป็นแบบจำลอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.