matlab编写s函数,求解 【Matlab】Matlab中如何编写S函数

matlab\u7684m\u7a0b\u5e8f\uff0cm\u51fd\u6570\uff0cs\u51fd\u6570\u5206\u522b\u662f\u4ec0\u4e48\uff1f

MATLAB\u4e2d\u6709\u4e24\u79cdM\u6587\u4ef6\uff1a\u4e00\u79cd\u79f0\u4e3a\u811a\u672c\u6587\u4ef6\uff08\u7c7b\u4f3c\u4e8e\u6279\u5904\u7406\u8bed\u53e5\uff09\uff0c\u8fd9\u79cd\u662f\u4e0d\u662f\u4f60\u8bf4\u7684m\u7a0b\u5e8f\uff0c\u53e6\u4e00\u79cd\u662fM\u51fd\u6570\uff08\u7c7b\u4f3c\u4e8e\u51fd\u6570\u7684\u6982\u5ff5\uff09\u3002
\uff081\uff09\u811a\u672c\u6587\u4ef6\u662f\u7531\u4e00\u7cfb\u5217MATLAB\u7684\u547d\u4ee4\u3001\u5185\u7f6e\u51fd\u6570\u4ee5\u53caM\u6587\u4ef6\u7b49\u6784\u6210\u7684\u6587\u4ef6\uff0c\u5b83\u53ef\u4ee5\u7531\u4e00\u822c\u7684\u7f16\u8f91\u5668\u8fdb\u884c\u7f16\u5236\uff0c\u5176\u7ed3\u679c\u4fdd\u5b58\u5728\u76f8\u5e94\u7684M\u6587\u4ef6\u4e2d\u3002M\u811a\u672c\u6587\u4ef6\u7684\u5b9e\u8d28\u4e3a\u547d\u4ee4\u7684\u96c6\u5408\uff0c\u5728MATLAB\u4e2d\u6267\u884cM\u811a\u672c\u6587\u4ef6\u65f6\uff0cMATLAB\u4ece\u6587\u4ef6\u4e2d\u8bfb\u53d6\u547d\u4ee4\u6267\u884c\uff0c\u5b8c\u6210\u7528\u6237\u7684\u5de5\u4f5c\u3002
\uff082\uff09MATLAB\u7684\u51fd\u6570\u4e0e\u811a\u672c\u4e0d\u540c\uff0cM\u51fd\u6570\u7684\u7b2c\u4e00\u884c\u4e3a\u5173\u952e\u5b57function\uff0c\u51fd\u6570\u7b2c\u4e00\u6b21\u6267\u884c\u65f6\u5c06\u751f\u6210\u5185\u5b58\u4ee3\u7801\uff0c\u751f\u6210\u7684\u53d8\u91cf\u653e\u5728\u51fd\u6570\u7684\u5de5\u4f5c\u533a\u3002\u5728MATLAB\u4e2d\u6709\u5927\u91cf\u7684\u5185\u7f6e\u51fd\u6570\u53ca\u5927\u91cf\u7684\u5de5\u5177\u7bb1\u51fd\u6570\uff0c\u4f7f\u7528\u5b83\u4eec\u53ef\u4ee5\u5b8c\u6210\u5927\u90e8\u5206\u7684\u5de5\u4f5c\uff1b\u4f46\u7531\u4e8e\u4e0d\u540c\u7684\u7528\u6237\u6709\u4e0d\u540c\u7684\u9700\u8981\uff0cMATLAB\u5141\u8bb8\u7528\u6237\u5f00\u53d1\u81ea\u5df1\u7684\u4e13\u7528\u6216\u901a\u7528\u51fd\u6570\uff0c\u4ee5\u6269\u5c55MATLAB\u7684\u51fd\u6570\u5e94\u7528\u3002
\uff083\uff09S-\u51fd\u6570,\u4e3b\u8981\u9488\u5bf9Simulink \u800c\u8a00\uff0c\u662f\u7cfb\u7edf\u51fd\u6570(System Function)\u7684\u7b80\u79f0\uff0c\u662f\u6307\u91c7\u7528\u975e\u56fe\u5f62\u5316\u7684\u65b9\u5f0f\uff08\u5373\u8ba1\u7b97\u673a\u8bed\u8a00\uff0c\u533a\u522b\u4e8eSimulink \u7684\u7cfb\u7edf\u6a21\u5757\uff09\u63cf\u8ff0\u7684\u4e00\u4e2a\u529f\u80fd\u5757\u3002\u7528\u6237\u53ef\u4ee5\u91c7\u7528MATLAB\u4ee3\u7801\uff0cC\uff0cC++\uff0cFORTRAM\u6216Ada\u7b49\u8bed\u8a00\u7f16\u5199S-\u51fd\u6570\u3002\u8fd9\u91cc\u5982\u679c\u91c7\u7528\u4e86MATLAB\u4ee3\u7801\uff0c\u901a\u5e38\u662f\u4e00\u4e2a.m\u6587\u4ef6\u7f16\u597d\u7684MATLAB\u8bed\u8a00\u7a0b\u5e8f\u3002
\u53e6\u5916\uff0cS-\u51fd\u6570\u7531\u4e00\u79cd\u7279\u5b9a\u7684\u8bed\u6cd5\u6784\u6210\uff0c\u7528\u6765\u63cf\u8ff0\u5e76\u5b9e\u73b0\u8fde\u7eed\u7cfb\u7edf\u3001\u79bb\u6563\u7cfb\u7edf\u4ee5\u53ca\u590d\u5408\u7cfb\u7edf\u7b49\u52a8\u6001\u7cfb\u7edf\uff1bS-\u51fd\u6570\u80fd\u591f\u63a5\u6536\u6765\u81eaSimulink\u6c42\u89e3\u5668\u7684\u76f8\u5173\u4fe1\u606f\uff0c\u5e76\u5bf9\u6c42\u89e3\u5668\u53d1\u51fa\u7684\u547d\u4ee4\u505a\u51fa\u9002\u5f53\u7684\u54cd\u5e94\uff0c\u8fd9\u79cd\u4ea4\u4e92\u4f5c\u7528\u975e\u5e38\u7c7b\u4f3c\u4e8eSimulink\u7cfb\u7edf\u6a21\u5757\u4e0e\u6c42\u89e3\u5668\u7684\u4ea4\u4e92\u4f5c\u7528\u3002

