বিড়াল কোথায় যাবে? (অরবিটাল মেকানিক্স)


16

একটি প্রায় ভর বিহীন বিড়ালকে স্পেসে ফেলে দেওয়া হবে (উদ্বেগ করবেন না, একটি স্পেস স্যুট এবং সমস্ত কিছু দিয়ে) (x, y, z)গতিবেগের সাথে (vx, vy, vz)। বিন্দুতে একটি স্থির, অসীম ঘন গ্রহ রয়েছে (০ এর আয়তন সহ) (0, 0, 0)এবং এটি rত্বরণের সাথে দূরত্বে বস্তুগুলিকে আকর্ষণ করে 1/r^2। নিউটোনীয় মাধ্যাকর্ষণ অনুসারে, বস্তুটি সময়ের পরে কোথায় যায় t?

এই ক্ষেত্রে প্রায় ভরবিহীন অর্থ হল আপনি এর মান আউটপুট করছেন lim (mass --> 0) <position of cat>। ভর গ্রহের মাধ্যাকর্ষণ দ্বারা প্রভাবিত হয়, কিন্তু গ্রহটি বিড়ালের মাধ্যাকর্ষণ দ্বারা প্রভাবিত হয় না। অন্য কথায়, কেন্দ্রীয় সংস্থা স্থির হয়।

কোড গল্ফের সাথে এটি কিছুটা মিল : স্পেসশিপের ভাগ্য কী? [ভাসমান পয়েন্ট সংস্করণ] , তবে এটি আলাদা কারণ এটি যথার্থতা পরিমাপ করছে।

আপনি সিমুলেশন ভিত্তিক একটি সমাধান কার্যকর করতে পারেন, যা অবশ্যই 3 সেকেন্ডেরও কম সময়ে চলতে পারে, বা আপনি এমন কোনও প্রোগ্রাম বাস্তবায়ন করতে পারেন যা একটি সঠিক মান দেয় (এটি অবশ্যই 3 সেকেন্ডেরও কম সময়ে চালাতে হবে)। নীচে স্কোরিং বিবরণ দেখুন। আপনি যদি কোনও সিমুলেশন বাস্তবায়ন করেন তবে এটি সঠিক হতে হবে না তবে আপনার স্কোরটি ত্রুটির কারণে কম হবে।

ইনপুট : x y z vx vy vz tঅগত্যা যথাক্রমে X, Y, Z স্থানাঙ্ক, বেগ X, Y, ও টু Z নির্দেশ ও সময় প্রতিনিধিত্বমূলক পূর্ণসংখ্যার। এটি গ্যারান্টিযুক্ত যে বিড়ালের গতি সেই উচ্চতায় পালানোর গতির চেয়ে কঠোরভাবে কম। ইনপুট কোনও ফাংশনে প্যারামিটার সহ যে কোনও জায়গা থেকে নেওয়া যেতে পারে। প্রোগ্রামটি অবশ্যই আমার ল্যাপটপে তিন সেকেন্ডেরও কম সময়ে চলতে হবে t < 2^30যার অর্থ, যদি আপনি কোনও সিমুলেশন চালাচ্ছেন তবে আপনাকে অবশ্যই আপনার টাইমস্টেপটি সেই অনুযায়ী সামঞ্জস্য করতে হবে। আপনি যদি প্রতিটি পরীক্ষার ক্ষেত্রে 3 সেকেন্ডের সীমাটি হিট করার পরিকল্পনা করে থাকেন তবে নিশ্চিত হন যে এমন একটি টিউনিয়েবল প্যারামিটার রয়েছে যা এটি আরও সঠিক / গতি লাভের জন্য কম নির্ভুল করে তুলতে পারে, যাতে আমি এটি আমার কম্পিউটারে তিন সেকেন্ডের মধ্যে চালাতে পারি।

আউটপুট : x y z, সময় পর অবস্থান t

যেহেতু দ্বি-দেহের সমস্যাটি নিখুঁতভাবে সমাধান করা যায়, তাত্ত্বিকভাবে একটি নিখুঁত, সঠিক উত্তর পাওয়া সম্ভব।

স্কোরিং : যে কোনও পরীক্ষার ক্ষেত্রে ত্রুটিটিকে আপনার আউটপুট এবং "সত্য" আউটপুটের মধ্যে দূরত্ব হিসাবে সংজ্ঞায়িত করা হয়। আসল আউটপুটটিকে টেস্ট কেস স্নিপেট তৈরি করে বলে সংজ্ঞায়িত করা হয়। ত্রুটিটি যদি এর চেয়ে কম হয় 10^(-8)তবে ত্রুটিটি শূন্যের নীচে হয়। আপনার স্কোরটি 100 (বা আরও) র্যান্ডম পরীক্ষার ক্ষেত্রে গড় ত্রুটি। আপনি যদি সঠিকভাবে সঠিক উত্তর লিখেন তবে আপনার 0 নম্বর পাওয়া উচিত; সর্বনিম্ন স্কোর জয়, এবং সংযোগ কোড দৈর্ঘ্য দ্বারা বিভক্ত হবে।

