我使用OdePkg在八度来解决刚性常,例如一个系统通过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);

求解器存储因变量的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的参数,使得所得到的变量ÿ最适合我的参考值,e.g:

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? 我会很高兴,如果你能为我提供一些提示和可能性。

此致 西蒙

有帮助吗?

解决方案

此应与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,))

其他提示

你的意思是每个函数y(t)的需要被装配?在这种情况下,租赁正方形或花键为每套易随时间拟合会工作得很好。分不清哪一个是最好的,没有看到你的数据。

您将不得不拿出另一个独立的变量,如果你的意思是要适应跨艺的所有值的曲线给定的时间点,然后观察该曲线随着时间的推移。

更新:最小二乘法拟合是它是什么 - 我没有特定的程序来推荐。 SciPy的有一个,我敢肯定。我很抱歉,我没有更好的建议。我只是学习Python的现在。

我不知道你所说的“体质指标”的意思。最小二乘拟合计算的系数,最大限度地减少了贴合性和在每个点处的数据之间的误差的均方。

仅有一个至数个数据集组合成单个配合方式:将它们合并并重新运行的计算

我制定了全面的MATLAB的适合参数和常微分方程到多个实验数据集的初始值。它可以处理依赖于每个实验不同的初始值和提供的 www.potterswheel.de

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top