找回密码
 注册
关于网站域名变更的通知
查看: 1269|回复: 1
打印 上一主题 下一主题

学习一下用Simulink Design Optimization进行微分方程参数的拟合

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-2-14 10:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
) n$ {, L1 E6 t
总的来说微分方程参数拟合有三种方法:
- c! T" g' C5 o! H! K+ {(1)将原问题转换为一个优化问题,就是使拟合得到的结果和实验测量值之差的平方和最小,此时您可以调用MATLAB优化工具箱的所有函数,最这个目标进行优化,比如fmincon,ga,lsqnonlin等。2 J1 ?8 b. @2 c5 T5 i
(2)将原问题看成一个超静定方程组,也就是说一组已知数据构成一个方程,如果有n测量数据就构成n组方程,此时fsolve函数可以搞定这个工作。3 A1 I/ U: h) @& c
(3)仍然当作一个拟合问题,而微分方程当作一个黑匣子,只是这个拟合的一直数据是测量的两组而已。这个时候lsqcurvefit、cftool和Simulink Design Optimization就可以大显身手了。不过调用lsqcurvefit和cftool函数来拟合,您必须对这两个函数熟悉呀,这个可是需要一定的MATLAB底子,不是一般的所谓大侠能够搞定的。
7 u/ f+ Z" @/ O3 q
: E$ y8 ^. X7 u) O0 t为了把大家从编程的痛苦中解救出来,本文就讨论下利用Simulink Design Optimization进行微分法拟合问题(其实所有拟合问题都是可以的)的解决方案,从此拟合问题不在需要写代码!. i% ~# K. A) E, [

. N) c; ^6 m4 i' Y现在假设我们需要拟合如下微分方程中的系数A和B8 _6 y% L% Q* T1 C
4 C6 f8 X; g& y
其实如果已知A和B的值,很容易求解这个微分方程: m+ h# {& K, @; v6 O6 O5 D" G! F
  • A=50;
  • B=10;
  • x0=1;
  • tspan=[0 100];
  • odefun=@(t,x)A./x+B.*sin(t);
  • [t,x]=ode45(odefun,tspan,x0);
  • plot(t,x)' T$ ~$ O$ P6 g* l% e
