من المناسب معلمات ODES أثناء استخدام Octave / Matlab Ode Solver

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

  •  18-09-2019
  •  | 
  •  

سؤال

أنا أستخدم OdePKG في OFFAVE لحل نظام من الأديان القاسية، على سبيل المثال بواسطة ODE5R:

function yprime = myODEs(t,Y,param)
    yprime = [
        - param(1) * Y(1);                      # ODE for Y(1)
        param(1) * Y(1) - param(2) Y(2) * Y(3); # ODE for Y(2)
        param(2) Y(2) * Y(3)                    # ODE for Y(3)
                                                # etc.
];

time_span = [1, 24]         # time span of interest
Y0        = [1.0, 1.1, 1.3] # initial values for dependent variables Y
param     = [7.2, 8.6, 9.5] # parameters, to be optimized

[t, Y] = ode5r(@myODEs, time_span, Y0, ..., param);

يخزن Solver المتغيرات المعتمدة Y في مصفوفة فيما يتعلق بالوقت T (ناقل):

t     Y(1)  Y(2)  Y(3)
0.0   1.0   1.1   1.3
0.1   ...   ...   ...
0.5   ...   ...   ...
0.9   ...   ...   ...
...   ...   ...   ...
4.0   ...   ...   ...
...   ...   ...   ...
24.0  ...   ...   ...

أريد أن أرمل المعلمات في Param، بحيث تناسب المتغيرات الناتجة عن قيمي المرجعية، على سبيل المثال:

t         Y(1)  Y(2)  Y(3)
0.5       1.1   N/A   N/A
1.0       1.9   N/A   N/A
4.0       2.3   2.7   2.1
5.0       N/A   2.6   2.2
24.0      0.9   1.5   2.0

ما هو Octave / Matlab (لغات أخرى مرحب بها) روتين أداء متعدد المعلمات (الأقل مربع / spline)ب كيف يمكن الجمع بين مجموعات المعلمات لقيم مبدئية مختلفة y0 في الملاءمة؟ سأكون سعيدا إذا كنت تستطيع أن تقدم لي بعض التلميحات والإمكانيات.

مع أطيب التحيات، سيمون

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

المحلول

يجب أن يكون هذا واضحا نسبيا مع SCIPY. scipy.optimize.leastsq() يأخذ وظيفة يجب أن تعيد مجموعة من المتبقية لنطق معامل معين. سوف تقليل مجموع مربعات المربعات. للتعامل مع مجموعات بيانات متعددة مع قيم مبدئية مختلفة، تقوم فقط بتشغيل ODE مرة واحدة لكل مجموعة بيانات، وحسب المتبقية لكل زوج بيانات / تشغيل، ثم قم بتسليم ناقلات المتبقية معا. هنا رسم تقريبي:

import numpy
from scipy import integrate, optimize

# The initial guess.
p0 = numpy.array([7.2, 8.6, 9.5])

# The collected datasets.
# A list of (t, y0, y) tuples.
# The y's are all (len(y0), len(t))-shaped arrays. The output of
# integrate.odeint is also in this format.
datasets = [...]

def odes(y, t, params):
    dydt = [
        -params[0] * y[0],
        params[0]*y[0] - params[1]*y[1]*y[2],
        params[1]*y[1]*y[2],
    ]
    return np.array(dydt)

def residuals(params, datasets):
    res = []
    for t, y0, y in datasets:
        res.append(integrate.odeint(odes, y0, t, args=(params,)) - y)

    # Stack them horizontally and flatten the array into the expected vector.
    # You're on your own for handling missing data. Look into the numpy.ma
    # module.
    all_residuals = numpy.hstack(res).ravel()
    return all_residuals

opt_params, err = optimize.leastsq(residuals, p0, args=(datasets,))

نصائح أخرى

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

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

تحديث: الأقل تركيب مربع هو ما هو - ليس لدي روتين معين للتوصية. scipy لديه واحد, ، انا متاكد. أنا آسف لأنني ليس لدي توصية أفضل. أنا فقط تعلم بيثون الآن.

لا أعرف ماذا تقصد ب "مؤشر اللياقة البدنية". المربعات الأقل تركيبات بحساب المعاملات التي تقلل من مربع الخطأ من الخطأ بين الملاءمة والبيانات في كل نقطة.

طريقة واحدة فقط للجمع بين العديد من مجموعات البيانات في مناسبة واحدة: دمجها وإعادة تشغيل الحساب.

قمت بتطوير صندوق أدوات MATLAB شامل لتناسب المعلمات والقيم الأولية للأدويع على مجموعات بيانات تجريبية متعددة. يمكن أن تتعامل مع القيم الأولية المختلفة اعتمادا على كل تجربة وتتوفر في www.potterswheel.de..

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