给定数据x0
、x1
和x2
,假设我想在以下常微分方程系统中拟合参数k0
、k1
、k2
、p1
和p2
下面的代码实现了我想要的功能
pip install lmfit
个字符
的数据
现在,我不想用一个ODE拟合x0
,我想拟合它的一个插值,所以我有更多的自由。理想情况下,我想定义一个(或多个)插值参数,这也将进入优化问题。关于最好的方法有什么想法吗?
**我的想法:**类似于this answer in Mathematica,我们可以考虑定制一个插值函数,它将为连续数据点之间的每个间隔取一个参数,这些参数将与原始系统中的其余参数k1
,k2
,p1
和p2
进行位拟合。我不确定这是否理想(或快速),但如果我们忽略x0
的第一个方程并使用插值,它将给予更好的近似。例如,使用以下插值的参数化版本
from scipy.interpolate import UnivariateSpline
spline = UnivariateSpline(t_measured, x0_measured)
x0_spline = spline(t_interpolated)
plt.figure(figsize=(8, 4))
plt.scatter(t_measured, x0_measured, color='blue', label='Measured x0', zorder=3)
plt.plot(t_interpolated, x0_spline, color='green', linestyle='-', label='Spline Interpolation of x0')
plt.title("Spline Interpolation of x0")
plt.xlabel("Time")
plt.ylabel("x0")
plt.legend()
plt.grid(True)
plt.show()
型
的
3条答案
按热度按时间bbuxkriu1#
如果你的数据集可以用你的模型拟合,它可能会错过观测值(curse of dimensionality)。
你的过程可能是正确的,但由于缺少点而无法正确收敛。对于这个具有5个未知参数的3D ODE系统,3x 6点似乎不足以形成正确的错误景观。
这里有一个执行优化的过程,不需要插值(委托给
solve_ivp
)来交叉检查结果:字符串
x1c 0d1x的数据
该方法既能对初始参数进行回归,又能保证拟合函数通过初始点,当维数小于10点时,收敛困难。
误差景观似乎有多个最小值,这可能需要调整初始参数以找到搜索到的最优值。还要注意,误差函数(残差)需要足够多的带有适当噪声的项,以便在最优值周围有足够的曲率和陡度来驱动梯度下降。
更新
我们可以修改回归过程以放松通过初始点的约束。新的签名看起来像:
型
那么这个问题有8个参数,因为初始条件也有影响。我们也可以将梯度下降限制为仅为正常数。
型
下图显示了数据集的结果。
的
它没有太多的适应度,但它确认约束已经放松,并允许捕获比第一个签名更多的方差。
另一方面,拟合过程仍然适用于合成数据集(已知服从模型的数据集)上具有合理噪声的8个参数。
的
观察结果
x0
动态);你有几个选择:
*regression:需要从模型中获取常数;
更新2
带有RBF核的高斯过程可以通过你的系列,具有明显的适应性:
型
的
在这种情况下,您可以使用精度提示在已知数据之间预测/插值点,但您没有要提取的回归参数。
您可以调整高斯过程alpha参数以平滑曲线(低于
alpha=0.1**2
):x1c4d 1x的
qncylg1j2#
这本身不是一个答案,但下面的代码使我更接近我想要的。现在我只需要构建一个自定义插值(like this, eg),这样我就可以更改它以最小化整体误差。
字符串
的数据
e4yzc0pl3#
你的方程组有一个精确解。(例如,采用拉普拉斯变换并求解线性系统来找到它。)你可以简单地拟合该精确解。
写x=x_0,y=x_1和z=x_2,则我们有(给予或接受我的深夜代数):