mpl\u7684118\u884ccase 3,sys=mdlOutputs(t,x,u);flag=3\u8868\u793a\u6b64\u65f6\u8981\u8ba1\u7b97\u8f93\u51fa\uff0c\u5373y=fo(t,x,u),\u627e\u5230mdlOutputs\u51fd\u6570\uff08\u5728218\u884c\uff09\uff0c\u5982\u4e0a\uff0c\u5982\u679csys=[]\u8868\u793a\u6ca1\u6709\u8f93\u51fa\uff0c\u6211\u4eec\u6539\u6210sys=fo(t,x,u)\u6216sys=C*x+D*u %sys\u6b64\u65f6\u4e3a\u8f93\u51fay\u597d\u50cf\u5feb\u5b8c\u4e86\uff0c\u563b\u563b\uff0c\u5728sfuntmpl\u7684124\u884ccase 4,sys=mdlGetTimeOfNextVarHit(t,x,u);flag=4\u8868\u793a\u6b64\u65f6\u8981\u8ba1\u7b97\u4e0b\u4e00\u6b21\u91c7\u6837\u7684\u65f6\u95f4\uff0c\u53ea\u5728\u79bb\u6563\u91c7\u6837\u7cfb\u7edf\u4e2d\u6709\u7528(\u5373\u4e0a\u6587\u7684mdlInit ializeSizes\u4e2d\u63d0\u5230\u7684ts\u8bbe\u7f6ets(1)\u4e0d\u4e3a0)\u8fde\u7eed\u7cfb\u7edf\u4e2d\u53ea\u9700\u5728mdlGetTimeOfNextVarHit\u51fd\u6570\u4e2d\u5199\u4e0asys=[];\u8fd9\u4e2a\u51fd\u6570\u4e3b\u8981\u7528\u4e8e\u53d8\u6b65\u957f\u7684\u8bbe\u7f6e\uff0c\u5177\u4f53\u5b9e\u73b0\u5927\u5bb6\u53ef\u4ee5\u7528edit vsfunc\u770bvsfunc.m\u8fd9\u4e2a\u4f8b\u5b50\u6700\u540e\u4e00\u4e2a\uff0c\u5728sfuntmpl\u7684130\u884ccase 9,sys=mdlTerminate(t,x,u);flag=9\u8868\u793a\u6b64\u65f6\u7cfb\u7edf\u8981\u7ed3\u675f\uff0c\u4e00\u822c\u6765\u8bf4\u5199\u4e0a\u5728mdlTerminate\u51fd\u6570\u4e2d\u5199\u4e0asys=[]\u5c31\u53ef\uff0c\u5982\u679c\u4f60\u5728\u7ed3\u675f\u65f6\u8fd8\u8981\u8bbe\u7f6e\u4ec0\u4e48\uff0c\u5c31\u5728\u6b64\u51fd\u6570\u4e2d\u5199\u5173\u4e8esfuntmpl\u8fd9\u4e2as\u51fd\u6570\u7684\u6a21\u677f\u8bb2\u5b8c\u4e86\u3002s\u51fd\u6570\u8fd8\u53ef\u4ee5\u5e26\u7528\u6237\u53c2\u6570\uff0c\u4e0b\u9762\u7ed9\u4e2a\u4f8b\u5b50\uff0c\u548csimulink\u4e0b\u7684gain\u6a21\u5757\u529f\u80fd\u4e00\u6837\uff0c\u5927\u4f19\u81ea\u5df1 \u770b\u5427\uff0c\u6211\u7761\u89c9\u53bb\u4e86\uff0c\u7d2f\u4e86\u3002function [sys,x0,str,ts] = sfungain(t,x,u,flag,gain)switch flag,case 0,sizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 1;sizes.NumInputs = 1;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1;sys = simsizes(sizes);x0=[];str=[];ts=[0,0];case 3,sys=gain*u;case {1,2,4,9},sys = [];end\u505a\u597d\u4e86s\u51fd\u6570\u540e\uff0csimulink--user-defined function\u4e0b\u62d6\u4e00\u4e2aS-Function\u5230\u4f60\u7684\u6a21\u578b\uff0c\u5c31\u53ef\u4ee5\u7528\u4e86\uff0c\u5728simulink----user-defined function\u8fd8\u6709\u4e2as-Function Builder\uff0c\u4ed6\u53ef\u4ee5\u751f\u6210\u7528c\u8bed\u8a00\u5199\u7684s\u51fd\u6570\u5728matlab\u7684workspace\u4e0b\u6253sfundemos\uff0c\u53ef\u4ee5\u770b\u5230\u5f88\u591a\u6f14\u793as\u51fd\u6570\u7684\u7a0b\u5e8f\u3002

