基于STM32的各种数学函数优化计算方法(代码开源)

前言:本文为手把手教学 STM32 的数学计算公式优化方法的教程,本教程的 MCU 使用 STM32F103ZET6 。本篇博客将使用非传统数学库计算手段进行各种数学函数的计算,优化的数学计算包括:sin()cos()arctan()arcsin() 1/sqrt()。作为研发的项目产品,实现产品功能往往是很容易的,最重要的核心其实是产品功能的优化,以最优的控制亦或是消耗时间去完成制定的任务,算法优化就是如此。本篇博客将给作者们提供嵌入式工程中常用的数学函数优化代码,希望该博文能给读者朋友的工程项目给予些许帮助(代码开源)。

算法应用平台:STM32F103ZET6;

算法优化情况:

sin() 函数优化:

Q_rsqrt() 函数优化:

一、STM32的数学计算

1.1 STM32数学计算概述

STM32 是 STMicroelectronics 生产的一系列 32 位 ARM Cortex-M 微控制器。它们广泛应用于工业、消费和医疗等领域。STM32 微控制器支持各种数学计算,包括但不限于:

1、算术运算加法、减法、乘法、除法等基本运算。

2、浮点运算STM32F系列微控制器支持单精度和双精度浮点运算。

3、三角函数正弦、余弦、正切等。

4、指数和对数函数e的x次幂、自然对数、常用对数等。

5、根号和幂运算平方根、立方根、x的y次幂等。

针对这些数学计算,STM32 通常提供硬件浮点单元 FPU 和一些数学库。使用这些功能可以大大提高计算速度和精度。

本篇博客的数学函数优化与传统 STM32 的 Math 库的数学函数进行对比!!! 

1.2 算法优化作用

算法优化是指在保证算法结果正确的前提下,通过改进算法的效率、资源消耗、可读性等方面,使得算法在执行速度、内存使用、能耗等方面得到提升的过程。算法优化的作用主要体现在以下几个方面:

1、提高执行速度优化算法可以减少不必要的计算步骤,提高算法的执行效率,从而减少程序的运行时间。

2、增强用户体验在用户界面和交互式应用中,算法优化可以减少等待时间,提高用户体验。

3、提高稳定性优化算法可以减少程序的出错概率,提高系统的稳定性。

4、提高可维护性优化后的算法结构更加清晰,逻辑更加简单,便于后续的维护和升级。

5、增强竞争力在商业应用中,算法优化可以提高产品的性能,增强企业的市场竞争力。

6、节能环保对于嵌入式系统和移动设备,算法优化可以减少能耗,延长电池寿命,符合节能减排的要求。

如今,各种项目中都需要涉及到算法优化,包括:巡线小车、送药小车竞赛、电源设计、自动驾驶的智驾、目标追踪与飞行器。

二、STM32使用定时器实现<获取代码块运算时间>的功能

2.1 STM32的代码块消耗时间

STM32 的代码都是利用 CPU 进行计算和实现的,故代码每步都需要消耗一定的时间才能完成该指定任务。各种代码亦或是算法需要消耗的时间是完全完全不相同的,本篇博客利用 STM32 的定时器来计算 <代码块的运行时间>,从而判断算法或代码的优劣情况!

统计 <代码块的运行时间> 的手段:(1)、逻辑分析仪;(2)、定时器读取时间;(3)、打断点记录时间;

1、利用逻辑分析仪去统计;

在待测程序段的开始阶段使单片机的一个GPIO输出高电平,在待测程序段的结尾阶段再令这个GPIO输出低电平。用示波器或者逻辑分析仪通过检查高电平的时间长度,就知道了这段代码的运行时间。

while(1){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB1置1delay_ms(500);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);	//PB1置0delay_ms(500);
}

延时500ms时波形如下: 

修改延时为100ms;

while(1){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB1置1delay_ms(100);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);	//PB1置0delay_ms(100);}

波形如下

总结:

使用示波器测量较为准确,缺点是需要单独的示波器或者逻辑分析仪等,示波器一般体积较大的还需要供电,并且还要连接GPIO口,还是有点麻烦的

