كيف يمكنني حل قصيدة دون استخدام وظائف متداخلة؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

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

مثال على ذلك هو: سيكون:

dx/dt = -j * (k + x) ./ (l + x)

حيث j و k و l من الثوابت و x هو متغير.

الطريقة التي كنت أحلها حتى الآن هي استخدام وظيفة تأخذ في جميع القيم الأولية وجميع قيم الثوابت (التي يوجد حوالي 10) كوسائط ثم تدعو وظيفة "الخطوة" الداخلية التي تأخذ أ ناقل النموذج الذي يتوقعه Matlab لحلال قصيدة. لذا...

function [outputVector] = someFunction(x, y, j, k, l, m, n, o)
    function [output] = someFunctionStep(t, inputVector)
        x = inputVector(1);
        y = inputVector(2);
        dx = -j .* (k + x) ./ (l + x);
        dy = -m .* (n + y) ./ (o + y);
        output = [dx;dy]
    end
    outputVector = ode15s(@someFunctionStep, [0, endTime], [x,y]);
end

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

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

المحلول

أود أن أقترح إنشاء وظائف "مولد" محددة لكل نظام من ODEs التي تريد حلها (استنادًا إلى اقتراح لورين للاستفادة من وظائف مجهولة). إليك ما قد يبدو عليه المرء في مثالك:

function odeFcn = makeODE(j,k,l,m,n,o)
  odeFcn = @(t,y) [-j*(k+y(1))/(l+y(1)); -m*(n+y(2))/(o+y(2))];
end

ستقبل كل وظيفة مولد مجموعة من معلمات الإدخال وتستخدمها لإنشاء وظيفة مجهولة ، وإرجاع مقبض الوظيفة كإخراج من وظيفة المولد. إليك كيفية استخدامه بعد ذلك:

outputVector = ode15s(makeODE(a,b,c,d,e,f), [0,endTime], [x,y]);

نصائح أخرى

لا أرى كيف يمكن أن يعمل الكود الخاص بك ، كما هو مكتوب ، لأنه لا يوجد أحد يتصل أو يشير إلى SomeFunctionSp. هل يجب أن يكون هذا أول إدخال لـ ODE15S؟

في أي حال ، يمكنك كتابة وظيفة منفصلة عن طريق SomeFunstep تأخذ Varargin أو المدخلات. ثم إنشاء وظيفة مجهولة مع الثوابت. تمرير ذلك إلى ODE15S.

-لورين

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