MATLAB - 拟合线性微分方程组

简介: MATLAB - 拟合线性微分方程组

前言

目前我已知可以做微分方程组拟合的软件有 SAS,MATLAB,R ;但是关于软件使用的中文介绍(翻译)并不多,因此记录下来。所做应用为食品生物反应方面,首先根据化学反应建立数学模型,然后进行实验测得数据,结合模型及实验所得数据估计参数,即完成拟合任务。

本文取自官网文档,如有错误望指正。

一、软件要求

MATLAB 软件要求为 2019 以上,使用优化工具箱进行拟合,采用方法为最小二乘法。官网文档链接: Fit ODE Parameters Using Optimization Variables ,使用步骤作如下说明。

二、使用步骤

此方法是以问题为基础的 (the problem-based approach);

在MATLAB命令行中输入以下命令打开示例:

需要注意MATLAB软件需要满足版本要求。


1.问题

此实际问题为估计多步反应中真实反应速率的问题。

2.建立模型

反应流程图如下

圆圈为反应速率,正方形为反应物。

作出假设:反应速率与反应物的量成比例,则可以建立如下模型:


这里的微分方程组模型是根据反应过程得到的,所得微分方程组能够解释反应过程中各个反应物量的变化。

微分方程组的初值,即各反应物的初值为 image.png

3.用MATLAB表示模型

用函数 diffun() 表示微分方程组

function dydt = diffun(~,y,r)
dydt = zeros(6,1);
s12 = y(1)*y(2);
s34 = y(3)*y(4);

dydt(1) = -r(1)*s12;
dydt(2) = -r(1)*s12;
dydt(3) = -r(2)*s34 + r(1)*s12 - r(3)*s34;
dydt(4) = -r(2)*s34 - r(3)*s34;
dydt(5) = r(2)*s34;
dydt(6) = r(3)*s34;
end


真实的反应速率为 r 1 = 2.5 , r 2 = 1.2 , r 3 = 0.45,由此微分方程组调用 ode45 作出0到5时刻的图像,代码如下所示:

rtrue = [2.5 1.2 0.45];
y0 = [1 1 0 1 0 0];
tspan = linspace(0,5);
soltrue = ode45(@(t,y)diffun(t,y,rtrue),tspan,y0);
yvalstrue = deval(soltrue,tspan);
for i = 1:6
    subplot(3,2,i)
    plot(tspan,yvalstrue(i,:))
    title(['y(',num2str(i),')'])
end

4.求解优化问题

4.1 先定义一个由 3 个元素组成的优化变量,需要指定上下边界,

r = optimvar('r',3,"LowerBound",0.1,"UpperBound",10);

4.2 最小二乘法即微分方程组解与真实值之差的平方之和最小,定义一个 RtoODE 函数根据r求解微分方程组,

function solpts = RtoODE(r,tspan,y0)
sol = ode45(@(t,y)diffun(t,y,r),tspan,y0);
solpts = deval(sol,tspan);
end

4.3 用 fcn2optimexpr 把 RtoODE 转化为优化形式的表达式,

fcn2optimexpr

myfcn = fcn2optimexpr(@RtoODE,r,tspan,y0);

4.4 表示最小二乘法,

obj = sum(sum((myfcn - yvalstrue).^2));

4.5 建立优化问题以使用优化工具箱求解,

prob = optimproblem("Objective",obj);

5.求解问题

先给 image.png ,此值为待估计参数的猜测值,应尽量接近真实值,使用 solve 求解,

r0.r = [1 1 1];
[rsol,sumsq] = solve(prob,r0)

输出:

Solving problem using lsqnonlin.

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.

<stopping criteria details>
rsol = 
    r: [3×1 double]

sumsq = 3.8660e-15

该优化工具箱使用 lsqnonlin 函数拟合。

disp(rsol.r)

输出:

2.5000
1.2000
0.4500
disp(rtrue)

输出:

2.5000    1.2000    0.4500

6.使用有限数据拟合

使用有限数据拟合步骤与上述步骤相同,依然能够拟合,但是拟合效果不如数据完全测得拟合得到的效果好,应尽可能多得得到实验数据。

这里不对此进行详细说明,详细说明请参照官方说明文档。