2、利用定时器读取时间;

利用 TIM2->CNT 与 TIM2 的需要时间来统计代码块消耗的时间;

3、打断点记录时间;

推荐博客地址:http://t.csdnimg.cn/K9fyE

利用J-LINK或者ST-link 等仿真器,实现对代码运行时间的测量,首先要设置仿真器仿真的实际频率;

点击 Settings 设置

然后点击Trace 设置我们芯片的系统频率,点击Teace Enable 使能

如果工作频率设置不正确,则会造成测量的时间不正确。

仿真器默认采用的是10MHz的工作频率

点击 DEBUG 模式;

2.2 CubeMX配置

本篇博客使用 STM32 的 TIM2 来统计代码块的消耗时间

1、RCC配置外部高速晶振(精度更高)——HSE;

2、SYS配置:Debug设置成Serial Wire(否则可能导致芯片自锁);

3、TIM配置:利用TIM2来读取代码块的消耗时间;

为实现<获取代码块运行时间>的功能,定时器的频率越高,那获取的时间就越精确。 因此我们不分频,TIM2 挂在 APB1 上,因此这样配置TIM2的时钟频率是 72MHz。 也就是说,定时器每计一个数,代表过去时间 1/72Mhz s,即 13.8888888888889 ns。本例中TIM2的计数周期设为最大,即 (2^16)-1。 即,每过 (2^16) * (1/72Mhz) s ≈ 0.00091s,才会触发定时器计数溢出的中断。通常我们认为需测试的代码块运行时间是us级的,是肯定不会超过 0.00091s 的(读者可以自己改为 2^32 来增加上限)。 因此实现<获取代码块运行时间>的功能,是需要在代码块运行开始前,将TIM2的计数器设置为0。 在代码块运行结束时,把 TIM2 的计数器数值 N 读出。代码块的运行时间用 N*13.8888888888889(ns) 表示。 另外,值得一提的是,这个定时器,只有在使用时才会工作,测试运行时间完毕后,可以关闭,定时器各类中断也完没有必要开启。即,仅使用占用少量的CPU资源,不使用时,完全不会占用CPU资源。

4、USART1 配置:利用串口 1 打印出代码块消耗的时间;

5、工程配置:

2.3 代码

这段代码的核心是利用 TIM2 的每次触发时间(作者的 TIM2 每次触发周期时间为 13.8888888888889 ns),通过计算代码块开始与结束时候的 TIM2 触发次数 TIM->CNT 与 TIM2 的触发时间来得到代码块所需消耗的时间。

runtime.h

/********************************* (C) COPYRIGHT **********************************
* File Name						: runtime.h
* Author						: 混分巨兽龙某某
* Version						: V1.0.0
* Data							: 2024/04/12
* Contact						: QQ:1178305328
* Description					: A function that calculates the running time of a block of code
***********************************************************************************/
#ifndef __USERPROGRAM_RUNTIME_H
#define __USERPROGRAM_RUNTIME_Hextern float runtime;void runtime_start(void);
void runtime_stop(void);#endif

runtime.c

/********************************* (C) COPYRIGHT **********************************
* File Name						: runtime.c
* Author						: 混分巨兽龙某某
* Version						: V1.0.0
* Data							: 2024/04/12
* Contact						: QQ:1178305328
* Description					: A function that calculates the running time of a block of code
***********************************************************************************/
#include "runtime.h"
#include "tim.h"/* 代码块运行时间变量 */
float runtime = 0;/*** @brief       代码块开始计算时间* @param       None* @retval      */
void runtime_start(void){TIM2->CNT       = 0x00;HAL_TIM_Base_Start(&htim2);
}/*** @brief       代码块结束计算时间* @param       None* @retval      */
void runtime_stop(void){    runtime = TIM2->CNT * 0.013888888889;		/* TIM->CNT×的数值需要根据实际情况设置 */HAL_TIM_Base_Stop(&htim2);
}​

2.4 代码块耗时实例

三、优化三角函数算法

3.1 sin函数优化

本篇博客利用泰勒级数展开来进行 sin() 函数的优化!!!

