算法设计中的一些核心原则

1.命名并实体化一切非自解释的概念

这是算法设计的核心原则之一。可以进一步归结为:你不可让逻辑匿名地裸露出来。你必须命名一切你知晓的概念,并且通过注释、适当的代码粒度管理,命名,妥善封装这些概念,比如:

def isShartNotPlacedCenterized(arFreq, arValue, baseFreqOfShaft, arZeroDbValue):errorSpan = 0.15ratio = arFreq[0]/baseFreqOfShaftratio = np.abs(ratio - 2)/2;if(ratio<=errorSpan):score = gp_vibration_helper.gp_getdbValuebyRawValue(arValue[0], arZeroDbValue);return (True, score);else:return (False, 0);

上面的写法是错误的。正确的写法是:

'''
功能说明:轴不对中判定版本:V1.0.20240410机制:轴不对中,二倍频谱线明显增强ParamIn:(arFreq, arValue, baseFreqOfShaft, arZeroDbValue)arFreq          低通滤波后的频谱中前N条最高幅度谱线的频率值arValue         低通滤波后的频谱中前N条最高幅度谱线的幅值baseFreqOfShart 轴频arZeroDbValue   用作db输出的系统最高幅值点ParamOut:(hasError, errorValue)hasError        有此类故障范围True,否则Falsescore           故障严重程度,[-40,0],单位db
'''
def isShartNotPlacedCenterized(arFreq, arValue, baseFreqOfShaft, arZeroDbValue):isflag2xFreqAppeared = gp_vibration_helper.gp_IsSignalAppear(arFreq[0], 2*baseFreqOfShaft);if(isflag2xFreqAppeared):dbOfSignal = gp_vibration_helper.gp_getdbValuebyRawValue(arValue[0], arZeroDbValue);if(dbOfSignal>=-40):return (True, dbOfSignal);return (False, 0);

2.在进行任何探索性工作前必须构建好桩模块

比如:在进行轴承振动分析时,你很快会在构建代码的过程中,遇到一堆问题,比如:

  • 包络计算
  • 频点计算
  • db坐标与线性坐标转换
  • 功率谱密度、功率谱、与幅度谱
  • 频谱泄露
  • 窗函数
  • 相关性分析

这个列表是无穷尽的,明白吗。如果一路走下去,你会迷失在这个知识网络里,单独拉出任何一个项点,都是10小时,甚至更多时间的阅读和仿真工作量。比如:

使用 FFT 获得功率频谱密度估计- MATLAB & Simulink- MathWorks 中国

这个时候,哪怕你做错,也必须按照错的,做完,留下类似#TODO标记,然后快速构建好整套系统,然后再回头重构。

重构这个词源自一个已经可以工作的版本。没有这个版本的存在,你的工作是未完成,得0分。一个小学生过来把接口封装好,人家领5元钱走人,你一分都不该发——你没有提供应有的服务。

你确实清楚,此时的理解是不完备的,甚至写下来就是错的;或者误差很大,无法在工程上输出稳定结果。但是,即使是错误,也值得记录下来。因为它代表着一个随时可以拿起作为参照的凝固的理解。比如这个对于轴振动故障的一份完整示例:

