0

私はOctaveでOdePkgを使用して、たとえばode5rによる硬いODEのシステムを解いています。

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);

ソルバーは、従属変数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に適合させたいので、結果の変数Yは私の参照値に最もよく適合します。例:

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(他の言語も歓迎)ルーチンがマルチパラメーター(最小二乗/スプライン)フィットを実行できますか?フィットで異なる初期値Y0のパラメーターセットを組み合わせるにはどうすればよいですか?ヒントや可能性を教えていただければ幸いです。

よろしく、サイモン

4

3 に答える 3

2

これはscipyでは比較的簡単なはずです。scipy.optimize.leastsq()指定されたパラメーターベクトルの残差の配列を返す関数を取ります。残差の二乗和を最小化します。初期値が異なる複数のデータセットを処理するには、データセットごとにODEを1回実行し、データセットと実行のペアごとに残差を計算してから、残差ベクトルを連結します。これが大まかなスケッチです:

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,))
于 2009-08-26T19:02:20.983 に答える
1

各関数y(t)を適合させる必要があるということですか?その場合、Yi対時間の各セットのリーススクエアまたはスプラインフィッティングは問題なく機能します。データを見ないと、どちらが最適かわかりません。

特定の時点でYiのすべての値にわたって曲線を近似し、その曲線が時間の経過とともに変化するのを監視する場合は、別の独立変数を考え出す必要があります。

更新:最小二乗フィッティングはそれが何であるかです-私は推奨する特定のルーチンを持っていません。 SciPyには1つあると思います。これ以上の推奨事項がないことをお詫び申し上げます。私は今Pythonを学んでいるだけです。

「フィットネス指標」とはどういう意味かわかりません。最小二乗フィッティングは、各ポイントでのフィッティングとデータ間の誤差の平均二乗を最小化する係数を計算します。

複数のデータセットを1つの近似に結合する1つの方法は、それらをマージして計算を再実行することです。

于 2009-07-22T10:01:49.000 に答える
0

ODEのパラメーターと初期値を複数の実験データセットに適合させるための包括的なMatlabツールボックスを開発しました。各実験に応じて異なる初期値を処理でき、www.potterswheel.deで入手できます。

于 2011-04-13T08:15:15.547 に答える