深入拆解Simulink自动生成代码(五)——数据统计算法

Simulink 最基础教程(三)常用模块 特别的,unit delay模块。这里对应1.4.2求解常微分方程组的例子,如果是求解离散系统的迭代方程 x(k+1)=f(x(k),u(k),t(k)),那么这个过程就是拖拽一堆unit delay模块,将他们的输出定义为 x(k),搭建函数 f 后,再将结果交给 unit delay 的输入。MATLAB里说的流程控制,一般是指for,while,if,switch这些,Simulink里要实现 for 和 while 比较少见,但实现 if 的情况还是很多的,这时,需要 switch 模块。 阅读详情

文章目录

前言

一、Simulink实现数据统计算法

 二、自动生成C代码

 三、变式1

四、变式2

五、变式3

 总结


前言

        《深入拆解Simulink自动生成代码(一)——数据流处理》

        《深入拆解Simulink自动生成代码(二)——选择结构》

        《深入拆解Simulink自动生成代码(三)——循环结构》

        《深入拆解Simulink自动生成代码(四)——状态机》

一、Simulink实现数据统计算法

         用Simulink实现求极值统计算法的一个最简单编程举例如下:

 二、自动生成C代码

         上述Matlab Function的Simulink自动生成的对应C代码如下:

  int32_T idx;
  int32_T k;
  boolean_T exitg1;

  /* MATLAB Function: '<S2>/MATLAB Function' */
  if (!rtIsNaN(CodeGenerate_ConstB.VectorConcatenate[0])) {
    idx = 1;
  } else {
    idx = 0;
    k = 2;
    exitg1 = false;
    while ((!exitg1) && (k < 104)) {
      if (!rtIsNaN(CodeGenerate_ConstB.VectorConcatenate[k - 1])) {
        idx = k;
        exitg1 = true;
      } else {
        k++;
      }
    }
  }

  if (idx == 0) {
    /* Outport: '<Root>/y4' */
    CodeGenerate_Y.y4 = CodeGenerate_ConstB.VectorConcatenate[0];
  } else {
    CodeGenerate_Y.y4 = CodeGenerate_ConstB.VectorConcatenate[idx - 1];
    while (idx + 1 <= 103) {
      if (CodeGenerate_Y.y4 < CodeGenerate_ConstB.VectorConcatenate[idx]) {
        CodeGenerate_Y.y4 = CodeGenerate_ConstB.VectorConcatenate[idx];
      }

      idx++;
    }
  }

  /* End of MATLAB Function: '<S2>/MATLAB Function' */

 三、变式1

         基于上述举例,把最大值求解结果再加上最大值位置,生成的对应代码如下所示:

 

  real_T b_ex;
  int32_T idx;
  int32_T k;
  boolean_T exitg1;

  /* MATLAB Function: '<S3>/MATLAB Function1' */
  if (!rtIsNaN(CodeGenerate_ConstB.VectorConcatenate2[0])) {
    idx = 1;
  } else {
    idx = 0;
    k = 2;
    exitg1 = false;
    while ((!exitg1) && (k < 104)) {
      if (!rtIsNaN(CodeGenerate_ConstB.VectorConcatenate2[k - 1])) {
        idx = k;
        exitg1 = true;
      } else {
        k++;
      }
    }
  }

  if (idx == 0) {
    b_ex = CodeGenerate_ConstB.VectorConcatenate2[0];
    idx = 1;
  } else {
    b_ex = CodeGenerate_ConstB.VectorConcatenate2[idx - 1];
    for (k = idx; k < 103; k++) {
      if (b_ex < CodeGenerate_ConstB.VectorConcatenate2[k]) {
        b_ex = CodeGenerate_ConstB.VectorConcatenate2[k];
        idx = k + 1;
      }
    }
  }

四、变式2

         基于上述举例,把最大值求解变成次大值求解,生成的对应代码如下所示:

static void CodeGenerate_maximum(const real_T x[103], real_T *ex, int32_T *idx)
{
  int32_T k;
  boolean_T exitg1;
  if (!rtIsNaN(x[0])) {
    *idx = 1;
  } else {
    *idx = 0;
    k = 2;
    exitg1 = false;
    while ((!exitg1) && (k < 104)) {
      if (!rtIsNaN(x[k - 1])) {
        *idx = k;
        exitg1 = true;
      } else {
        k++;
      }
    }
  }

  if (*idx == 0) {
    *ex = x[0];
    *idx = 1;
  } else {
    *ex = x[*idx - 1];
    for (k = *idx; k < 103; k++) {
      if (*ex < x[k]) {
        *ex = x[k];
        *idx = k + 1;
      }
    }
  }
}

  real_T u[103];
  real_T ex;
  int32_T idx;

  /* MATLAB Function: '<S3>/MATLAB Function3' */
  memcpy(&u[0], &CodeGenerate_ConstB.VectorConcatenate3[0], 103U * sizeof(real_T));
  CodeGenerate_maximum(CodeGenerate_ConstB.VectorConcatenate3, &ex, &idx);
  u[idx - 1] = 0.0;
  CodeGenerate_maximum(u, &ex, &idx);

