2009-07-22 29 views
0

我在Octave中使用OdePkg來求解硬ODEs的系統,例如,通過ode5r:在使用倍頻程/ matlab ODE求解器時擬合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的參數,使得所得到的變量Ÿ最適合我的參考值,例如:

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 

哪個八度/ Matlab的(其他語言的歡迎)程序可以進行多參數(最小二乘/花鍵)適合? 怎麼可能結合不同初值的參數集 y0在擬合? 如果你能給我提供一些提示和可能性,我會很高興。

最好的問候,西蒙

回答

2

這應該與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,)) 
1

你的意思是每個函數y(t)的需要安裝?在這種情況下,對於每一套易與時間的租賃平方或樣條擬合都可以正常工作。如果沒有看到您的數據,不知道哪一個最好。

你必須想出另一個獨立的變量,如果你的意思是要適應跨藝的所有值的曲線給定的時間點,然後觀察該曲線隨着時間的推移。

UPDATE:最小二乘法擬合是它是什麼 - 我沒有特定的程序來推薦。我很確定。對不起,我沒有更好的建議。我現在只學習Python。

我不知道你所說的「體質指標」的意思。最小二乘擬合計算係數,以使擬合和每個點處的數據之間誤差的均方差最小。

只要一種到多個數據集組合成一個單一的擬合方法:把它們合併,並重新運行計算。

+0

你的第一個建議聽起來像我想要的。我只是想確保,我得到了你的權利: 1. 我總結我的八度解算器裝配模塊中。 對於多參數擬合有效的最小二乘法和/或樣條例程可以推薦嗎? 2. 擬合給了我每個y(t)的模型結果和實際數據之間的誤差。 解算器是否將所有錯誤的總和作爲每個參數組合的適應度指標? 3. 今天我提取了新的數據集(針對不同的初始值) 如何在一個擬閤中組合這些數據? (我會發布數據,如果有幫助) – SimonSalman 2009-07-23 08:24:16

+0

哦,是的,我的意思是通過「健身指標」這些係數。我想我不必爲此煩惱,因爲這是最小平方算法的一部分。 我一次只能用一組初始值運行模型。所以我不明白在基於不同的初始值時如何合併數據集。 – SimonSalman 2009-07-23 10:15:19

0

我制定了全面的MATLAB的適應參數和微分方程到多個實驗數據集的初始值。它可以根據每個實驗處理不同的初始值,可在www.potterswheel.de處獲得。