2009-07-22 114 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处获得。