! ~7 X) B- I' `
根据工程经验A和B取值范围是[0 100],通过实验测量得到变量x随着时间t的变化曲线如下
' d. M9 X$ f0 T+ n1 ]4 u5 Q
6 i1 M0 X! i- q4 D
+ l! H0 }- [' Y! v. m' Z; X2 D: n# s一、在Simulink中建立微分方程的模型
8 I8 ]1 |: {; P, u1 I7 o% D至于Simulink的建模本文不想详细介绍,/ X6 R0 g0 B/ p! Y

5 t' a& J" [4 i" K/ x0 ?) q. T在工作空间中对变量A和B进行随便赋值
% P9 L* X* ^! `, }2 N7 E: L
  • A=10;
  • B=20;6 [$ ?2 P2 g, j
+ R# V. Z% M" g, ^  R
' i9 u  t5 b& w
然后运行模型,双击示波器模块,您可以看到如下图形,请注意这个图形和实现测量的结果是有较大出入的,这是因为我们刚才A=10和B=20是随机设置的,并不是系统真实的参数。
6 T" ^+ G& e0 C' W
: b5 H8 l7 w, h9 q  `" i+ f
4 X! z' t) P) `  Z二、修改模型中的输入输出4 E( E% S% |  p; W" d6 f) g% C" x
为了使用Simulink Design Optimization,您必须将模型中的输入输出模块修改为in和out模块。
+ ?& x) x$ ]# T% z+ u: `(1)将“时间”模块替换为,in模块
3 N" K& p4 f  i1 M! ]- Y) R(2)将“示波器”模块替换为,out模块
" Y8 P1 C. Y7 f) E8 r2 U5 ]& x $ G/ C" Q6 s. V7 T1 q) @9 z9 Q. `) J

$ n" L( d. }, R" C  S三、导入测量数据到工作空间
& v& O/ W8 `* O! J" Y将上面测量的数据导入到工作空间,方便Simulink Design Optimization使用,您可以将上面的数据文件下载保存到MATLAB工作目录,然后在Command Window中运行+ O' E$ E% [$ D9 x! o" A( s
  • >> tx=load('data.txt');
  • >> t=tx(:,1);
  • >> x=tx(:,2);
    . s: [; G) ?6 T1 `& l( ~9 l
5 h+ b' q( i( g* r) B& I/ H) R6 U

9 s- G8 V* a, u+ w5 k' j四、启动Simulink Design Optimization工具并设置9 w' q+ S/ o, y/ J7 [3 }
当前工作空间有如下变量6 q6 p: j1 W: G7 W/ f! @
  • >> whos
  •   Name      Size         Bytes  Class    Attributes
  •   A        1x1            8  double
  •   B        1x1            8  double
  •   t      8893x1          71144  double
  •   tx      8893x2         142288  double
  •   x      8893x1          71144  double$ n: L9 l; D) M  j% ~# [- a  W

1 \" Y& {4 T- |4 P  x. v. u6 s$ Z' C
请注意一定要给A和B赋值(不知道具体值,可以随意给一个),否则启动Simulink Design Optimization时会报错的!
1 a3 l5 C$ t6 Z' _- P9 J , b* |6 j& A7 C$ A0 y7 Q: Y$ {( r
9 ?6 O% D' \8 ]5 x! z. l
(1)启动Simulink Design Optimization工具
. D, O! }/ r0 N# W! c" Q通过Simulink菜单→Tool→Parameter Estimation..启动Simulink参数估计工具& I% M- C) y' X; j3 O# u/ V$ W: T, I2 H
/ }5 \$ ?6 C- ~
6 p/ y  F+ R- I
(2)新建和添加用于拟合的实验数据6 C% `  P4 R7 S4 t' A9 \0 B
点击Transient Data节点,然后New新建一个拟合数据集,将新建的New Data数据集右击重命名为Test1,其实Parameter Estimation工具支持拟合多组不同的数据,本文只有一组。
6 X9 m9 B) o- O8 C ; k8 E3 f! w* q6 P: v" Z4 V
点击刚刚重命名的Test1数据集,切换到Input Data选项卡,选择Data标签下面的表格,然后点击Import按钮,从工作空间选择您的输入数据,同时需要指定这个输入数据的对应时间戳Time,方法是选择Time下表格,点击Import按钮,选择时间变量。本文的输入数据和时间戳都是t变量。0 A9 U* i, a8 u2 o$ f
4 t+ f; Q& n5 b/ H
! o. q/ w6 C& d( d, e
(3)新建拟合变量和参数设置2 ?! o$ q3 N4 `9 `- r
点击Variables节点,然后点击下面的Add...按钮,此时工具会自动识别Simulink模型中的未知变量,比如A和B,然后添加您希望拟合的变量,虽然本教程的模型中含有A和B两个变量,但是您完全可以只是拟合A变量,B变量在工作空间中给定,此时只要选择A变量添加就行。
0 u- q& q1 p& q5 |" m : T% `: R3 L  W8 W2 g. ], v
在select parameter框中列出了您添加的的变量,选择某个变量,然后在右侧的default setting中对变量的属性进行设置,比如本教程中变量取值范围是0~100等。
4 p0 j& P. d2 H9 W6 W : }: l: L5 l9 w/ ~1 b
+ S9 Z/ ^" V1 M: [
(4)添加拟合项目,设置拟合参数开始拟合$ W+ ?: `; u2 i' j8 ?. P
点击Estimation节点,点击下面的New按钮,新建一个拟合项目,同时将项目右击重命名为Fit1
7 b6 Q( }8 ^" S2 M8 d
6 t* b  n1 O# q! }* C+ F点击Fit1节点,进行拟合项目的设置,包括选择数据集、拟合参数、以及求解器等。, O, D* _4 }, G; Q/ V; X
7 W0 K. [* V0 H1 J
接着勾选需要拟合的参数(当然可以只是勾选其中某些数据,对其进行拟合),由于MATLAB优化工具箱的求解器,对初值要求很高,所以初值的选择将直接影响您的拟合效率和效果。由于本案例简单,你随便设置一个都会收敛。
9 r, n% T3 P9 v5 F6 P& ?
& w0 Q% a+ f; L$ x8 [$ Y" g6 d求解器的设置,这个如果您不知道可以直接默认,当然也可以自己尝试,这需要您有一些优化工具箱的基础,这里不详述了。6 c4 J2 C/ a6 R, ?4 `7 a

& m3 `6 {! A" |9 l4 y- e求解器参数设置好了,就可以点击Start按钮进行拟合了,您可以勾选Show Progress View查看拟合的过程。
9 j% b' i0 ?1 ]& ~4 m
" j1 g) v1 w* }( L" h拟合开始时,拟合曲线和测量曲线不重合,右边的图显示当前的A和B值
" \' k" h7 d/ K1 r$ `4 l7 j $ v9 U. O7 a3 B4 ]2 p* d1 n
拟合结束以后,两个曲线终于重合了,有图显示此时A=50,B=10,很荣幸的告诉您,这个就是我提供那组实验数据时采用的参数。0 C( \  C8 k; Y4 d6 a  ?% u

6 e" H1 }8 h5 z* y+ ^% d3 t有时候您也许参数设置的很认真,但是Simulink Design Optimization就是不争气,拟合得到的结果很让您不满意。我只能说请节哀吧,因为Simulink Design Optimization工具调用了MATLAB的优化工具箱函数,优化工具箱罢工,Simulink Design Optimization也只能是干着急,要不换一个初值试试??
! N) P3 X4 b5 Y# |
3 a- l' U# i* D7 L' x$ q/ |1 Y(5)接下来还有那个Validation. @  W" ^/ s- _/ z- A! y7 _
其实就是绘制几幅图,让你比较下残差呀,以及原始数据和拟合数据的对比之类的,不是什么核心的内容,大家自己摸索吧!" T- O$ Q! z) J

6 s% U  _0 P2 {9 y1 r/ Q% F5 p2 E最后看下拟合与实验数据的残差,看起来还挺不错的嘛!
* l/ ~  T: p) D  w5 p
) g% l% r1 n  l6 p- v$ K- U* S/ r9 @8 x8 E/ K( @
0 U4 N) P# R) p, n- W
, T: w% b. f/ X  B) Q

' F; Z& |' e) e2 Z) S

该用户从未签到

2#
发表于 2020-2-14 19:17 | 只看该作者
Simulink Design Optimization进行微分方程参数的拟合
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-5 04:18 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表