Qt扩展-muParser数学公式解析

news2024/11/14 14:32:24

muParser数学公式解析

  • 一、概述
    • 1. 针对速度进行了优化
    • 2. 支持的运算符
    • 3. 支持的函数
    • 4. 用户定义的常量
    • 5. 用户定义的变量
    • 6. 自定义值识别回调
    • 7. 其他功能
  • 二、内置函数
  • 三、内置二元运算符
  • 四、三元运算符
  • 五、内置常量
  • 六、源码引入
    • 1. 源码文件
    • 2. 编译器开关
      • 1. MUP_BASETYPE
      • 2.MUP_USE_OPENMP
      • 3. MUP_STRING_TYPE
  • 七、实例

一、概述

muparser - Fast Math Parser Library

项目地址:https://beltoforion.de/en/muparser/features.php#idStart

muparser是一个高性能的数学计算表达式库,支持常用的函数、常用运算符、数学计算式的计算,这个库也提供了很多内置的功能、同时也开放了很多功能供用户使用。这个库使用的 C++语言、也可以用C语言搭配用、跨平台的支持
在这里插入图片描述

1. 针对速度进行了优化

  • 高解析性能;批量模式提供了表达式计算的并行化
  • 具有延迟计算的 If-Then-Else运算符
  • 在一次求值中计算多个逗号分隔子表达式:sin(X),x+y,x*x

2. 支持的运算符

  • 14个预定义运算符
  • 二元运算符是用户可定义的
  • 后缀运算符是用户可定义的
  • 中缀运算符是用户可定义的

3. 支持的函数

  • 25个预定义函数
  • 具有最多五个参数的固定数量
  • 具有可变数量的参数
  • 使用单个字符串参数(用于数据库查询)
  • 可以由用户扩展

4. 用户定义的常量

  • 数值常量
  • 字符串常量

5. 用户定义的变量

  • 在数量上无限
  • 可在解析器运行时由解析器定义:abc=123
  • 根据其他变量赋值变量是可能的

6. 自定义值识别回调

  • 我们可以定义值的外观
  • 我们可以让muparser读取十六进制值,如a=0x00ff00或二进制值
  • A=0b1000101
  • 我们还可以使用此功能从数据库中查询值

7. 其他功能

  • 使用后缀运算符作为单位乘数(3M->0.003)
  • 内置函数,用于对给定变量进行数值求导
  • 参数分隔符、小数分隔符、千位分隔符可以根据我们的区域设置进行调整
  • 基于CMake的构建系统
  • ISO 14882:符合2017年标准的代码
  • 每种语言都可以使用的DLL版本能够使用以C风格导出的函数

二、内置函数

下表概述了默认实现支持的函数,它列出了函数名称、参数数量和简短说明

名称参数个数解释
sin1正弦函数
cos1余弦函数
tan1切线函数
asin1反正弦函数
acos1反余弦函数
atan1圆弧正切函数
sinh1双曲正弦函数
cosh1双曲余弦
tanh1双曲正切函数
asinh1双曲弧正弦函数
acosh1双曲圆弧正切函数
atanh1双曲反正切函数
log21以2为底的对数
log101以10为底的对数
log1以e为底的对数为1(2.71828…)
ln1以e为底的1个对数(2.71828…)
exp1e的x次方
sqrt1平方根
sign1如果x<0,则符号1符号函数-1;如果x>0,则为1,阶跃函数
rint1舍入为最接近的整数
abs1绝对值
minvar.最小变量所有参数中的最小值
maxvar.所有参数的最大值
sumvar.和变量所有参数的总和
avgvar.平均变量所有参数的平均值

三、内置二元运算符

下表列出了解析器支持的默认二进制运算符

操作符描述优先级
=分配*0
||逻辑或1
&&逻辑AND2
|按位或3
&按位和4
<=小于或等于5
>=大于或等于5
!=不等于5
==等于5
>大于5
<小于5
+加法6
-减去6
*乘法7
/除法7
^将x乘以y的幂,幂运算符8
  • *赋值运算符是特殊的,因为它更改了它的一个参数,并且只能应用于变量

四、三元运算符

Muparser内置了对If Then Else运算符的支持
它使用惰性求值,以确保只计算表达式的必要分支

操作符描述备注
?:If Then Else运算符C++样式语法

五、内置常量

预定义常量名称的名称以下划线为前缀
解析器有两个预定义的常量:Pi和Eulers Number
常量定义的准确性最终取决于所选值类型(浮点型、双精度型、双精度长整型)的大小

常量描述备注
_pi唯一的圆周率3.141592653589793238462643
_e欧拉数2.718281828459045235360287

六、源码引入

1. 源码文件

官方建议将muparser直接嵌入到项目中将库源代码直接嵌入到客户端应用程序中是避免链接器冲突的最简单方法,这些冲突源于共享解析器库和项目使用的运行时库的不同版本

