|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
' p; E+ c6 Z5 @/ n8 ~; C总的来说微分方程参数拟合有三种方法:
5 L+ x5 F' t3 [3 @" }* `(1)将原问题转换为一个优化问题,就是使拟合得到的结果和实验测量值之差的平方和最小,此时您可以调用MATLAB优化工具箱的所有函数,最这个目标进行优化,比如fmincon,ga,lsqnonlin等。
% z3 r, E2 J( w; [ F, E(2)将原问题看成一个超静定方程组,也就是说一组已知数据构成一个方程,如果有n测量数据就构成n组方程,此时fsolve函数可以搞定这个工作。
3 P5 O H3 @4 d( l! R0 F" D(3)仍然当作一个拟合问题,而微分方程当作一个黑匣子,只是这个拟合的一直数据是测量的两组而已。这个时候lsqcurvefit、cftool和Simulink Design Optimization就可以大显身手了。不过调用lsqcurvefit和cftool函数来拟合,您必须对这两个函数熟悉呀,这个可是需要一定的MATLAB底子,不是一般的所谓大侠能够搞定的。/ @% l1 g- l1 u! H0 M/ Z( m
+ I% r# D# Y7 c" J- @" J$ J. e" |为了把大家从编程的痛苦中解救出来,本文就讨论下利用Simulink Design Optimization进行微分法拟合问题(其实所有拟合问题都是可以的)的解决方案,从此拟合问题不在需要写代码!
1 m8 f5 q, g/ k/ A: @* d, x5 Z/ f- t9 B+ _1 G& G+ y* z5 C+ p
现在假设我们需要拟合如下微分方程中的系数A和B
. s7 g% U& k& Q
5 z( r! V7 x t3 W+ B! T其实如果已知A和B的值,很容易求解这个微分方程, B' `6 k I# l& g p0 x/ @
- 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)3 j, J! g. O! ]" u6 T4 m! ?: H
+ ~5 Y- z. y: m! S* P$ L+ Q# \
根据工程经验A和B取值范围是[0 100],通过实验测量得到变量x随着时间t的变化曲线如下
" ~) p4 N6 Z* k8 o$ ^, p6 Z% z
; i! M. \' j3 a
N/ r1 D! |( w5 J6 H: i一、在Simulink中建立微分方程的模型' g; a! F j1 ?4 Q3 y- p4 q
至于Simulink的建模本文不想详细介绍,
$ Q5 W8 V: D( }, N8 }
; M) S3 [. ~2 @6 Z* o' o- J5 q/ t
在工作空间中对变量A和B进行随便赋值
6 Y* u9 ]1 j3 H/ z, h- A=10;
- B=20;; N! D- |. f; t' Q
6 U' X& E3 v5 @& c' j- M
4 k& e+ e1 B! X9 Q! Z' C2 h然后运行模型,双击示波器模块,您可以看到如下图形,请注意这个图形和实现测量的结果是有较大出入的,这是因为我们刚才A=10和B=20是随机设置的,并不是系统真实的参数。
( G' A, B( v& |. v1 }" E' }- w
* o1 a9 }8 T/ j' m1 k# }: J! a5 I
: M2 H* _5 E# D* V, I% Z, u二、修改模型中的输入输出
5 e8 g r7 v9 l; T2 N3 p: D为了使用Simulink Design Optimization,您必须将模型中的输入输出模块修改为in和out模块。0 r" T3 m3 o6 g$ F
(1)将“时间”模块替换为,in模块
; S. X8 v% g! V8 ?) e(2)将“示波器”模块替换为,out模块
4 K' F2 f4 m: P6 p0 k$ r6 m( u% `
3 V" s7 k6 O) X" N* O7 b- w7 k% q+ f7 C) `. Z. d
三、导入测量数据到工作空间
* p$ T: V! A! `0 g将上面测量的数据导入到工作空间,方便Simulink Design Optimization使用,您可以将上面的数据文件下载保存到MATLAB工作目录,然后在Command Window中运行+ I8 e& q7 x0 D4 J
- >> tx=load('data.txt');
- >> t=tx(:,1);
- >> x=tx(:,2);/ a' C- L: E3 O+ F* r7 L5 @
. p9 N$ ]! w. b# \; @3 Q
J3 U6 }2 w+ C3 V四、启动Simulink Design Optimization工具并设置' Z4 c" j& h5 M( y8 z" m
当前工作空间有如下变量
9 e' d5 |4 \) L9 x+ r4 P Z9 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
& C( r* S9 u0 D ( g' {3 M7 h0 w8 X" p
N& K$ v; Z& [) ?+ W, z' K请注意一定要给A和B赋值(不知道具体值,可以随意给一个),否则启动Simulink Design Optimization时会报错的!9 C' g) K% W! V3 y$ ~
4 _2 p/ d5 v# Y* S8 _4 s) E) n ~- m4 l; q
(1)启动Simulink Design Optimization工具
, E3 _9 o( s c通过Simulink菜单→Tool→Parameter Estimation..启动Simulink参数估计工具
# G1 H, _: J$ r5 Q- r6 y
& ~5 P( W& M+ q8 ?: w4 ?) \
% N, n% l |# }( ?* L(2)新建和添加用于拟合的实验数据
! @* y1 b1 I, I6 `- L/ P1 Z1 p5 I点击Transient Data节点,然后New新建一个拟合数据集,将新建的New Data数据集右击重命名为Test1,其实Parameter Estimation工具支持拟合多组不同的数据,本文只有一组。! B( r. u, O, g* a; O- q4 Z2 @
$ i6 c8 s! d; Z7 M# h7 O
点击刚刚重命名的Test1数据集,切换到Input Data选项卡,选择Data标签下面的表格,然后点击Import按钮,从工作空间选择您的输入数据,同时需要指定这个输入数据的对应时间戳Time,方法是选择Time下表格,点击Import按钮,选择时间变量。本文的输入数据和时间戳都是t变量。( K' B, p0 |+ Y I9 B7 E# |
0 Q5 ^: l7 s' S1 p5 n, s
8 h. Z+ N4 E, t: u; c% O* K7 U
(3)新建拟合变量和参数设置- {6 t5 T) {0 N4 q7 A1 x* r- C
点击Variables节点,然后点击下面的Add...按钮,此时工具会自动识别Simulink模型中的未知变量,比如A和B,然后添加您希望拟合的变量,虽然本教程的模型中含有A和B两个变量,但是您完全可以只是拟合A变量,B变量在工作空间中给定,此时只要选择A变量添加就行。
, Z4 T! e& a, Z' v
8 H& ?2 p. K1 S6 G/ s J在select parameter框中列出了您添加的的变量,选择某个变量,然后在右侧的default setting中对变量的属性进行设置,比如本教程中变量取值范围是0~100等。
6 P+ r' Z% F. F/ o9 y! N. i+ j
# m/ r: P R- K) O
# j/ Q& e% i9 ?, E(4)添加拟合项目,设置拟合参数开始拟合 r% \. J5 l& u& y% U3 ^5 E
点击Estimation节点,点击下面的New按钮,新建一个拟合项目,同时将项目右击重命名为Fit1
8 |( ?# ]& t. @/ R* C9 G' H6 m
! x! S6 k% b: B, o1 c; H
点击Fit1节点,进行拟合项目的设置,包括选择数据集、拟合参数、以及求解器等。
! v- x9 S5 p7 n( V, O
2 [0 J0 `' }# v5 E/ h8 T# L
接着勾选需要拟合的参数(当然可以只是勾选其中某些数据,对其进行拟合),由于MATLAB优化工具箱的求解器,对初值要求很高,所以初值的选择将直接影响您的拟合效率和效果。由于本案例简单,你随便设置一个都会收敛。
/ {. Y% l( @2 v- E
: X# J) C0 G* B6 G1 `7 H' D
求解器的设置,这个如果您不知道可以直接默认,当然也可以自己尝试,这需要您有一些优化工具箱的基础,这里不详述了。
3 L: t+ Z& S9 i
7 c+ V3 y5 @! F" P
求解器参数设置好了,就可以点击Start按钮进行拟合了,您可以勾选Show Progress View查看拟合的过程。% S6 q& o# y' F" y# W' o) U
f( Z' {# h6 P4 T- R" h" X拟合开始时,拟合曲线和测量曲线不重合,右边的图显示当前的A和B值! ?+ c# n$ p! X) A/ G1 `8 U% Y
/ D; s% b4 V; z; R
拟合结束以后,两个曲线终于重合了,有图显示此时A=50,B=10,很荣幸的告诉您,这个就是我提供那组实验数据时采用的参数。
9 z/ B9 n8 l/ C: u/ l
6 i5 Y- N, m* W/ J2 z2 ?有时候您也许参数设置的很认真,但是Simulink Design Optimization就是不争气,拟合得到的结果很让您不满意。我只能说请节哀吧,因为Simulink Design Optimization工具调用了MATLAB的优化工具箱函数,优化工具箱罢工,Simulink Design Optimization也只能是干着急,要不换一个初值试试??
" [( z. t' H6 M u1 d
) l- |4 h5 A( L: Z2 P) D0 D(5)接下来还有那个Validation
% _2 B7 k7 {# I! Z' Y) w4 e1 m其实就是绘制几幅图,让你比较下残差呀,以及原始数据和拟合数据的对比之类的,不是什么核心的内容,大家自己摸索吧!8 A; p }2 ~5 A( G# P) m% w
) N& Y- A+ X' x4 z' L& B7 L$ R% R
最后看下拟合与实验数据的残差,看起来还挺不错的嘛!$ R9 |# Q/ n1 g) I% l
8 j; Z" X3 d, b2 }$ n( \+ R
7 O4 I! G9 H) S5 T- C0 R7 P3 p: ^6 l; P& M) Q. w" G3 V# E* ?# D0 k
1 W$ ~2 n% m. U# y; N: `! ~( Z
# }& L- u3 E" q+ M
|
|