سؤال

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

لدي 8 ODEs مقترنة من الدرجة الأولى، ويجب أن أقوم بإنشاء وظيفة مثل:

def derv(y):
    compute the time dervative of elements in y
    return answers as an array

ثم افعل complex_ode(derv)

أسئلتي هي:

  1. Y الخاص بي ليس قائمة ولكن مصفوفة ، كيف يمكنني إعطاء إخراج corrent يناسب complex_ode ()؟
  2. complex_ode() يحتاج إلى يعقوبي ، ليس لدي أي فكرة عن كيفية البدء في بناء واحد ونوع يجب أن يكون؟
  3. أين يجب أن أضع الشروط الأولية كما في القصيدة العادية ووقت الوقت؟

هذا هو رابط complex_ode الخاص بـ scipy:http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.complex_ode.html

هل يمكن لأي شخص أن يقدم لي المزيد من المعلومات حتى أتمكن من تعلم المزيد.

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

المحلول

أعتقد أنه يمكننا على الأقل توجيهك في الاتجاه الصحيح.معادلة Bloch البصرية هي مشكلة مفهومة جيدًا في المجتمع العلمي ، على الرغم من أنه ليس من قبلي :-) ، لذلك هناك بالفعل حلول على الإنترنت لهذه المشكلة بالذات.

http://massey.dur.ac.uk/jdp/code.html

ومع ذلك ، لتلبية احتياجاتك ، تحدثت عن استخدام Complex_ode ، الذي أفترض أنه جيد ، لكنني أعتقد أنه مجرد scipy.integrate.ode سيعمل بشكل جيد أيضًا وفقًا لوثائقهم:

 from scipy import eye
 from scipy.integrate import ode

 y0, t0 = [1.0j, 2.0], 0

 def f(t, y, arg1):
     return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
 def jac(t, y, arg1):
     return [[1j*arg1, 1], [0, -arg1*2*y[1]]]
 r = ode(f, jac).set_integrator('zvode', method='bdf', with_jacobian=True)
 r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0)
 t1 = 10
 dt = 1
 while r.successful() and r.t < t1:
     r.integrate(r.t+dt)
     print r.t, r.y

لديك أيضًا فائدة إضافية تتمثل في وظيفة أقدم وأفضل موثقة.أنا مندهش من أن لديك 8 وليس 9 قصيدة مقترنة ، لكنني متأكد من أنك تفهم هذا أفضل من I.نعم ، أنت على صواب ، يجب أن تكون وظيفتك من النموذج ydot = f(t,y), ، الذي تسميه def derv() لكنك ستحتاج إلى التأكد من أن وظيفتك تأخذ معلمتين على الأقل مثل derv(t,y).إذا كان لديك y هو في المصفوفة، لا مشكلة!فقط "إعادة تشكيل" في derv(t,y) وظيفة مثل ذلك:

Y = numpy.reshape(y,(num_rows,num_cols));

طالما num_rows*num_cols = 8, ، رقم ODE الخاص بك يجب أن يكون على ما يرام.ثم استخدم المصفوفة في الحسابات الخاصة بك.عندما تنتهي جميعًا ، فقط تأكد من إرجاع ناقل وليس مصفوفة مثل:

out = numpy.reshape(Y,(8,1));

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

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

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