就这个模型而言,我看不出使用S函数实现有什么好处。

 

如果用S函数实现,会涉及到一些具体的问题:

1、这些常数是在S函数中直接定义,还是要求可以在外部修改(例如在基本工作区中定义)?

2、是否需要把输入独立出来?mg项与状态无关,原则上可以作为一个输入处理,但也可以直接放在S函数里面。

3、初值是否要求从外部指定?

这几个方面的问题都是可以解决的,但取决于要求高低,实现的复杂程度不一样。

 

这里姑且按照最简单的情况来处理,即:

1、常数直接在S函数内部定义;

2、把m*g作为系统模型的一部分,不视为输入,而直接放在S函数中;

3、初值直接在S函数中,不从外部指定。

 

参考代码(只列出修改了的mdlInitializeSizes、mdlDerivatives和mdlOutputs三个函数,其它代码与模板sfuntmpl中的内容完全相同):

function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
%
% call simsizes for a sizes structure, fill it in and convert it to a
% sizes array.
%
% Note that in this example, the values are hard coded.  This is not a
% recommended practice as the characteristics of the block are typically
% defined by the S-function parameters.
%
sizes = simsizes;
sizes.NumContStates  = 2;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 0;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;   % at least one sample time is needed
sys = simsizes(sizes);
%
% initialize the initial conditions
%
x0  = [0; 0];
%
% str is always an empty matrix
%
str = [];
%
% initialize the array of sample times
%
ts  = [0 0];

