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