|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
( f0 _" x7 d; _, M8 ~总的来说微分方程参数拟合有三种方法:/ w& V! `" `5 T/ w
(1)将原问题转换为一个优化问题,就是使拟合得到的结果和实验测量值之差的平方和最小,此时您可以调用MATLAB优化工具箱的所有函数,最这个目标进行优化,比如fmincon,ga,lsqnonlin等。" P U4 g0 C4 q
(2)将原问题看成一个超静定方程组,也就是说一组已知数据构成一个方程,如果有n测量数据就构成n组方程,此时fsolve函数可以搞定这个工作。
# f' Z1 A5 ?7 N9 \(3)仍然当作一个拟合问题,而微分方程当作一个黑匣子,只是这个拟合的一直数据是测量的两组而已。这个时候lsqcurvefit、cftool和Simulink Design Optimization就可以大显身手了。不过调用lsqcurvefit和cftool函数来拟合,您必须对这两个函数熟悉呀,这个可是需要一定的MATLAB底子,不是一般的所谓大侠能够搞定的。2 A/ s8 d! J q) g8 M& k( ~
8 g" k+ j _! y) K5 `' ?" E
为了把大家从编程的痛苦中解救出来,本文就讨论下利用Simulink Design Optimization进行微分法拟合问题(其实所有拟合问题都是可以的)的解决方案,从此拟合问题不在需要写代码!
' k. y# ]) {# b7 N& T8 P
3 h, t& v" }" W/ A9 D* H, I5 ]现在假设我们需要拟合如下微分方程中的系数A和B
* c1 S% M! x$ R4 X
: ^- b0 c0 k) p1 D; L其实如果已知A和B的值,很容易求解这个微分方程& }/ @, F5 U* \! z
- 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)1 S2 j5 l8 `$ t7 i [
5 X. U9 T( o9 C5 e7 Y. \) B$ U
根据工程经验A和B取值范围是[0 100],通过实验测量得到变量x随着时间t的变化曲线如下4 Z/ _7 ]* X# T, o% v
/ i# [& B0 n- b+ N* H
" B) e8 c1 {/ `一、在Simulink中建立微分方程的模型
8 |5 m- W/ x8 @& o至于Simulink的建模本文不想详细介绍,* w' o% e" L- r* D' B$ t
$ d% d7 I0 I1 e B: h/ A( }: f在工作空间中对变量A和B进行随便赋值
0 C" Z; q6 T! v" `7 A( R- A=10;
- B=20;$ }' L2 n3 `' y4 p
2 m! Q! {2 c/ f* Z& o; R
* M9 v% G' ]" ~. [4 o; Y" i8 w
然后运行模型,双击示波器模块,您可以看到如下图形,请注意这个图形和实现测量的结果是有较大出入的,这是因为我们刚才A=10和B=20是随机设置的,并不是系统真实的参数。" ~, f# j0 J& k' o5 |5 @4 @
, q1 c/ W* y) |
9 x8 B8 @+ [- T Y
二、修改模型中的输入输出3 w9 Q0 Q8 \2 j% x3 K: s
为了使用Simulink Design Optimization,您必须将模型中的输入输出模块修改为in和out模块。: \, R5 M6 s6 M) `+ K( M; M
(1)将“时间”模块替换为,in模块) r8 ^1 E& b g, s- L1 o
(2)将“示波器”模块替换为,out模块% F9 J+ F& w5 t! ?- |2 r( J8 f
% s8 I4 B R0 ]4 O3 [0 l- C" B7 @
( `0 k3 x7 [% a+ k/ b0 o三、导入测量数据到工作空间! W" J( y" G4 i* p% g# b7 b" e
将上面测量的数据导入到工作空间,方便Simulink Design Optimization使用,您可以将上面的数据文件下载保存到MATLAB工作目录,然后在Command Window中运行- @$ A+ L3 b5 `4 X# \4 `
- >> tx=load('data.txt');
- >> t=tx(:,1);
- >> x=tx(:,2);* r/ I f! s3 b% {; Y8 k
4 Z" w3 D; S" V. i6 g) K
; k' [2 R4 w* @. n" P四、启动Simulink Design Optimization工具并设置: |; W, ^+ B& D |
当前工作空间有如下变量6 r8 h, V( ]) j3 Z2 h
- >> 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* k' M9 p8 v8 ]- a
( l. X5 a: Z1 o5 {3 @' \" P4 R+ G; z3 v* v0 V( G
请注意一定要给A和B赋值(不知道具体值,可以随意给一个),否则启动Simulink Design Optimization时会报错的!
/ j; E$ C' t. r6 a% V
: r* T: w# S) {) H* z8 u# p9 Z3 J; ~2 h' b3 j2 s2 Q
(1)启动Simulink Design Optimization工具/ [; |& q4 M! H5 D- W
通过Simulink菜单→Tool→Parameter Estimation..启动Simulink参数估计工具
5 a3 i5 j: a+ H+ x, G# k
6 h& D: ?) T$ H5 X. Q! b
" q- N% H% D/ w; Z- j& d$ t" d5 L% v(2)新建和添加用于拟合的实验数据+ f, N% Q8 m; p5 i! r0 l' K
点击Transient Data节点,然后New新建一个拟合数据集,将新建的New Data数据集右击重命名为Test1,其实Parameter Estimation工具支持拟合多组不同的数据,本文只有一组。 K. `9 L' v5 e4 j, ]; n
r9 a U |: c5 \3 ], B, l! P点击刚刚重命名的Test1数据集,切换到Input Data选项卡,选择Data标签下面的表格,然后点击Import按钮,从工作空间选择您的输入数据,同时需要指定这个输入数据的对应时间戳Time,方法是选择Time下表格,点击Import按钮,选择时间变量。本文的输入数据和时间戳都是t变量。
^# p$ u+ V/ I3 H
% M, p. z& l+ `' x* p9 j
3 s, G7 W! u: w8 F/ ^9 W* c(3)新建拟合变量和参数设置
7 e1 P( N# v: X" n* K7 x点击Variables节点,然后点击下面的Add...按钮,此时工具会自动识别Simulink模型中的未知变量,比如A和B,然后添加您希望拟合的变量,虽然本教程的模型中含有A和B两个变量,但是您完全可以只是拟合A变量,B变量在工作空间中给定,此时只要选择A变量添加就行。
! r' i5 x$ a b
/ a( {* v% N" W5 j7 ]' ?0 n: N9 _在select parameter框中列出了您添加的的变量,选择某个变量,然后在右侧的default setting中对变量的属性进行设置,比如本教程中变量取值范围是0~100等。! T1 t: y. F5 ?3 X# e$ ?: I
: |, F3 x! e; i7 Y. D3 d( b: y, }) `. k# ~" x+ l# ]9 a
(4)添加拟合项目,设置拟合参数开始拟合/ e8 ]5 H+ e( q; J& ?- d
点击Estimation节点,点击下面的New按钮,新建一个拟合项目,同时将项目右击重命名为Fit1$ ^; W! i& g* B) e
8 g* Q/ p- G% c$ _
点击Fit1节点,进行拟合项目的设置,包括选择数据集、拟合参数、以及求解器等。+ Z: U1 F' e2 W m2 d# |+ n
, o) X X) @* ^6 t7 d( @接着勾选需要拟合的参数(当然可以只是勾选其中某些数据,对其进行拟合),由于MATLAB优化工具箱的求解器,对初值要求很高,所以初值的选择将直接影响您的拟合效率和效果。由于本案例简单,你随便设置一个都会收敛。3 m3 g! `. T, S2 @
2 M6 u, Y3 v5 g" R求解器的设置,这个如果您不知道可以直接默认,当然也可以自己尝试,这需要您有一些优化工具箱的基础,这里不详述了。
1 l8 `$ C6 ^' ], _/ }; C$ M6 Y/ f
9 R1 g/ f9 d% @$ a% o
求解器参数设置好了,就可以点击Start按钮进行拟合了,您可以勾选Show Progress View查看拟合的过程。
; K' v% Q! t( Z; \2 K* q" e* M
3 M5 u6 D8 _, B! G4 ]' C拟合开始时,拟合曲线和测量曲线不重合,右边的图显示当前的A和B值; N( S: e' |; \4 @* e3 C
7 ~: x- r8 q! e3 q
拟合结束以后,两个曲线终于重合了,有图显示此时A=50,B=10,很荣幸的告诉您,这个就是我提供那组实验数据时采用的参数。% P3 r# u& Q1 l4 v
5 s5 e7 F: p& ^, }8 i; D
有时候您也许参数设置的很认真,但是Simulink Design Optimization就是不争气,拟合得到的结果很让您不满意。我只能说请节哀吧,因为Simulink Design Optimization工具调用了MATLAB的优化工具箱函数,优化工具箱罢工,Simulink Design Optimization也只能是干着急,要不换一个初值试试??8 y, T& G7 D9 h2 P) N) w
; S7 F9 G. c+ t ^. i+ W' C(5)接下来还有那个Validation
0 b+ m! {& @& F( Q其实就是绘制几幅图,让你比较下残差呀,以及原始数据和拟合数据的对比之类的,不是什么核心的内容,大家自己摸索吧!
2 }% N; I7 @! E% A/ \
& R2 b% b: v [) R3 z1 C: E
最后看下拟合与实验数据的残差,看起来还挺不错的嘛!/ `. a+ J7 q6 _* |4 D( U6 K; I
5 z% ~; c% M+ E2 ^" C, C/ D
0 q% a# S! r; l6 q2 o$ r% x
/ j' n5 Z) `( X8 V+ X4 v% [4 a v0 U
( \) E+ f; ]% M+ d2 M1 C5 X# f6 \, w8 h8 c* ]2 a2 t
|
|