% Specify the block simStateCompliance. The allowed values are:
%    'UnknownSimState', < The default setting; warn and assume DefaultSimState
%    'DefaultSimState', < Same sim state as a built-in block
%    'HasNoSimState',   < No sim state
%    'DisallowSimState' < Error out when saving or restoring the model sim state
simStateCompliance = 'UnknownSimState';
% end mdlInitializeSizes

function sys=mdlDerivatives(t,x,u)
k=5;
a1=1;
a2=1;
g=10;
m=70;
f = -k*x(1) * (x(1)>0);
sys = [x(2); (m*g+f-a1*x(2)-a2*x(2)*abs(x(2)))/m];
% end mdlDerivatives  

function sys=mdlOutputs(t,x,u)
sys = x(1);
% end mdlOutputs


  • 鍦MATLAB涓殑s鍑芥暟,s-function涓疄鐜癮=a+b,鎬庝箞璁剧疆a鐨勫垵鍊煎晩?_鐧惧害鐭 ...
    绛旓細鍦MATLAB涓殑s鍑芥暟锛s-function涓疄鐜癮=a+b锛屾庝箞璁剧疆a鐨勫垵鍊煎晩锛熷彲浠ヨ繖鏍锋潵澶勭悊锛歛=0; %a鐨勫垵鍊 for i=1:n %n闇鑷璁惧畾 a=a+b %b闇鑷璁惧畾 end
  • 浣跨敤Matlab寤虹珛涓猻imulink妯″瀷,鍏朵腑鐢ㄥ埌 S鍑芥暟,鍦ㄦ墽琛屾椂,S鍑芥暟鍦ㄤ竴...
    绛旓細棣栧厛锛孲 鍑芥暟鍦ㄤ竴涓闀垮唴浼氳澶氭璋冪敤锛岃繖鏄鏃犵枒闂殑銆備竴鑸潵璇达紝姣忔鑷冲皯浼氭湁璁$畻瀵兼暟鍜岃绠楄緭鍑鸿繖涓ゆ璋冪敤锛屼綋鐜颁负涓嶅悓鐨刦lag銆傚叾娆★紝鍦ㄨ繘琛岀Н鍒嗘椂锛屾牴鎹宸帶鍒剁殑瑕佹眰锛屽浜庡悓涓姝ラ暱锛屽彲鑳戒細澶氭杩涜瀵兼暟鍜岃緭鍑鸿绠楋紝濡傚浘涓伆鑹查儴鍒嗘墍绀恒傝繖涓鏁版槸涓嶇‘瀹氱殑銆
  • MATLAB缂栫▼棰 缂栧啓鍑芥暟鏂囦欢姹傛柟绋媋*x^2+b*x+c=0鐨勬牴r1,r2銆
    绛旓細syms a b c x S = solve(a*x^2+b*x+c, x);S涓瓨鍌ㄧ殑灏辨槸鏂圭▼鐨勪袱涓牴锛宒isp(S)鏄剧ず -(b + (b^2 - 4*a*c)^(1/2))/(2*a)-(b - (b^2 - 4*a*c)^(1/2))/(2*a)娴嬭瘯 Sv = subs(S, [a, b, c], [3, 5, 6]);disp(Sv)杈撳嚭 - (47^(1/2)*1i)/6...
  • matlab缂栧啓鍑芥暟,鍏跺姛鑳芥槸,璁$畻骞惰緭鍑S=1+(1+2^0.5)+(1+2^0.5+3^0.5...
    绛旓細>> f = @(x) sum(cumsum([1:x].^0.5));% 浣跨敤涓句緥>> f(1)ans = 1>> f(2)ans = 3.4142>> f(10)ans = 104.4787
  • matlab function瀹氫箟鍑芥暟,骞朵笖鐢╢solve姹傝В杩欎釜鍑芥暟銆備唬鐮佸涓:_鐧惧害...
    绛旓細閲囩敤fzero鍑芥暟锛堟眰闈炵嚎鎬ф柟绋嬶級鑰屼笉鏄痜solve鍑芥暟锛堝畠鏄眰闈炵嚎鎬ф柟绋嬬粍鐨勶級x = fzero(fun,x0)fun涓哄緟姹鍑芥暟锛x0涓哄垵濮嬪 娌$粏鐪嬩綘鐨勭▼鏂圭▼ 鍛戒护琛岃緭鍏ワ細U = fzero(@myfun,2)PS锛氭垜瑙夊緱浣犲彲浠ラ噰鐢ㄤ簩鍒嗘硶鏉姹傝В銆
  • matlab鍐欏嚱鏁姹傜骇鏁s=1+x+x^2+x^3+...+x^n,n=500,x=pi鐨勫墠n+1椤瑰拰...
    绛旓細s=0;for n=0:500 s=s+pi^n;end
  • 濡備綍鍦MATLAB涓敤鍑芥暟鐨勯掑綊璋冪敤瀹氫箟涓涓鍑芥暟姹傝В1鍒皀鐨勫拰
    绛旓細function s=mysum(n)if n==1 s=1;else s=n+mysum(n-1);end 妫楠屾墽琛岀粨鏋滐細>> s=mysum(5)s = 15 >> s=mysum(10)s = 55
  • 鍦matlab涓浣缂栧啓澶氳緭鍏ヨ緭鍑虹殑s鍑芥暟
    绛旓細闂澶锛屽氨涓嶇敤涓涓鎸囨浜嗭紝浠ヤ笅绋嬪簭宸茬粡缁忚繃璋冭瘯鎴愬姛銆俧unction [sys,x0,str,ts] = test_0105(t,x,u,flag)switch flag,case 0,[sys,x0,str,ts]=mdlInitializeSizes;case 3,sys=mdlOutputs(t,x,u);case {2,4,9},sys=[];otherwise error(['Unhandled flag = ',num2str(flag)]);e...
  • MATLAB閲岄潰宸茬煡寮鐜紶閫掑嚱鏁版庝箞鍐橲鍑芥暟?
    绛旓細鍙互鐢╰f鍑芥暟,姣斿鍒嗘瘝绯绘暟den[1 1 2],鍒嗗瓙鏄痆1 1],鐢熸垚浼犻掑嚱鏁板氨鏄痶f(num,den)锛涗篃鍙互鐢ㄩ浂鏋佸鐩婃ā鍨嬪嚱鏁皕pk(z,p,k)锛寊鏄浂鐐癸紝p鏄瀬鐐癸紝k鏄鐩娿 姣斿涓涓弻杈撳叆鍗曡緭鍑虹郴缁燂紝z={[],-0.5};%澶栨嫭鍙锋槸鑺辨嫭鍙;p={0.3,[0.2+i,0.1-i]};k=[2 3];%澶栨嫭鍙锋槸鏂规嫭鍙凤紝璇存槑...
  • 璇烽棶涓嬮潰鐨勭鏁f柟绋嬫庝箞浣跨敤matlab鐨剆鍑芥暟鏉缂栧啓鍟??鍗佸垎璋㈣阿!!_鐧惧害鐭...
    绛旓細杩欎釜matlab鎶ラ敊鏄痓et鏁扮粍閿欎簡锛宐et鏁扮粍鏄竴涓暱搴︿负3鐨勬暟鎹備綘鎶婂bet璧嬪肩殑璇彞鏀逛负 bet=u(4);bet锛1,2)=u(5);bet(1,3)=u(6);杩欐牱灏卞樊涓嶅浜
  • 扩展阅读:multisim元器件图标大全 ... 用matlab编写n的阶乘求和 ... matlab求极限例题及详解 ... matlab割线法求方程的根 ... matlab各种符号大全 ... matlab求解方程的根 ... matlab xlswrite ... 用matlab计算复杂公式 ... 常用的matlab画图的函数为 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网