পরীক্ষার কেস :

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

এই ক্ষেত্রে, কক্ষপথ 2 * পিআই পিরিয়ডের সাথে পুরোপুরি বিজ্ঞপ্তিযুক্ত, সুতরাং 159154943 বার চক্কর দেওয়ার পরে, বিড়ালটি প্রায় শেষ হয় (0.83789, -0.54584)। এটি কোনও পরীক্ষার ক্ষেত্রে নয় যা আপনার কোডে পরীক্ষা করা হবে; আপনি যদি সঠিকভাবে সঠিক উত্তর জমা দেন তবে আপনি এটি এটি পরীক্ষা করতে চাইতে পারেন।

নীচে স্নিপেট এলোমেলো অতিরিক্ত পরীক্ষার কেস উত্পন্ন করে এবং সাবমিশনের বিচার করতে ব্যবহৃত হবে; এটির সাথে যদি কোনও বাগ থাকে তবে আমাকে জানান:


সময় কি tসেকেন্ডে দেওয়া হয়? যদি তা হয়, তবে গতিটি প্রতি সেকেন্ডে ইউনিট দেওয়া হত, বা আরও ছোট কিছু?
আর কাপ,

@R। কাপ এটা কোন ব্যাপার না। tইউনিট সময়ে দেওয়া হয়, যা কিছু হোক না কেন এবং বেগ একই ইউনিট ব্যবহার করবে। এটি সেকেন্ডে বা ঘন্টার মধ্যেই হোক, উত্তরটি একই হবে।
soktinpk

nearly massless catআচ্ছা, বিড়ালের সঠিক ভর কী হবে? আমাদের কি 0এই বিড়ালের ভরটির জন্য মূল্য হিসাবে ব্যবহার করা উচিত ?
আর কাপ,

@R। হ্যাঁ কাপুন তবে এটি এখনও মহাকর্ষ দ্বারা প্রভাবিত হয়েছে (সাধারণত, নিউটন কোনও ভর সহ বস্তুকে মহাকর্ষ দ্বারা প্রভাবিত বলে বিবেচনা করেননি)। সুতরাং আমাদের এটিকে নির্বিচারে ছোট ছোট ভর হিসাবে বিবেচনা করা উচিত এবং বিড়ালের ভর শূন্যে চলে যাওয়ার সাথে সাথে আপনার উত্তরটি আসলে অবস্থান। মূল কথাটি হ'ল গ্রহটি নিজেই বিড়ালের দ্বারা প্রভাবিত হয় না।
soktinpk

2
@ soktinpk সহজেই পরিষ্কারভাবে বলা বাহুল্য যে কেন্দ্রীয় সংস্থা স্থির রয়েছে।
মাল্টেসেন

উত্তর:


6

পাইথন 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

এটি হুবুহু সমাধান, জেস্পার গুরানসোনিস, "কেপলার সমস্যার প্রতিসাম্য", ২০১৫ ভিত্তিতে ইঞ্জিনিয়ার করা একটি সূত্র ব্যবহার করে । এটি ট্রান্সসেন্টেন্টাল সমীকরণ 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])

কি করে @?
আর কাপ,

1
এটি পাইথন 3.5 তে একটি নতুন অপারেটর যা নম্পপি ওভারলোড numpy.dot(ডট পণ্য / ম্যাট্রিক্স গুণ)। PEP 465. দেখুন
অ্যান্ডার্স Kaseorg

এটি দুর্দান্ত যে এটি গল্ফড, তবে এটি কোড-চ্যালেঞ্জ, আপনি কি এটি আরও কিছুটা পরিষ্কার করে দিতে পারেন, পাইথনে আমার কিছু স্ক্র্যাচকর্ম হয়েছিল, এবং বিচ্ছিন্নতা, থিটা, উদ্দীপনা, সময়কাল ইত্যাদি গণনা করতে পারি, তবে আমি নির্ধারণে আটকে আছি থাইটির চিহ্ন এবং এক্স ওয়্যার রেফারেন্স প্লেন থেকে 3 ডি স্পেসে আবর্তন নির্ধারণ করা। তবুও, এটি সত্যিই দুর্দান্ত জিনিস
4

@ মাইলস যেহেতু কোডগুলির দৈর্ঘ্য দ্বারা বন্ধনগুলি ভেঙে গেছে, তাই এটি গল্ফ করা বোধগম্য।
মেগো

এটি সত্য, যেমন আমিও একটি সঠিক সমাধান নিয়ে কাজ করছিলাম, যেহেতু পরীক্ষার কেস জেনারেটর কেবল উপবৃত্তাকার কক্ষপথ তৈরি করে
মাইল মাইল

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 এর ত্রুটি সহ!

ভারলেট ইন্টিগ্রেশন বা কিছু অভিনব অ্যালগরিদমের মতো কিছু ব্যবহার করে এটি অনেক উন্নত হতে পারে। আসলে, সেই অ্যালগরিদমগুলি সিমুলেশন থাকা সত্ত্বেও নিখুঁত স্কোর পেতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.