查看: 135|回复: 1|关注: 0

[未答复] 如何用MATLAB的S函数,编写联立的阀口流量方程,连续性方程,以及力平衡方程。。。大神求指教

[复制链接]

新手

10 麦片

财富积分


050


2

主题

5

帖子

0

最佳答案
发表于 2019-6-20 09:20:31 | 显示全部楼层 |阅读模式
Q1=Cd*w1*xv*(2((PS-P1)/ρ)
Q2=Cd*w1*xv*(2P2/ρ)
Q1=A1*y+Cip*(P1-P2)+(V1/βe)P1
Q2=A2*y+Cip*(P1-P2)-(V2/βe)P2
A1P1-A2P2=m*y’’+B*y+k*y+FL
其中输入量为 xv:伺服阀芯位移
           FL:外负载
状态变量    y(位移)、y’(速度)P1、P2
输出量      y(液压缸的位移)

下面是自己编写的非线性S函数
  1. function [sys,x0,str,ts,simStateCompliance] = nonlinearity(t,x,u,flag)
  2. %关于状态变量x:
  3. %此程序中的状态变量有四个,两油腔压力p1,p2
  4. %活塞位移y和活塞的速度y’
  5. %sS函数中的状态变量为x,有四个状态变量就有p1:x(1),p2:x(2),y:x(3),y':x(4)
  6. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7. %关于输入量U:
  8. %此程序中的输入量有两个分别是伺服阀的位移X0以及外负载干扰Fl
  9. %此程序中的输入量u,有两个分别是u(1):伺服阀的位移,u(2)外负载
  10. %再次注意
  11. switch flag,
  12.   case 0,
  13.     [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(t,x,u);%初始化
  14.   case 1,
  15.     sys=mdlDerivatives(t,x,u);%计算连续状态 mdlUpdate:计算连续状态
  16.   case 3,
  17.     sys=mdlOutputs(t,x,u);%计算输出量

  18. case{2,4,9},sys=[];
  19.   otherwise
  20.     DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));

  21. end

  22. % end sfuntmpl

  23. %
  24. %=============================================================================
  25. % mdlInitializeSizes
  26. % Return the sizes, initial conditions, and sample times for the S-function.
  27. %=============================================================================
  28. %
  29. function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(t,x,u)

  30. %
  31. % call simsizes for a sizes structure, fill it in and convert it to a
  32. % sizes array.
  33. %
  34. % Note that in this example, the values are hard coded.  This is not a
  35. % recommended practice as the characteristics of the block are typically
  36. % defined by the S-function parameters.
  37. %
  38. sizes = simsizes;

  39. sizes.NumContStates  = 0;
  40. sizes.NumDiscStates  = 4;%这条语句表示离散状态的个数也就是x有几个量x[x(1),x(2),x(3),x(4)]
  41. sizes.NumOutputs     = 1;%输出的个数这里指的是在下面mdlOutputs输出时有几个sys
  42. sizes.NumInputs      = 2;%这里表示有几个输入u[u(1),u(2)]
  43. sizes.DirFeedthrough = 1;%系统的输出是否直接和输入相关联,即输入是否出现在输出端的标志,若是为1,否则为0,一般可以根据在flag=3的时候,mdlOutputs函数是否调用输入u来判断是否直接馈通;
  44. sizes.NumSampleTimes = 1;   % at least one sample time is needed

  45. sys = simsizes(sizes);

  46. %
  47. % initialize the initial conditions
  48. %
  49. x0  = [0;0;0;0];

  50. %
  51. % str is always an empty matrix
  52. %
  53. str = [];

  54. %
  55. % initialize the array of sample times
  56. %
  57. ts  = [-1 0];

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

  64. % end mdlInitializeSizes

  65. %
  66. %=============================================================================
  67. % mdlDerivatives
  68. % Return the derivatives for the continuous states.
  69. %=============================================================================
  70. %
  71. %
  72. %=============================================================================
  73. % mdlUpdate
  74. % Handle discrete state updates, sample time hits, and major time step
  75. % requirements.
  76. %=============================================================================
  77. %
  78. function sys=mdlDerivatives(t,x,u)
  79. sys(1)=x(3);
  80. sys(4)=(4*10^(-3)*x(1)-2*10^(-3)*x(2))/100-(2*10^5/100)*x(4)-(1*10^4/100)*x(3)-u(2)/100;
  81. sys(2)=((-4*10^(-3)*x(4))-(8*10^(-13)*(x(1)-x(2)))+0.61*0.02*u(1)*sqrt(2*(2*10^6-x(1))/850))/(0.6*10^(-3)*800*10^6);
  82. sys(3)=(2*10^(-3)*x(4))-(8*10^(-13)*(x(1)-x(2)))-0.61*0.02*u(1)*sqrt(2*x(2)/850)/(0.6*10^(-3)*800*10^6);

  83. % end mdlUpdate

  84. %
  85. %=============================================================================
  86. % mdlOutputs
  87. % Return the block outputs.
  88. %=============================================================================
  89. %
  90. function sys=mdlOutputs(t,x,u)

  91. sys=x(3);
复制代码
其中算法下面几行是算法的表达
  1. function sys=mdlDerivatives(t,x,u)
  2. sys(1)=x(3);
  3. sys(4)=(4*10^(-3)*x(1)-2*10^(-3)*x(2))/100-(2*10^5/100)*x(4)-(1*10^4/100)*x(3)-u(2)/100;
  4. sys(2)=((-4*10^(-3)*x(4))-(8*10^(-13)*(x(1)-x(2)))+0.61*0.02*u(1)*sqrt(2*(2*10^6-x(1))/850))/(0.6*10^(-3)*800*10^6);
  5. sys(3)=(2*10^(-3)*x(4))-(8*10^(-13)*(x(1)-x(2)))-0.61*0.02*u(1)*sqrt(2*x(2)/850)/(0.6*10^(-3)*800*10^6);
复制代码

程序运行的图像

程序运行的图像
为什么会出来这个图像那 我的算法写错了吗


untitled.slx

18.16 KB, 下载次数: 0

simulink模型

nonlinearity.m

3.53 KB, 下载次数: 0

S函数

新手

10 麦片

财富积分


050


2

主题

5

帖子

0

最佳答案
 楼主| 发表于 2019-6-22 12:55:36 | 显示全部楼层
QQ:670029867 我的联系方式 价钱好商量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表