سؤال

ولا يوجد أي مثال على تنفيذ الميكانيكا المدارية (يفضل أن يكون في XNA)?مدونة أنا حاليا باستخدام أقل ، ولكن لا "يشعر الحق" عندما ينفذ.الكائن فقط الانحناءات من أي وقت مضى حتى قليلا إلى كوكب الأرض, و لا يهم كم قرص المتغيرات أنا غير قادر على الحصول عليها لدخول المدار ، أو حتى جزئي المدار.

shot.Position += shot.Velocity;  

foreach (Sprite planet in planets)  
{  
  Vector2 directionToPlanet = (planet.Position - shot.Position);  
  directionToPlanet.Normalize();  

  float distance = Vector2.DistanceSquared(shot.Position, planet.Position);  

  float gPull = (float)(planet.gravityStrength * (planet.Mass * shot.Mass) / distance) + planet.gravityField;  
  shot.Position += new Vector2(directionToPlanet.X * gPull, directionToPlanet.Y * gPull);  
} 

تحرير بمناسبة Mendelt الجواب الصحيح مشيرا إلى أن كنت بحاجة إلى تحديث السرعة, لا موقف.أنا أيضا في حاجة إلى تغيير حساب gPull إلى

float gPull = shot.Mass * planet.Mass / distanceSqr * planet.gStr;
هل كانت مفيدة؟

المحلول

في السطر الأخير كنت تقوم بتحديث موقف من النار.يجب أن يكون تحديث السرعة.

قد ترغب في إلقاء نظرة على التعليمات البرمجية في هذا blogpost http://blog.mendeltsiebenga.com/post/Fun-with-planets.aspx لا xna, ولكن العمل الميكانيكا المدارية.(على الرغم من أنني لم تتخلص من الشاشة-وميض)

نصائح أخرى

نيوتن-رافسون التكرار ليست مستقرة طريقة لحل هذه المشكلة (هذا هو أنت لا يمكن الحق في الحصول عليها باستخدام بسيط جدا تكامل من أجل المعادلة التفاضلية).النظر في استخدام الثانية (أو أعلى) من أجل الحل: رونج Kutta هو جيد إلى حد ما سهلة التنفيذ في هذه الحالة.

من وجهة نظر تحليل رقمي مشكلة الميكانيكا المدارية يقلل من حل إلى جانب مجموعة من المعادلات التفاضلية:

x_i'' + G m_i \sum_{i != j} m_j r_ji/(|r_ji|)^3 = 0

حيث x's هي ثلاث ناقلات تمثل مواقف الهيئات ، m's هي الجماهير من نفس الهيئات ، r_ji = x_j - x_i هو متجه التشرد بين الهيئات j و i.

"قفزة ضفدع" طريقة فعالة جدا و مستقر و يعمل بشكل جيد في أي ديناميكية الجسيمات/مجال نظام, بما في ذلك البلازما.الجاذبية ، انها بسيطة.هنا هو كل ما عليك القيام به من أجل التكرار واحد على كوكب واحد (1-الجسم مشكلة واحدة الكوكب حول الشمس ثابتة):

    public void Push()
    {
        Position += Gravity.dT * Velocity;
        Velocity += Gravity.dT * GravityAccelerationVector(Position);
    }

حيث "الثقل.dT" هو موحد الوقت خطوة في تدبير تعسفي من الوقت.أنا باستخدام النظام.يقوم نظام ويندوز.ناقلات ، ولكن أي عرف ناقلات الطبقة فعله طالما أنه يدعم الأساسية الضرب والجمع.الحيلة هي أن موقف والسرعة ليست في "نفس الوقت" ، وهو أمر شائع جدا بالنسبة لمعظم طرق التكامل.بل إنهم متداخلة.موقف على التكرار ن يتم تحديثها على أساس السرعة من التكرار N - 1/2, لكن السرعه في التكرار N+1/2 يتم تحديثها على أساس الموقف في التكرار N.

N-الجسم النسخة تبدو مثل هذا:

    public static void PushPlanets(Planet[] planets)
    {
        // Position Push at iteration N + 0:
        foreach(var p in planets)
            p.Position += Gravity.dT * p.Velocity; // Velocity from N - 1/2

        // Velocity Push at iteration N + 1/2:
        foreach (var p in planets)
        {
            Vector TotalGravity = new Vector(0,0);
            foreach (var pN in planets)
            {
                if (pN == p) continue;
                TotalGravity += pN.Mass * p.Mass * GravityAccelerationVector(p.Position - pN.Position);
            }
            TotalGravity += Sun.Mass * p.Mass * GravityAccelerationVector(p.Position); // Solar acceleration
            p.Velocity += Gravity.dT * TotalGravity;
        }

حيث

    public static Vector GravityAccelerationVector(Vector position)
    {
        return Vector.Multiply(-G / position.LengthSquared / position.Length, position);
    }

N-الجسم هو فقط أكثر تعقيدا لأنه بدلا من واحد الجاذبية المصدر ، وهناك عدة.رمز الشكل هو نفسه:كل كوكب موقف يحصل دفعت N-1/2 السرعة ثم نحسب مجموع تسارع الجاذبية على كل كوكب على أساس الوظائف الجديدة ، ثم ندفع كل كوكب السرعة قبل أن إجمالي التسارع.

أساليب أخرى ، حتى الترتيب العالي الطرق غالبا ما تكون غير مستقرة لأنها خطيا المشروع الخطوة التالية على أساس الموقف و السرعة في نفس الوقت.هذا دائما يخطئ على جانب من إضافة الطاقة إلى النظام مدارات سوف تتحرك تدريجيا أكثر فأكثر إلى الخارج.أساليب أخرى يمكن أن يعوض هذا الخطأ وإزالة الطاقة من النظام.في عام واحد يريد طاقة محايدة الحل.قفزة الضفدع طريقة تدريجيا يخطئ في شروط المرحلة من مدارات ، ولكن ليس في الطاقة عموما.

يمر الكائن لن يدخل المدار.إحدى خصائص المدار هو أنك لن تعود إلى نفس النقطة (نسبة إلى الجسم كونها تدور) مع نفس السرعة.إذا كنت بدأت من فعالية اللانهاية, سوف أعود إلى فعالية ما لا نهاية.

من أجل الدخول في المدار, سوف تحتاج إلى تغيير السرعه في بعض نقطة بطريقة لا علاقة لها الجاذبية ، أو ربما إضافية كبيرة الهيئات.وبالمثل لا يمكنك إطلاق كائن إلى المدار من على سطح الأرض:يجب أن يكون لديك شيء (مثل الماضي الصواريخ حرق) مرة واحدة الأقمار الصناعية تصل إلى الارتفاع المطلوب.وإلا فإنه سوف نحاول العودة إلى نقطة الانطلاق ، الذي هو على السطح.

بعض من أسوأ تصحيح التجارب عندما كان البرنامج جيد و اختبار البيانات أو الحسابات خارج.تأكد من أنك تعرف ما تبحث عنه.

أ) نحن لدينا أي فكرة عما إدخال القيم.

ب) قد ترغب في استخدام تقريب أفضل من نيوتن-رافسون.

ج) تمرير الكائنات لا تندرج عموما في المدار IRL, الجاذبية للغاية ضعيفة ، فإنه يأخذ نفس القدر من ضعف سرعات أو استثنائية حقا الجماهير الحصول على أكثر بكثير من انحناء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top