五、变式3

         基于上述举例,把最大值求解变成去掉最大值的方差求解,生成的对应代码如下所示:

 

 

  real_T u_[10];
  real_T absdiff;
  real_T j;
  real_T scale;
  real_T t;
  real_T xbar;
  int32_T idx;
  int32_T k;
  boolean_T exitg1;

  /* MATLAB Function: '<S4>/MATLAB Function2' */
  j = 1.0;
  memset(&u_[0], 0, 10U * sizeof(real_T));
  if (!rtIsNaN(CodeGenerate_ConstB.VectorConcatenate1[0])) {
    idx = 1;
  } else {
    idx = 0;
    k = 2;
    exitg1 = false;
    while ((!exitg1) && (k < 12)) {
      if (!rtIsNaN(CodeGenerate_ConstB.VectorConcatenate1[k - 1])) {
        idx = k;
        exitg1 = true;
      } else {
        k++;
      }
    }
  }

  if (idx == 0) {
    idx = 1;
  } else {
    xbar = CodeGenerate_ConstB.VectorConcatenate1[idx - 1];
    for (k = idx; k < 11; k++) {
      if (xbar < CodeGenerate_ConstB.VectorConcatenate1[k]) {
        xbar = CodeGenerate_ConstB.VectorConcatenate1[k];
        idx = k + 1;
      }
    }
  }

  for (k = 0; k < 11; k++) {
    if (k + 1 != idx) {
      u_[(int32_T)j - 1] = CodeGenerate_ConstB.VectorConcatenate1[k];
      j++;
    }
  }

  xbar = u_[0];
  for (idx = 0; idx < 9; idx++) {
    xbar += u_[idx + 1];
  }

  xbar /= 10.0;
  j = 0.0;
  scale = 3.3121686421112381E-170;
  for (idx = 0; idx < 10; idx++) {
    absdiff = fabs(u_[idx] - xbar);
    if (absdiff > scale) {
      t = scale / absdiff;
      j = j * t * t + 1.0;
      scale = absdiff;
    } else {
      t = absdiff / scale;
      j += t * t;
    }
  }

  j = scale * sqrt(j);
  j /= 3.1622776601683795;

  /* End of MATLAB Function: '<S4>/MATLAB Function2' */

 总结

         以上就是本人拆解Simulink模块自动生成代码时,讲解的最后一部分。主要针对Simulink的Matlab Function模块,展示了这类模块的使用方法,并对比了相应的C代码。

         欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成为笔者持续分享的动力。

         另外,上述例程使用的Demo工程可以到笔者的主页查找和下载。


         版权声明:原创文章,转载和引用请注明出处和链接,侵权必究!

数学建模竞赛攻坚实战:从赛题剖析到论文冲刺的完整策略 数学建模是将实际问题抽象为数学模型,并通过算法求解与结果分析来提供决策支持的关键技术。其核心原理在于通过数学语言描述现实世界中的变量与约束,并运用优化、预测、仿真等方法寻找最优或可行解。这一技术价值在于能够系统化、定量化地解决复杂工程与管理问题,提升决策的科学性与效率。在应用场景上,数学建模广泛应用于物流优化、资源分配、金融风险分析、工业仿真等多个领域。本文聚焦于数学建模竞赛这一高强度实践场景,深入探讨了如何通过系统性的问题拆解、模型融合与创新,以及高效的团队协作与时间管理,来攻克竞赛中的核心难点。文中特别 阅读详情

相关推荐

网络系统实现技术之IPX与SPX

IPX/SPXNovell NetWare网络Novell公司为适应网络发展,将主机网络转换为PC网络,开发了Novell NetWare网络系统。该系统中基于客户机/服务器模式。以普通PC机做为客户机,以性能强大的服务器做为服务器,为客户机提供文件服务、数据库服务及其他服务。与前面的SNA模型一样,Novell NetWare也早于OSI模型,所以不能与OSI模型严格对应,但也有很明

成片的大树 9164

isNaN()函数讲解