import numpy as np
import sys
import gp_vibration_helper '''
功能说明:isShartNotPlacedCenterized功能:轴不对中判定版本:V1.0.20240410机制:轴不对中,二倍频谱线明显增强ParamIn:(arFreq, arValue, baseFreqOfShaft, arZeroDbValue)arFreq          低通滤波后的频谱中前N条最高幅度谱线的频率值arValue         低通滤波后的频谱中前N条最高幅度谱线的幅值baseFreqOfShart 轴频arZeroDbValue   用作db输出的系统最高幅值点ParamOut:(hasError, errorValue)hasError        有此类故障范围True,否则Falsescore           故障严重程度,[-40,0],单位db
'''
def isShartNotPlacedCenterized(arFreq, arValue, baseFreqOfShaft, arZeroDbValue):isflag2xFreqAppeared = gp_vibration_helper.gp_IsSignalAppear(arFreq[0], 2*baseFreqOfShaft);if(isflag2xFreqAppeared):dbOfSignal = gp_vibration_helper.gp_getdbValuebyRawValue(arValue[0], arZeroDbValue);if(dbOfSignal>=-40):return (True, dbOfSignal);return (False, 0);'''isShartNotPlacedCenterized功能:轴不平衡判定,机制:轴不平衡,一倍频谱线明显增强版本:V1.0.20240410ParamIn:(arFreq, arValue, baseFreqOfShaft, arZeroDbValue)arFreq          低通滤波后的频谱中前N条最高幅度谱线的频率值arValue         低通滤波后的频谱中前N条最高幅度谱线的幅值baseFreqOfShart 轴频arZeroDbValue   用作db输出的系统最高幅值点ParamOut:(hasError, errorValue)hasError        有此类故障范围True,否则Falsescore           故障严重程度,[-40,0],单位db
'''
def isShartLoadNotCenterized(arFreq, arValue, baseFreqOfShart, arZeroDbValue):isflag2xFreqAppeared = gp_vibration_helper.gp_IsSignalAppear(arFreq[0], baseFreqOfShaft);if(isflag2xFreqAppeared):dbOfSignal = gp_vibration_helper.gp_getdbValuebyRawValue(arValue[0], arZeroDbValue);if(dbOfSignal>=-40):return (True, dbOfSignal);return (False, 0);'''gpGetShaft_HealthScore功能:轴故障判定机制:返回不对中,不平衡的判断结果[百分制]版本:V1.0.20240410ParamIn:(fft_abs_array, scaleOfFreq, baseFreqOfShaft)fft_abs_array   原始振动加速度采样值的幅度值序列,单位幅度scaleOfFreq     加速度序列的档位,单位HzbaseFreqOfShart 轴频ParamOut:(scoreOfShaftLoad, scoreOfShartCenter)scoreOfShaftLoad    轴平衡健康度[0,100]scoreOfShartCenter  轴对中健康度[0,100]
'''
def gpGetShaft_HealthTestResult(dbView_fftOfVirbation, scaleOfFreq, baseFreqOfShaft):(arFreq, arValue) = gp_vibration_helper.gp_getdbValuebyRawValue(dbView_fftOfVirbation, scaleOfFreq, baseFreqOfShaft)if(arValue[0]<-40): #小于40db健康return (100, 100)maxValueInFullFreqRange = np.max(dbView_fftOfVirbation);(errLoad, dbLoad) = isShartLoadNotCenterized(arFreq, arValue, baseFreqOfShaft, maxValueInFullFreqRange);(errCenter, dbCenter) = isShartLoadNotCenterized(arFreq, arValue, baseFreqOfShaft, maxValueInFullFreqRange);scoreOfShartLoad = 100;scoreOfShartCenter = 100;if(errLoad):errorPercent = 100/40*(dbLoad-(-40.0))scoreOfShaftLoad = 100 - errorPercent;if(errCenter):errorPercent = 100/40*(dbCenter-(-40.0))scoreOfShartCenter = 100 - errorPercent;return (scoreOfShartLoad, scoreOfShartCenter);

它不对,不够准确,但是这是你现阶段的一份可能输出物,这就够了。

【待续...】

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

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

相关文章

(Oracle)SQL优化案例:隐式转换优化

项目场景 项目现场的某个kettle模型执行非常缓慢&#xff0c;原因在于某个SQL执行效率非常的低。甲方得知此事要求公司赶紧优化&#xff0c;负责该模块的同事对SQL优化并不熟悉。所以作为一个立志成为优秀DBA的ETL工程师&#xff0c;我自告奋勇&#xff1a;不是DBA&#xff0c;…

ES6 关于Class类的继承 extends(2024-04-10)

1、简介 类Class 可以通过extends关键字实现继承&#xff0c;让子类继承父类的属性和方法。extends 的写法比 ES5 的原型链继承&#xff0c;要清晰和方便很多。 class Foo {constructor(x, y) {this.x x;this.y y;console.log(父类构造函数)}toString() {return ( this.x …

《由浅入深学习SAP财务》:第2章 总账模块 - 2.7 总账模块报表 -2.7.1 对外报表:资产负债表及利润表

总账模块报表既包括对外报告的资产负债表、损益表、现金流量表&#xff0c;也包括企业自身用于查询和分析的各类报表&#xff0c;如科目余额表等。 2.7.1 对外报表&#xff1a;资产负债表及利润表 在SAP中&#xff0c;出具资产负债表和利润表的标准方法是先在后台建立一套“会…

971: 统计利用先序遍历创建的二叉树的深度

解法&#xff1a; 1.先序遍历创建二叉树链表形式 2.求二叉树的深度 用后序遍历实现&#xff1a; 1.后序遍历求节点A左右子树高度 2.对节点A&#xff1a; 1.取左右子树较大高度 2.返回高度1&#xff08;即以节点A为根节点的子树的最大深度&#xff09; 例如 #include <ios…

LINUX命令行后台运行matlab程序

UBUNTU安装了matlab&#xff0c;需要后台运行matlab程序。 一、MobaXterm程序&#xff08;非后台&#xff09; 使用mobaxterm程序&#xff0c;ssh连接ubuntu&#xff0c;在对应账号中输入matlab&#xff0c;即可基于mobaxterm自带的Xserver可视化界面&#xff0c;打开matlab界…

多多采集器使用指南 拼多多商家爬虫工具介绍