勒级数是一种数学上用无限多项的序列来表示函数的方法,这里使用的是正弦函数在0点附近的泰勒展开。

sin() 函数的泰勒级数展开是:

sin_code:

/*** @brief       利用泰勒级数计算sin(x)的近似值* @param       x: 计算的弧度* @param       n: 泰勒级数的项数* @retval      sin函数数值*/
float my_sin(float x,int n) 
{float term = x; // 第一项是 xfloat sin_x = 0.0; // sin(x)的累加结果for (int i = 1; i <= n; i++) {sin_x += term; // 累加当前项term *= -x * x / ((2 * i) * (2 * i + 1)); // 计算下一项}return sin_x;
}

sin() 函数优化的对比:

算法中的 n 也就是泰勒级数的阶数,该数值将影响 sin()函数的最终输出精度,但是 n 的数值越大,算法计算消耗的时间也越长!

3.2 cos函数优化

本篇博客利用泰勒级数展开来进行 cos() 函数的优化!!!

勒级数是一种数学上用无限多项的序列来表示函数的方法,这里使用的是余弦函数在0点附近的泰勒展开。

cos() 函数的泰勒级数展开是:

cos_code:

/*** @brief       利用泰勒级数计算cos(x)的近似值* @param       x: 计算的弧度* @param       n: 泰勒级数的项数* @retval      cos函数数值*/
float my_cos(float x,int n) 
{return my_sin(x+M_PI/2,n);//奇变偶不变,符号看象限
}

cos() 函数优化的对比:

算法中的 n 也就是泰勒级数的阶数,该数值将影响 cos()函数的最终输出精度,但是 n 的数值越大,算法计算消耗的时间也越长! 

3.3 arctan函数优化

反三角函数中的反正切函数(arctan或atan)可以使用麦克劳林级数(Taylor series at 0)来近似计算。反正切函数的麦克劳林级数展开是:

对于接近 0 的 x 值,这个级数是收敛的。 

arctan_code: 

/*** @brief       利用反正切麦克劳林展开式求解arctan * @param       x: 计算的数值,范围(-1,1)* @retval      arctan函数求解的弧度 * @note        阶数越高,值越准确   70°以内是准确的*/
float arctan(float x)  
{float t = x;float result = 0;float X2 = x * x;unsigned char cnt = 1;do{result += t / ((cnt << 1) - 1);t = -t;t *= X2;cnt++;}while(cnt <= 6); //仅计算前6项return result;
}

arctan函数耗时情况:

3.4 arcsin函数优化

反正弦函数(arcsin或asin)的麦克劳林级数展开是:

这个级数对于 [-1,1] 之间的 x 值是收敛的。 

arcsin_code: 