isNaN() 这个函授接收一个参数,该参数可以是任意类型,而函数会帮我们确定这个参数是否“不是数值”;isNaN()在接收到一个值之后,会尝试将这个值转换为数值,如果能成功转换则返回false,否则返回true; 语法 isNaN(value) 参数 value:要被检测的值 返回值 如果给定的值能被转换为数字,则返回false;如果不能转换为数字,则返回true; 注意 如果想要判断一个值是否严格的等于NaN,推荐使用Number.isNaN()方法,此方法会判断传入的值是否为NaN这

qq_40117020的博客 3万+

水下井口装置及钻杆建模

内容:海上油气资源开采的过程中,通常会由海上钻井平台下入钻杆连接到海底井口装置。OrcaFlex软件可进行各种海洋工程结构动态分析,通过各项数据的输入,能够很方便地进行水下井口装置及钻杆建模。直接使用软件New Line及new vessel功能,再设置模型的各项参数(几何属性、弯曲刚度、轴线刚度、扭转刚度、泊松比等)即可建成井口装置及钻杆模型。 设置管线的几何属性:主要包括管线的内外径、壁厚、...

s0302017的博客 1148

NaN类型和isNaN()函数,及变量绝对值

NaN  及“not a number”,在什么时候会出现呢,就是当不能转为number的变量进行转化为number的时候,比如parseInt(value),value比如是abc就会报这个错误,         在js中没有任何一种数据类型和NaN相等,就算是NaN和NaN都不想等.         那么我们如何判断某个变量是否是NaN类型呢,那么就采用isNaN()函数,如果是则返回tr

u014492098的专栏 1024

网格自适应实战 | 攻克超弹性体大变形不收敛难题

本文针对超弹性体(如橡胶)在大变形仿真中因网格严重扭曲导致计算不收敛的难题,提供了基于ANSYS网格自适应技术的实战解决方案。文章详细阐述了从问题诊断、模型准备到核心参数设置的完整流程,并介绍了结合混合U-P单元技术的进阶组合策略,有效攻克了材料压缩等场景下的仿真收敛问题。

week9的博客 523

手把手教你用ObjectCRX进行Caxa二次开发:从零开始的环境搭建教程

本文是一份面向零基础初学者的Caxa二次开发实战指南,重点讲解如何使用ObjectCRX框架从零开始搭建开发环境。内容涵盖Visual Studio 2015版本锁定、ObjectCRX向导集成、项目创建、典型错误解决,并最终实现一个可在Caxa中运行的HelloWorld程序,帮助开发者快速入门并避开常见陷阱。

w3x4y的博客 514

【Simulink专题】Simulink模型设置(一):求解器、数据导入/导出、数学和数据类型的设置

Simulink中模型设置是关乎着整个模型的运行模式以及代码生成样式,不同的设置关乎着不同的结果,今天就给大家讲解下作者对整个模型设置的理解,有疑问的地方还需要大家多多指出,谢谢使用版本:MATLAB 2022a

博客 2万+

从YOLOv8到RTDETR:如何将训练后的YOLO指标无缝转换为COCO格式

本文详细介绍了如何将训练后的YOLOv8指标无缝转换为COCO格式,特别适用于RTDETR模型的评估。通过数据准备、指标转换流程和实际项目经验,帮助开发者解决YOLO与COCO指标差异问题,提升模型评估的准确性和权威性。

weixin_29085151的博客 378

Simulink算法建模: 状态机基础

文章目录1 Simulink中的Chart模块2 状态机建模3 模型仿真4 代码生成5 总结 本文研究简单的状态机建模及其生成的代码。 1 Simulink中的Chart模块 Chart模块用于描述状态之间的跳转关系,在汽车软件开发过程中经常用到。在状态机中需要定义状态、状态间跳转条件、输入输出及本地变量等。本文会用一个简单的例子来研究状态机建模,并通过生成的代码了解其中的原理。 2 状态机建模 假如现在有一个需求,车速高于某个值的时候,输出变量为运动状态,低于该值的时候为静止状态。针对该问题第一反应是用

u013288925的博客 1万+

控制科学与工程(自动化)保研经验【4】——浙大篇

控制科学与工程(自动化)保研经验【4】——浙大篇

Control Everything 1万+

【以太网硬件十九】SGMII到底能不能直接出光模块?

详细解释为什么SGMII可以直接出光模块及其使用限制

highman110的博客 1万+

simulink实现标准IEEE33配电网系统,50HZ,将各节点数据统计起来输出到工作区

