باستخدام حل المعادلة التفاضلية في أوامر مؤامرة منفصلة في الرياضيات

StackOverflow https://stackoverflow.com/questions/1327789

سؤال

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

{Plot[x[t], {t, 0, 10}], x[4]} 
/. NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}]

إنه يحل المعادلة وحساب × [4] دون أي مشكلة، لكن المؤامرة تتحول إلى فارغة، وليس لدي أي فكرة لماذا.

في مشكلتي الفعلية، معادتي هي نظام معقد للغاية لعدة وظائف، وبدلا من ذلك س [4 أرسم مؤامرة حديثة من المهام المحال. أنا أعتزم في النهاية أن أدرج كل هذا في معالجة بيان لذلك أنا لا أريد ndsolve. بيان لتظهر أكثر من مرة (يستغرق وقتا طويلا) ولا يمكنني حسابه مسبقا (لأنه يحتوي على الكثير من المعلمات).


تحرير: أود أن أوضح وتوسيع سؤالي: ما أريد فعلا القيام به هو تضمين بيان التخطيط الخاص بي في معالجة بيان بالطريقة التالية:

Manipulate[{Plot[x[t], {t, 0, 10}], x[4]} 
/. NDSolve[{x'[s] == - a*x[s], x[0] == 1}, x, {s, 0, 10}]
,{{a,1},0,5}]

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

آسف إذا لم يكن واضحا من قبل.

هل كانت مفيدة؟

المحلول

مشكلتك هي أن المؤامرة [] هل بعض الأشياء المضحكة لجعل تخطيط أكثر ملاءمة، وواحدة من الأشياء التي لا تتصدى لها الأشياء التي لا يمكنها تقييمها عديا. لذلك في التعبير الذي نشرته،

Plot[x[t], {t, 0, 10}]

فقط يذهب إلى الأمام وتقيم قبل القيام بديل القاعدة مع الحل من NSSLOVE، وإنتاج كائن رسومات من مؤامرة فارغة. يحتوي كائن الرسومات على أي إشارة إلى x، لذلك لا يوجد شيء لاستبداله.

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

sol = NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}];
{Plot[Evaluate[x[t] /. sol], {t, 0, 10}], x[4] /. sol} 

التقييم [] في المؤامرة تتأكد من أن الرياضيات لا يحل محل الاستبدال مرة واحدة، بدلا من مرة واحدة لكل نقطة مؤامرة. ليس من المهم استبدال قاعدة بسيطة مثل هذا، لكنه عادة جيدة لاستخدامه في حال كنت ترغب في رسم شيء أكثر تعقيدا.


من أجل جعل هذا العمل في معالجة، الطريقة البسيطة هي استخدامها مع []، والتي تعد واحدة من بنيات تحليم الرياضيات؛ إنه واحد لاستخدامه حيث تريد فقط استبدال شيء ما دون استخدامه كمتغير يمكنك التحريض.

علي سبيل المثال،

Manipulate[
  With[{sol = NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}]},
    {Plot[x[t] /. sol // Evaluate, {t, 0, 10}, PlotRange -> {0, 1}], 
     x[4] /. sol}],
  {{a, 1}, {0, 5}}]

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

نصائح أخرى

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

الفكرة هي استخدام معلق على ال قطعة لذلك لن يتم تقييمها، هل استبدال القاعدة ثم الإصدار, ، قبل معالجة.

Manipulate[ReleaseHold[
  Hold[ {Plot[x[t], {t, 0, 10}, PlotRange -> {0, 1}], x[4]} ]
 /.NDSolve[{x'[s] == -a x[s], x[0] == 1}, x, {s, 0, 10}]
], {{a, 1}, 0, 5}]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top