为了嵌入muparser,将以下文件包括到我们的项目中:

muParser.cpp
muParserBase.cpp
muParserBytecode.cpp
muParserCallback.cpp
muParserError.cpp
muParserTokenReader.cpp

并确保在我们的项目包含路径中可以找到以下包含文件:

muParser.h
muParserBase.h
muParserBytecode.h
muParserCallback.h
muParserDef.h
muParserError.h
muParserFixes.h
muParserTemplateMagic
muParserToken.h
muParserTokenReader.h

解析器类和所有相关类驻留在命名空间 mu 中,请确保添加一个 using

using namespace mu;

添加到我们的文件中,或使用其完整名称引用所有类

2. 编译器开关

如果我们通过编译自己的版本或直接包含源代码来使用muParser,则可以使用一组预处理器定义来定制其行为
以下定义位于文件muParserDef.h中:

1. MUP_BASETYPE

宏 MUP_BASETYPE 定义muParser使用的底层数据类型这可以是任何浮点值类型(浮点型、双精度型或双精度长整型)宏默认为双精度,如果我们需要更高的精度或希望将muParser Seamless与使用Float作为其数据类型的客户端代码一起使用,请修改此值

#define MUP_BASETYPE double

2.MUP_USE_OPENMP

如果我们使用的是CMake构建系统,则使用-DENABLE_OPENMP=OFF/ON选项激活OpenMP支持
该选项将为我们设置宏MUP_USE_OPENMP,并自动链接到OpenMP,启用OpenMP支持时,批量模式下的表达式求值将在多个CPU上并行执行默认情况下,使用CMake构建时,OpenMP支持处于活动状态

#define MUP_USE_OPENMP

如果不是使用CMake构建,并且已将源代码直接嵌入到项目中,请取消对文件muParserDef.h中宏的注释

根据硬件的不同,并行化可以显著提高解析器的速度(30%-400%)

启用并行化对简短表达式没有显著影响

3. MUP_STRING_TYPE

这个定义决定了muParser使用的字符串类型,它可以是 std::string,也可以是 std::wstring,这个定义不应该直接设置
如果存在预处理器MACRO_UNICODE,则将其定义为 std::wstring

#define MUP_STRING_TYPE std::wstring

七、实例

#include "muParser.h"

double fVal;
try
{
	double result = 0;
	
	// 定义对象
	mu::Parser m_parser;
	
	// 定义可能需要的变量
	double x_value = 7.434, y_value = 4.5, result;

    paser.DefineVar(L"x", &x_value);
    paser.DefineVar(L"y", &y_value);
	
	// 设置数学表达式
	m_parser.SetExpr("4.54534*(5.43-0.689*_pi)^2");
	
	// 计算
	result = m_parser.Eval();

	// 设置数学表达式
	m_parser.SetExpr(L"x^y+5.654-534.432^y");

	// 计算
	result = m_parser.Eval();
	
	return result;
}
catch (Parser::exception_type &e)
{
  std::cout << e.GetMsg() << endl;
}

更多就需要去其官网查看说明、配合着源代码一起使用。

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

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

相关文章

配置支持 OpenAPI 的 ASP.NET Core 应用

写在前面 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 本文记录如何配置基于Swagger 的 ASP.NET Core 应用程序的 OpenAPI 规范。 需要从NuGet 安装 Swashbuckle.AspNetCore 包 代码实现 var builder WebApplicati…

如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证

如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证 引言crypto/ed25519 算法简介环境搭建和准备工作生成密钥对进行数字签名 验证签名实际应用场景案例总结 引言 在当今数字化时代&#xff0c;网络安全显得尤为重要。无论是在网上进行交易、签署合同&#xff0c;还是发…

大模型创业的3条军规

上周&#xff0c;一家初创公司未能围绕LLM和 RAG 开展业务&#xff0c;尽管他们获得了第一份 B2B 大型合同。 以下是原因以及如何避免这种情况&#xff1a; 创始人写了一篇博客解释了为什么他不得不关闭他的业务&#xff0c;我在这里总结了他的要点。 NSDT工具推荐&#xff1a…

基于VMware和Unbuntu18.04编译 嘉立创·泰山派 Linux SDK

主机硬件要求 内存最少32G 硬盘腾出200-500G&#xff0c;虽然编译最终占了73G&#xff0c;但富余一些以后可以搞别的方便 操作系统win7/10/11 VMware 安装 1.去vmware官网下载&#xff1a;https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_comp…

docker安装elasticsearch+kibana

目录 1.安装es 2.安装kibana 3.kibana监控es 1.安装es 拉取镜像 docker pull elasticsearch:7.6.1 创建存放配置文件、数据、插件的各个文件夹 mkdir -p /home/docker/elasticsearch/config mkdir -p /home/docker/elasticsearch/data mkdir -p /home/docker/elasticsearch…

2024最新版MongoDB安装使用指南