假设只能观测到 y(5) 和 y(6) ,进行以下拟合:

6.1 定义函数 RtoODE2 只返回第 5,6 个 ODE 输出,

function solpts = RtoODE2(r,tspan,y0)
solpts = RtoODE(r,tspan,y0);
solpts = solpts([5,6],:); % Just y(5) and y(6)
end

6.2 定义新的优化形式的表达式

myfcn2 = fcn2optimexpr(@RtoODE2,r,tspan,y0);

6.3 修改对比数据只包含第 5,6 个输出

yvals2 = yvalstrue([5,6],:);

6.4 定义新的优化问题

obj2 = sum(sum((myfcn2 - yvals2).^2));
prob2 = optimproblem("Objective",obj2);

6.5 求解问题

[rsol2,sumsq2] = solve(prob2,r0)

输出:

Solving problem using lsqnonlin.

Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

<stopping criteria details>
rsol2 = 
    r: [3×1 double]

sumsq2 = 2.1616e-05
disp(rsol2.r)
disp(rtrue)

输出:

1.7811
1.5730
0.5899    
2.5000    1.2000    0.4500

6.6 绘制对比图

figure
plot(tspan,yvals2(1,:),'b-')
hold on
ss2 = RtoODE2(rsol2.r,tspan,y0);
plot(tspan,ss2(1,:),'r--')
plot(tspan,yvals2(2,:),'c-')
plot(tspan,ss2(2,:),'m--')
legend('True y(5)','New y(5)','True y(6)','New y(6)','Location','northwest')
hold off

输出:

6.7 绘制全部对比图

figure
yvals2 = RtoODE(rsol2.r,tspan,y0);
for i = 1:6
    subplot(3,2,i)
    plot(tspan,yvalstrue(i,:),'b-',tspan,yvals2(i,:),'r--')
    legend('True','New','Location','best')
    title(['y(',num2str(i),')'])
end


输出:

由此可知,应当有尽可能多的观测数据,否则拟合效果可能会有偏差。


三、总结

此示例拟合效果较好,因为此示例首先由已知r值求解y值,再根据y值拟合r值,大致类似于自己拟合自己。

经实验拟合检验,此拟合方法适用。

目录
相关文章
|
4月前
|
算法
【MATLAB】数据拟合第12期-基于高斯核回归的拟合算法
【MATLAB】数据拟合第12期-基于高斯核回归的拟合算法
215 0
|
4月前
|
机器学习/深度学习 算法 数据挖掘
【MATLAB】数据拟合第10期-二阶多项式的局部加权回归拟合算法
【MATLAB】数据拟合第10期-二阶多项式的局部加权回归拟合算法
102 0
|
4月前
|
算法
基于最小二乘正弦拟合算法的信号校正matlab仿真,校正幅度,频率以及时钟误差,输出SNDR,SFDR,ENOB指标
基于最小二乘正弦拟合算法的信号校正matlab仿真,校正幅度,频率以及时钟误差,输出SNDR,SFDR,ENOB指标
|
29天前
|
算法
MATLAB - 评估拟合优度、评价拟合效果
MATLAB - 评估拟合优度、评价拟合效果
47 1
|
4月前
|
机器学习/深度学习 分布式计算 并行计算
【MATLAB】史上最全的13种数据拟合算法全家桶
【MATLAB】史上最全的13种数据拟合算法全家桶
860 1
|
4月前
|
计算机视觉
MATLAB用Lasso回归拟合高维数据和交叉验证
MATLAB用Lasso回归拟合高维数据和交叉验证
|
4月前
|
数据安全/隐私保护
matlab生成拟合规范谱的人工波,生成人工地震波,拟合自定义加速度反应谱,生成人工地震波
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
4月前
|
移动开发
MATLAB用GARCH模型对股票市场收益率时间序列波动的拟合与预测
MATLAB用GARCH模型对股票市场收益率时间序列波动的拟合与预测
|
4月前
|
数据可视化
matlab用高斯曲线拟合模型分析疫情数据
matlab用高斯曲线拟合模型分析疫情数据
Matlab非线性拟合函数——nlinfit
Matlab非线性拟合函数——nlinfit
314 0
Matlab非线性拟合函数——nlinfit

热门文章

最新文章