如何在S函数中对变量或者输入信号进行求导
如何在S函數(shù)中對變量或者輸入信號進(jìn)行求導(dǎo)
經(jīng)常在有的時(shí)候,我們需要使用S函數(shù)來進(jìn)行仿真,但是有的時(shí)候我們往往需要對變量進(jìn)行求導(dǎo)或者積分。看到這里,你可能會(huì)問在S函數(shù)的output函數(shù)的輸出結(jié)果不是會(huì)對mdlDerivative函數(shù)的輸出結(jié)果進(jìn)行積分么?這個(gè)確實(shí)不假,但是有的時(shí)候你需要在其他函數(shù)中用到這個(gè)變量的積分,那這個(gè)時(shí)候應(yīng)該怎么辦呢?或者需要對變量進(jìn)行求導(dǎo)呢?我們知道diff函數(shù)是用來對變量或者函數(shù)進(jìn)行求導(dǎo)的,但是在S函數(shù)中變量只是一個(gè)時(shí)刻的采樣點(diǎn),根據(jù)數(shù)學(xué)我們知道都一個(gè)數(shù)進(jìn)行求導(dǎo),那么結(jié)果進(jìn)行為零的。
自己經(jīng)過一段的時(shí)間的折騰,好像也折騰出了一點(diǎn)的結(jié)果,因此分享出來和大家討論一下,大家應(yīng)該也有更好的方法,或者建議。廢話太多了,直接上代碼吧!
function [sys,x0,str,ts]=daoshu(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
case 1,
sys=mdlDerivatives(t,x,u);
case 2,
sys=mdlUpdate(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case { 4, 9 }
sys = [];
otherwise
error([‘Unhandled flag = ‘,num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates =1; %連續(xù)狀態(tài)
sizes.NumDiscStates = 2; %離散狀態(tài)
sizes.NumOutputs = 3;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 0;
sys=simsizes(sizes);
x0=[0,0,0];
str=[];
ts=[];
function sys=mdlDerivatives(t,x,u) %實(shí)現(xiàn)對輸入的積分
x(1)=u(1);
sys=x(1);
function sys=mdlUpdate(t,x,u) %實(shí)現(xiàn)對輸入的求導(dǎo)
x(2)=u(1);
x(3)=t;
sys=[x(2),x(3)];
function sys=mdlOutputs(t,x,u)
if (t-x(3))>0 %避免在最初的一個(gè)采樣點(diǎn),分母為零,導(dǎo)致輸出結(jié)果異常的大
dt=(u(1)-x(2))/(t-x(3));
else
dt=0;
end
xx=x(1);
sys = [xx,dt,u(1)];
模型圖
結(jié)果圖
其中紅色的是輸入曲線y=sin(2*pi*x);藍(lán)色的是求導(dǎo)的曲線y=2*pi*cos(2*pi*x);黃色的是積分的曲線,只是不知道S函數(shù)中的積分中的積分常數(shù)是如何確定的,導(dǎo)致算了一下,積分常數(shù)應(yīng)該是1\(2*pi)。
總結(jié)
以上是生活随笔為你收集整理的如何在S函数中对变量或者输入信号进行求导的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.Linux的目录结构
- 下一篇: Day 3 in India