2024最新版MongoDB安装使用指南 Installation and Usage Guide of the Latest MongoDB Community Edition in 2024 By JacksonML MongoDB is a document database with the scalability and flexibility that you want with the querying and indexing that you need. – mon…

网络异常案例三_RST

问题现象 在做功能测试的时候&#xff0c;经常看到设备离线的消息&#xff08;MQTT遗嘱&#xff09;。 在终端连接的网络设备上抓包分析&#xff0c;看到终端设备发起大量的RST请求。 151这个设备&#xff0c;7min&#xff0c;重置断开了8个TCP连接&#xff08;mqtt连接&#…

Ansible自动化运维实战

一、abstract简介 ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具(puppet、cfengine、chef、func、fabric) 的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能.无客户端。我们要学一些Ansible的安装和一些基…

地平线旭日 X3 VNC 远程桌面灰屏解决

解决 windows 使用 VNC 远程连接地平线旭日 X3 开发板桌面环境灰屏的问题。 1 查看问题 通过启动vncserver后的log文件确认问题。 启动 vnc 服务 vncserver :1通过 terminal 输出可以看到日志文件的存储位置 打开查看该文件后发现首当其冲是权限问题&#xff1a;说xstartup…

【spring】springcloud中的组件有那些?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;spring ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 我的其他博客 正文 说出主要的组件&#xff1a; Spring Cloud Eureka,服务注册中心,特性有失效剔除、服务保护Spring Cloud Zuul,API服…

系统分析师-23年-下午题目

系统分析师-23年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选两题作答 试题一 (25分) 说明 某软件公司拟开发一套汽车租赁系统&#xff0c;科学&#xff0c;安全和方便的管理租赁公司的各项业务&#xff0…

YOLOv7独家改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测

💡💡💡本文独家改进:一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv5网络中的nn.Upsample 💡💡💡在多个数据集下验证能够涨点,尤其在小目标检测领域涨点显著。 收录 YOLOv7原创自研 https://blog.csdn.net/m0_63774211/ca…

【每日一题】 2024年1月汇编

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 【1.4】2397.被列覆盖的最多行数 2397. 被列覆盖的最多行数https://leetcode.cn/problems/maximum-rows-covered-by-columns/ 这…

服务攻防-开发组件安全Solr搜索Shiro身份Log4j日志本地CVE环境复现

知识点&#xff1a; 1、J2EE-组件安全-Solr-全文搜索 2、J2EE-组件安全-Shiro-身份验证 3、J2EE-组件安全-Log4J-日志记录 章节点&#xff1a; 1、目标判断-端口扫描&组合判断&信息来源 2、安全问题-配置不当&CVE漏洞&弱口令爆破 3、复现对象-数据库&中间…

Qt 5.9.4 转 Qt 6.6.1 遇到的问题总结(三)

1.QSet: toList 中的toList 函数已不存在&#xff0c;遇到xx->toList改成直接用&#xff0c;如下&#xff1a; 2.开源QWT 图形库中QwtDial中的 setPenWidth 变成 setPenWidthF函数。 3.QDateTime 中无setTime_t 改为了setSecsSinceEpoch函数。 4.QRegExp 类已不存在 可以用Q…

STM32的中断系统详解

一、什么是中断 中断是指CPU在正常执行程序时&#xff0c;遇到外部/内部的紧急事件需处理&#xff0c;暂停当前程序的执行&#xff0c;转而去处理紧急事件&#xff0c;待事件处理完毕后&#xff0c;返回被打断的程序继续执行&#xff0c;这个过程就称之为中断。 中断的意义&a…

单片机驱动多个ds18b20

目录 1设计内容 2ds18b20介绍 2.1传感器引脚及原理图 2.2寄存器配置 3程序实现 3.1配置初始化 3.2配置寄存器 3.3ROM读取 3.4温度读取 1设计内容 通过51单片机&#xff0c;读取总线上挂载的多个ds18b20的温度信息。 如下图&#xff0c;成功读取到3路温度数据。 2ds18…

python打造光斑处理系统4:裁切光斑感兴趣区域

文章目录 图像裁切给定坐标裁切手动阈值裁切 光斑处理&#xff1a;python处理高斯光束的图像 光斑处理系统&#xff1a;程序框架&#x1f31f;打开图像&#x1f31f;参数对话框/伪彩映射 图像裁切 一般来说&#xff0c;光斑只占图像很小一部分&#xff0c;为了更好的观感和更…

Oracle 面试题 | 04.精选Oracle高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

中国城市统计年鉴,多种数据格式可用,时间覆盖1995-2022年

基本信息. 数据名称: 中国城市统计年鉴 数据格式: pdf、jpg、excel、html不定 数据时间: 1995-2021不定 数据几何类型: 文本 数据坐标系: —— 数据来源&#xff1a;国家统计局 示例数据: 目录一、全国城市行政区划1-1 城市行政区划和区域分布1-2 分地区城市情况一…