两年前我在做双馈风机并网课题时,被powergui的潮流计算坑惨了——这货遇到电力电子装置直接躺平不干活。simulink实现标准IEEE33配电网系统,50HZ,将各节点数据统计起来输出到工作区,再matlab中跑出某时刻节点电压分布,适合用于观察某时刻节点电压变化情况。当接入双馈风机时,对比接入前后的电压曲线(见图2),能明显看到无功支撑效果。这套方法虽然有点野路子,但在处理含新能源的配电网时意外好用。#特别是当用于接入双馈风机时,用powergui无法进行潮流计算,通过此方法能过很好的解决此问题。

2503_93923387的博客 345

鱼鹰优化算法(OOA)详解:从猛禽捕食智能到优化算法实现

鱼鹰优化算法(Osprey Optimization Algorithm, OOA)是2023年提出的一种新型元启发式优化算法,灵感来源于鱼鹰(一种中型猛禽)高效的捕食策略。算法模拟了鱼鹰从空中识别水下鱼类位置并俯冲捕食,然后将捕获的鱼带至安全位置享用的全过程,以此抽象出全局探索和局部开发两个核心阶段。OOA算法具有参数少、结构简单、收敛速度快、全局寻优能力强等特点。自提出以来,已在函数优化、机器学习参数调优(如CatBoost模型)、路径规划等多个领域展现出良好性能,为解决复杂优化问题提供了新的有效工具。

qq_42212808的博客 273

Simulink在50HZ配电网系统中的应用:IEEE33标准下的节点数据统计与电压分布分析

simulink实现标准IEEE33配电网系统,50HZ,将各节点数据统计起来输出到工作区,再matlab中跑出某时刻节点电压分布,适合用于观察某时刻节点电压变化情况。simulink实现标准IEEE33配电网系统,50HZ,将各节点数据统计起来输出到工作区,再matlab中跑出某时刻节点电压分布,适合用于观察某时刻节点电压变化情况。当接入双馈风机时,对比接入前后的电压曲线(见图2),能明显看到无功支撑效果。#特别是当用于接入双馈风机时,用powergui无法进行潮流计算,通过此方法能过很好的解决此问题。

2502_94431433的博客 406

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Simulink在50HZ配电网系统中的应用:IEEE33标准节点数据统计与电压分布分析

simulink实现标准IEEE33配电网系统,50HZ,将各节点数据统计起来输出到工作区,再matlab中跑出某时刻节点电压分布,适合用于观察某时刻节点电压变化情况。simulink实现标准IEEE33配电网系统,50HZ,将各节点数据统计起来输出到工作区,再matlab中跑出某时刻节点电压分布,适合用于观察某时刻节点电压变化情况。当接入双馈风机时,对比接入前后的电压曲线(见图2),能明显看到无功支撑效果。#特别是当用于接入双馈风机时,用powergui无法进行潮流计算,通过此方法能过很好的解决此问题。

qq__18080951的博客 175

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

基于Simulink与MATLAB的50HZ IEEE33配电网系统节点电压分析:接入双馈风机...

两年前我在做双馈风机并网课题时,被powergui的潮流计算坑惨了——这货遇到电力电子装置直接躺平不干活。simulink实现标准IEEE33配电网系统,50HZ,将各节点数据统计起来输出到工作区,再matlab中跑出某时刻节点电压分布,适合用于观察某时刻节点电压变化情况。当接入双馈风机时,对比接入前后的电压曲线(见图2),能明显看到无功支撑效果。这套方法虽然有点野路子,但在处理含新能源的配电网时意外好用。#特别是当用于接入双馈风机时,用powergui无法进行潮流计算,通过此方法能过很好的解决此问题。

learun7的博客 749

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数学建模竞赛全流程实战:从问题解析到论文写作的建模思维与代码实践

数学建模是将现实世界复杂问题抽象为数学模型,并通过计算求解的核心方法。其基本原理在于通过定义变量、构建目标函数与约束条件,将模糊需求转化为可量化、可计算的数学问题。这一过程的技术价值在于提供了一种系统性的问题分析与解决框架,广泛应用于工程优化、资源调度、数据分析与预测等场景。在数学建模竞赛等实践活动中,掌握从问题界定、模型选择、算法实现到结果验证的全流程至关重要。本文以2024年五一杯A题为切入点,深入探讨了建模思维与求解逻辑,并分享了Python与MATLAB在模型实现、特别是优化求解与结果可视化方面的工

weixin_30698527的博客 383
上一篇: 深入拆解Simulink自动生成代码(四)——状态机
下一篇: 大道至简,骨灰级拆解Simulink处理CAN消息的几种不同方式(一)——直接调用.dbc文件方式
Mr.Cssust
Mr.Cssust 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄9年 8610粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Cssust

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值