多多采集器是一款功能强大的数据采集工具&#xff0c;特别适用于拼多多商家爬虫任务。它可以帮助用户快速、高效地采集拼多多商家的信息&#xff0c;并提供了丰富的数据处理和导出功能。本文将介绍多多采集器的基本使用方法&#xff0c;并附带示例代码来演示如何使用多多采集器…

RobotFramework功能自动化测试框架基础篇

概念 RobotFramework是什么&#xff1f; Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端或者接口&#xff0c;可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试…

网页的基本结构

VScode中HTML的自动补全&#xff1a; 自动补全&#xff1a;例如标签 <h1></h1> 1.输入<h1>后其会自动给其补全 2. 进输入h1 tab键 网页的基本结构&#xff1a; 网页的基本结构只需要在VScode当中输入&#xff1a;&#xff01; tab键即可 <!DOCTYPE html…

ARM v8 Cortex R52内核 08 内存保护单元 Memory Protection Unit

ARM v8 Cortex R52内核 08 内存保护单元 Memory Protection Unit 8.1 About the MPU Cortex R52 处理器具有两个可编程的MPU&#xff0c;由EL1和EL2控制。每个MPU允许将4GB内存地址划分为多个区域。 每个内存区域由基地址、限制地址、访问权限和内存属性定义。 对于数据访问…

阿里对象储存OSS的SDK使用

对象存储OSS 该功能的实现使用了阿里的&#xff1a;对象存储OSS技术。 在阿里对象存储空间的文件可以 以链接 的形式进行访问: 文件访问路径规则 &#xff1a;https://BucketName.Endpoint/ObjectName 该技术的使用方式有很多&#xff0c;针对于SDK的简单实现官网上也有教程…

go 利用channel控制并发

任务数量为50&#xff0c;并发在5&#xff0c;全部都要执行 package mainimport ("fmt""time" )type Con struct {num inttime string }func main() {//channel实现并发控制// 定义同时执行的任务数量concurrencyLevel : 5//总任务数totalTask : 50// 创…

【网络编程】高性能并发服务器源码剖析

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之洪水网络攻击&#xff0c;在这篇文章中&#xff0c;你将会学习到在网络编程中如何搭建一个高性能的并发服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家来理解&#xf…

教你将配置好的conda环境迁移到其它设备

文章目录 问题分析存在的方法环境要求方法步骤1. 下载conda pack2. 打包原环境3. 新设备还原环境4. 查看环境 问题分析 好不容易配置好的conda环境&#xff0c;要在另一个设备上运行&#xff0c;还要重新配置&#xff0c;好麻烦。 存在的方法 pip install -r requirement.txt …

Node.js留言板(超详细注释)

目录结构如下 app.js // 一.引入模块 var http require(http);// 用于创建 HTTP 服务器和处理 HTTP 请求 var fs require(fs);// 用于读取和写入文件 var url require(url);// 用于解析URL// 创建留言数据对象 var msgs [{ name: 牛二, content: "我是妞儿", cr…

Flink学习(五)-流式分析

一、时间分类 事件时间(event time)&#xff1a; 事件产生的时间&#xff0c;记录的是设备生产(或者存储)事件的时间 摄取时间(ingestion time)&#xff1a; Flink 读取事件时记录的时间 处理时间(processing time)&#xff1a; Flink pipeline 中具体算子处理事件的时间 二、…

场景:数据库死锁

来自hollis八股文 流程图 前置知识 数据库上锁锁住的不是行&#xff0c;而是索引的主键 比如我对id 1的主键进行上锁&#xff0c;实际上是对查询使用的主键的key 1 进行上锁 对非聚簇索引操作时&#xff0c;首先会对非聚簇索引上锁&#xff0c;然后在请求主键的锁 比如我…

为什么开关电源变压器的耦合不可能为100%?什么是漏感?

一、为什么开关电源变压器的耦合不可能为100%&#xff1f; 变压器耦合度是指变压器初级绕组和次级绕组之间能量传递的效率&#xff0c;它反映了变压器在电磁感应过程中&#xff0c;初级侧磁通量能够有多少比例被次级侧有效利用。理论上&#xff0c;理想的变压器耦合度应该是10…

08 Php学习:if语句、Switch语句

PHP 条件语句 当您编写代码时&#xff0c;您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。 在 PHP 中&#xff0c;提供了下列条件语句&#xff1a; if 语句 - 在条件成立时执行代码 if…else 语句 - 在条件成立时执行一块代码&#xff0c;…

Java实现短信发送并校验,华为云短信配合Redis实现发送与校验

Java实现短信发送并校验&#xff0c;华为云短信配合Redis实现发送与校验 安装sms4j和redis <dependency><groupId>org.dromara.sms4j</groupId><artifactId>sms4j-spring-boot-starter</artifactId><version>3.2.1</version> <…

WPS基础使用

个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔…