利用matlab:非线性微分方程离散化转差分方程(附代码)

关键字:机理模型、泰勒展开、传递函数、Z 变换、连续系统离散化

1. 选定 CFR (Continuous Fermentation Reactor) 的机理模型作为实例对象
\dot{h}_1=-uh_1+\mu h_1 \dot{h}_2=u\left( S_f-h_2 \right) -\mu h_1/Y_{X/S} \dot{h}_3=-uh_3+\left( \alpha \mu +\beta \right) h_1 \text{其中:}\mu =\mu _m\left( 1-h_3/P_m \right) h_2\left( K_m+h_2+h_{2}^{2}/K_i \right) ^{-1} Y_{X/S}=0.4\text{;}S_f=20\text{;}\alpha =2.2\text{;}\beta =0.2\text{;} \mu _m=0.48;P_m=50;K_m=1.2;K_i=22.
h_1 为生物浓度,作为输出;u 为稀释率,作为输入。为方便推到,做如下标记:
h=[h_1,h_2,h_3]^Tf=[f_1,f_2,f_3]^T,其中:f_1=\dot{h}_1f_2=\dot{h}_2f_3=\dot{h}_3
这样我们将模型简化为:\dot{h}=f(h,u)y=g(h)=Ch=[1 \quad 0 \quad 0]h=h_1

2. 对模型进行泰勒展开前,需要先找到一个稳态点
先取一个输入值:u_0=0.175,令 f(h,u_0)=0,解得多组解,取合适的一组即可。 h_0=[6.6922,3.2695,22.3711]为本文所选。顺便可得:f(h_0,u_0)=0;g(h_0)=6.6922

3. 泰勒展开
\dot{h}=f\left( h_0,u_0 \right) +\frac{\partial f}{\partial h}|_{h_0,u_0}\left( h-h_0 \right) +\frac{\partial f}{\partial u}|_{h_0,u_0}\left( u-u_0 \right) y=g\left( h_0 \right) +\frac{\partial g}{\partial h}|_{h_0}\left( h-h_0 \right) \text{标记:}\tilde{h}=h-h_0\text{;}\tilde{u}=u-u_0\text{;}\tilde{y}=y-y_0\ \left( y_0=g\left( h_0 \right) \right) A=\frac{\partial f}{\partial h}|_{h_0,u_0}\text{;}B=\frac{\partial f}{\partial u}|_{h_0,u_0}\text{;}C=\frac{\partial g}{\partial h}|_{h_0} =[1\quad0\quad 0] \frac{d\tilde{h}}{dt}=A\tilde{h}+B\tilde{u}\text{;}\tilde{y}=C\tilde{h}\text{(状态空间方程) }
其中偏导公式为:\frac{\partial f}{\partial h}=\left[ \begin{matrix} \frac{\partial f_1}{\partial h_1}& \frac{\partial f_1}{\partial h_2}& \frac{\partial f_1}{\partial h_3}\\ \frac{\partial f_2}{\partial h_1}& \frac{\partial f_2}{\partial h_2}& \frac{\partial f_2}{\partial h_3}\\ \frac{\partial f_3}{\partial h_1}& \frac{\partial f_3}{\partial h_2}& \frac{\partial f_3}{\partial h_3}\\ \end{matrix} \right] \text{,}\frac{\partial f}{\partial u}=\left[ \begin{array}{c} \frac{\partial f_1}{\partial u}\\ \frac{\partial f_2}{\partial u}\\ \frac{\partial f_3}{\partial u}\\ \end{array} \right]
带入稳态值即可计算 A,B。
A=\left[ \begin{matrix} 0.0000& 0.0516& -0.0424\\ -0.4375& -0.3040& 0.1060\\ 0.5850& 0.1136& -0.2683\\ \end{matrix} \right] \text{;}B=\left[ \begin{array}{c} -6.6922\\ 16.7305\\ -22.3711\\ \end{array} \right]
4. 由状态空间方程求传递函数

H(s) =
      -6.692 s^2 - 2.018 s - 0.1482
    ---------------------------------------
    s^3 + 0.5723 s^2 + 0.1169 s + 0.008292
Continuous-time transfer function.

s 域到 z 域:

H(z) =
     -5.85 z^2 + 10.07 z - 4.327
     ----------------------------------
     z^3 - 2.473 z^2 + 2.043 z - 0.5642
Sample time: 1 seconds
Discrete-time transfer function.

依据 H(z) 可得到最终的差分方程。
matlab 实现代码:

求导
设置参数值
clc;clear;
close all
syms h1 h2 h3 u;
y=0.4;
alph=2.2;
bet=0.2;
mum=0.48;
Pm=50;
Km=1.2;
Ki=22;
Sf=20;
mu=mum*(1-h3/Pm)*h2/(Km+h2+h2^2/Ki);
表示函数 ,并分别对变量求偏导
f1 = -u*h1+mu*h1;
df1h1 = diff(f1, h1);
df1h2 = diff(f1, h2);
df1h3 = diff(f1, h3);  
df1u = diff(f1, u); 

f2 = u*(Sf-h2)-mu*h1/y;
df2h1 = diff(f2, h1);    
df2h2 = diff(f2, h2);    
df2h3 = diff(f2, h3);  
df2u = diff(f2, u); 

f3 = -u*h3+(alph*mu+bet)*h1;
df3h1 = diff(f3, h1);    
df3h2 = diff(f3, h2);    
df3h3 = diff(f3, h3);  
df3u = diff(f3, u);
解方程组找稳态点:给定一个输入带入方程,求出稳态点
us=0.175;
f11=subs(f1,'u',us);
f22=subs(f2,'u',us);
f33=subs(f3,'u',us);
eqns=[f11,f22,f33];
vars=[h1 h2 h3];
[h1s,h2s,h3s]=solve(eqns,vars);
hs=double([h1s h2s h3s]) % 稳态值(有多个解)

带入稳态值后得到线性化方程组:状态空间方程
F1=[df1h1 df1h2 df1h3;df2h1 df2h2 df2h3;df3h1 df3h2 df3h3];% 偏导 df/dh
F2=[df1u;df2u;df3u];% 偏导 df/du
US=[hs(2,:) us];% 稳态点
A=double(subs(F1,[h1 h2 h3 u],US))
B=double(subs(F2,[h1 h2 h3 u],US))
C=[1 0 0];
D=0;
依据求得的状态空间方程离散化
% [Ad,Bd]=c2d(A,B,1) % 离散化
% [num,den]=ss2tf(Ad,Bd,C,D) % 状态空间变传递函数
% sysd1=tf(num,den)

[num,den]=ss2tf(A,B,C,D) % 状态空间变传递函数
sys=tf(num,den)
ts=1;% 采样
sysd2=c2d(sys,ts) 
[num, den] = tfdata(sysd2,'v')

N=1200;
theta=[-den(2:end) num(2:end) sum(den)*US(1)-sum(num)*US(4)] 
Du=idinput(N,'rbs',[0,0.08],[0.175 0.19]);
y1=zeros(N,1);
y1(1)=theta*[0 0 0 0 0 0 1]';
y1(2)=theta*[y1(1) 0 0 Du(1) 0 0 1]';
y1(3)=theta*[y1(2) y1(1) 0 Du(2) Du(1) 0 1]';
for t=4:N
    y1(t)=theta*[y1(t-1) y1(t-2) y1(t-3) Du(t-1) Du(t-2) Du(t-3) 1]';
end
subplot(2,1,1)
plot(Du(201:N),'r-.',"LineWidth",1)
subplot(2,1,2)
plot(y1(201:N),'r-.',"LineWidth",1)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容