/*** @brief       利用反正切麦克劳林展开式求解arcsin * @param       x: 计算的数值,范围(-1,1)* @retval      arcsin函数求解的弧度 * @note        阶数越高,值越准确   42°以内是准确的*/
float arcsin(float x)  
{float d=1;float t=x;unsigned char cnt = 1;float result = 0;	float X2 = x*x;if (x >= 1.0f) {return PI_2;}if (x <= -1.0f) {return -PI_2;}do{result += t / (d * ((cnt << 1) - 1));t *= X2 * ((cnt << 1) - 1);//d *= (cnt << 1);//2 4 6 8 10 ...cnt++;}while(cnt <= 6);return result;
}

arcsin函数耗时情况:

四、快速开平方根倒数算法

4.1 Q_rsqrt概述

推荐博客地址:http://t.csdnimg.cn/JuyNH

快速开平方根倒数(Fast Inverse Square Root)算法是一种用于计算一个数的平方根倒数的快速方法,它最初在《雷神之锤III竞技场》的源代码中被发现,并因其独特性和效率而广为人知。这个算法的核心思想是利用浮点数的特性来快速近似计算平方根倒数。

​​​​​​​

算法的核心:利用浮点数的表示方法。在IEEE 754标准中,浮点数由三部分组成:符号位、指数和尾数(或称小数部分)。算法首先将输入的浮点数转换为长整型,然后对这个整型值进行位操作,以得到一个近似的平方根倒数。

该算法的步骤如下:

1. 将浮点数 number 转换为长整型 i。
2. 对 i 进行位操作,得到一个近似的平方根倒数的整数表示。这个操作是通过一个神奇的常数 0x5f3759df 和一个右移操作来完成的。这个常数是经过优化的,它能够产生一个接近于 number 的平方根倒数的近似值。
3. 将得到的整型值转换回浮点数 mongodb。
4. 使用牛顿迭代法(Newton’s method)对 mongodb 进行一次迭代,以提高结果的精度。牛顿迭代法是一种用于求解方程的近似根的方法,它通过迭代的方式来逼近实际的平方根倒数。

 最终,算法返回迭代后的结果 y,这个值就是 number 的平方根倒数的近似值。

4.2 代码实现

Q_rsqrt_code:

/*** @brief       快速计算平方根倒数数值* @param       x: 计算的数* @retval      目标数值*/
float Q_rsqrt(float number)
{long i;float x2, y;const float threehalfs = 1.5F;x2 = number * 0.5F;y  = number;i  = * ( long * ) &y;                      i  = 0x5f3759df - ( i >> 1 );               y  = * ( float * ) &i;y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration (第一次牛顿迭代)return y;
}

五、优化算法完整代码

myalgorithm.h:

/********************************* (C) COPYRIGHT **********************************
* File Name						: myalgorithm.h
* Author						: 混分巨兽龙某某
* Version						: V1.0.0
* Data							: 2024/04/12
* Contact						: QQ:1178305328
* Description					: This blog compiled optimization algorithm code
***********************************************************************************/
#ifndef __MYALGORITHM_H
#define __MYALGORITHM_H/* 优化三角函数 */
float my_sin(float x, int n);
float my_cos(float x, int n);
float arctan(float x);
float arcsin(float x);/* 优化快速开平方根倒数 */
float Q_rsqrt(float number);#endif

 myalgorithm.c:

/********************************* (C) COPYRIGHT **********************************
* File Name						: myalgorithm.c
* Author						: 混分巨兽龙某某
* Version						: V1.0.0
* Data							: 2024/04/12
* Contact						: QQ:1178305328
* Description					: This blog compiled optimization algorithm code
***********************************************************************************/
#include "myalgorithm.h"
#include "math.h"/* PI变量 */
float M_PI = 3.14159265358;
const float PI_2 = 1.570796f;/*** @brief       利用泰勒级数计算sin(x)的近似值* @param       x: 计算的弧度* @param       n: 泰勒级数的项数* @retval      sin函数数值*/
float my_sin(float x,int n) 
{float term = x; // 第一项是 xfloat sin_x = 0.0; // sin(x)的累加结果for (int i = 1; i <= n; i++) {sin_x += term; // 累加当前项term *= -x * x / ((2 * i) * (2 * i + 1)); // 计算下一项}return sin_x;
}/*** @brief       利用泰勒级数计算cos(x)的近似值* @param       x: 计算的弧度* @param       n: 泰勒级数的项数* @retval      cos函数数值*/
float my_cos(float x,int n) 
{return my_sin(x+M_PI/2,n);//奇变偶不变,符号看象限
}/*** @brief       利用反正切麦克劳林展开式求解arctan * @param       x: 计算的数值,范围(-1,1)* @retval      arctan函数求解的弧度 * @note        阶数越高,值越准确   70°以内是准确的*/
float arctan(float x)  
{float t = x;float result = 0;float X2 = x * x;unsigned char cnt = 1;do{result += t / ((cnt << 1) - 1);t = -t;t *= X2;cnt++;}while(cnt <= 6); //仅计算前6项return result;
}/*** @brief       利用反正切麦克劳林展开式求解arcsin * @param       x: 计算的数值,范围(-1,1)* @retval      arcsin函数求解的弧度 * @note        阶数越高,值越准确   42°以内是准确的*/
float arcsin(float x)  
{float d=1;float t=x;unsigned char cnt = 1;float result = 0;	float X2 = x*x;if (x >= 1.0f) {return PI_2;}if (x <= -1.0f) {return -PI_2;}do{result += t / (d * ((cnt << 1) - 1));t *= X2 * ((cnt << 1) - 1);//d *= (cnt << 1);//2 4 6 8 10 ...cnt++;}while(cnt <= 6);return result;
}/*** @brief       快速计算平方根倒数数值* @param       x: 计算的弧度* @retval      目标数值*/
float Q_rsqrt(float number)
{long i;float x2, y;const float threehalfs = 1.5F;x2 = number * 0.5F;y  = number;i  = * ( long * ) &y;                      i  = 0x5f3759df - ( i >> 1 );               y  = * ( float * ) &i;y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration (第一次牛顿迭代)return y;
}

六、代码开源

代码地址: 【免费】基于STM32的各种数学函数优化计算方法代码资源-CSDN文库

如果积分不够的朋友,点波关注评论区留下邮箱,作者无偿提供源码和后续问题解答。求求啦关注一波吧 !!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/345811.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python魔法之旅专栏(导航)

目录 推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、博客个人主页 首先&#xff0c;感谢老铁们一直以来对我的支持与厚爱&#xff0c;让我能坚持把Python魔法方法专栏更新完毕&#xff01; 其次&#xff0c;为了方便大家查阅&#xff0c;我将此专栏…

NetSuite精益实施 之 系统切换作业标准化

这个题目为近日所思&#xff0c;一直没有落笔。今天是端午假日&#xff0c;得空卸货。 标准化是精益实施的三个基础之一&#xff0c;在我们的项目实践中没有须臾忘记。在此我们不再赘述标准化为啥这么重要&#xff0c;更多来分享如何标准化。 在项目实施的各阶段中&#xff0…

冯喜运:6.10周一黄金原油行情趋势分析及独家操作建议

【黄金消息面分析】&#xff1a;上周全球金融市场惊现戏剧性大逆转&#xff0c;美国多项经济数据证实劳动力市场降温&#xff0c;9月降息重返视野令全球风险情绪几乎陷入狂热状态&#xff0c;全球股市接连创新高&#xff0c;但上周五意外“爆表”的非农令市场惊现大逆转&#x…

【LeetCode】39.组合总和

组合总和 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个…

c#未能加载基类System错误 这台计算机上缺少此项目引用的 NuGet 程序包

拷贝代码到另一台计算机运行&#xff0c;打开Form1.cs报错 首先确认package的框架 如果是472&#xff0c;则更换472的框架 打开项目->xx属性&#xff0c;进行修改 如果框架正确&#xff0c;就是未识别到程序包 可以参考&#xff1a; https://www.cnblogs.com/txwtech/p/1…

深入ES6:解锁 JavaScript 类与继承的高级玩法

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;Class&#x1f35f;1 类的由来&#x1f35f;2 co…

一、Socket创建和连接

C网络编程&#xff08;asio&#xff09; 文章目录 C网络编程&#xff08;asio&#xff09;1、Asio概述2、网络编程基本流程2、创建socket3、创建监听socket4、绑定accpet监听套接字5、连接指定的端点6、服务器接收连接 点击查看代码 1、Asio概述 ​ Asio起源于Boost库&#xf…

Kafka 架构

1 整体架构 1.1 Zookeeper Zookeeper 是一个分布式协调服务&#xff0c;用于管理 Kafka 的元数据。它负责维护 Kafka 集群的配置信息、Broker 列表和分区的 Leader 信息。 Zookeeper 确保了 Kafka 集群的高可用性和可靠性。 但 Zookeeper 已经成为 Kafka 性能瓶颈&#xff0c;…

【Vue】获取模块内的actions方法

目标&#xff1a; 掌握模块中 action 的调用语法 (同理 - 直接类比 mutation 即可) 注意&#xff1a; 默认模块中的 mutation 和 actions 会被挂载到全局&#xff0c;需要开启命名空间&#xff0c;才会挂载到子模块。 调用语法&#xff1a; 直接通过 store 调用 $store.di…

【Linux多线程】线程的终止、等待和分离

文章目录 线程终止正常退出return 退出pthread_exit函数终止线程 pthread_cancel强制终止线程进程终止 线程等待为什么需要等待线程&#xff1f;pthread_join函数 分离线程pthread_detach函数 线程终止 下面给出终止线程的三种方式&#xff1a; 正常退出&#xff1a; 线程执行…

【深度学习】PuLID: Pure and Lightning ID Customization via Contrastive Alignment

论文&#xff1a;https://arxiv.org/abs/2404.16022 代码&#xff1a;https://github.com/ToTheBeginning/PuLID 文章目录 AbstractIntroductionRelated WorkMethods Abstract 我们提出了一种新颖的、无需调整的文本生成图像ID定制方法——Pure and Lightning ID customizatio…

机器学习笔记 - LoRA:大型语言模型的低秩适应

一、简述 1、模型微调 随着大型语言模型 (LLM) 的规模增加到数千亿,对这些模型进行微调成为一项挑战。传统上,要微调模型,我们需要更新所有模型参数。这也称为完全微调 (FFT) 。下图详细概述了此方法的工作原理。 完全微调FFT 的计算成本和资源需求很大,因为更新每…

Vue TypeScript 实战:掌握静态类型编程

title: Vue TypeScript 实战&#xff1a;掌握静态类型编程 date: 2024/6/10 updated: 2024/6/10 excerpt: 这篇文章介绍了如何在TypeScript环境下为Vue.js应用搭建项目结构&#xff0c;包括初始化配置、创建Vue组件、实现状态管理利用Vuex、配置路由以及性能优化的方法&#x…

拐点已至:企业如何借助AI重塑增长?

2024年的激进增长与AI数智化创新并行&#xff0c;传统策略的功效已经减弱。在这篇文章中&#xff0c;我们将展望并深度探索2024年的6大创新增长策略&#xff0c;包括AI驱动的实验&#xff0c;产品再造&#xff0c;超个性化&#xff0c;自动化运营&#xff0c;短视频和KOL营销等…

Kimichat使用案例010:快速识别出图片中的表格保存到Excel

文章目录 一、介绍二、图片信息三、输入内容四、输出内容五、markdown提示词六、markdown输出一、介绍 如果有一张图片格式的表格,想要快速复制到Excel表格中,那么一般要借助于OCR工具。之前试过不少在线OCR工具,识别效果差强人意。其实,kimichat就可以非常好的完成这个任务…

RPA-UiBot6.0数据整理机器人—杂乱数据秒变报表

前言 友友们是否常常因为杂乱的数据而烦恼?数据分类、排序、筛选这些繁琐的任务是否占据了友友们的大部分时间?这篇博客将为友友们带来一个新的解决方案,让我们共同学习如何运用RPA数据整理机器人,实现杂乱数据的快速整理,为你的工作减负增效! 在这里,友友们将了…

【微信小程序开发(从零到一)】——个人中心页面的实战项目(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

锂电池寿命预测 | Matlab基于SSA-SVR麻雀优化支持向量回归的锂离子电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【锂电池剩余寿命RUL预测案例】 锂电池寿命预测 | Matlab基于SSA-SVR麻雀优化支持向量回归的锂离子电池剩余寿命预测&#xff08;完整源码和数据&#xff09; 1、提取NASA数据集的电池容量&#xff0c;以历史容量作…

搭建RocketMQ主从异步集群

搭建RocketMQ主从异步集群 1、RocketMQ集群模式 为了追求更好的性能&#xff0c;RocketMQ的最佳实践方式都是在集群模式下完成的。RocketMQ官方提供了三种集群搭建方式&#xff1a; 2主2从异步通信方式&#xff1a;使用异步方式进行主从之间的数据复制。吞吐量大&#xff0c;…

【日常记录】【JS】中文转拼音的库 pinyin-pro

文章目录 1、介绍2、pinyin-pro 基本使用3、参考链接 1、介绍 pinyin-pro 是一个专业的 JavaScript 中文转拼音的库&#xff0c;具备多音字识别准确、体积轻量、性能优异、功能丰富等特点。 常用的案例 搜索功能增强&#xff1a;在输入框输入汉字时&#xff0c;可以转化为拼音输…