Qt扩展-muParser数学公式解析

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.rhkb.cn/news/251087.html

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

相关文章

Unity DOTS中的baking(三)过滤baking的输出

Unity DOTS中的baking&#xff08;三&#xff09;过滤baking的输出 默认情况下&#xff0c;在conversation world&#xff08;baker和baking system运行的环境&#xff09;下产生的所有entities和components&#xff0c;都会作为baking环节的输出。在baking结束时&#xff0c;U…

重写Sylar基于协程的服务器(5、IO协程调度模块的设计)

重写Sylar基于协程的服务器&#xff08;5、IO协程调度模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、…

STM32--USART串口(2)串口外设

一、USART简介 可配置数据位&#xff1a;不需要校验就是8位&#xff0c;需要校验就选9位&#xff1b; 停止位&#xff1a;决定了帧的间隔; STM32F103C8T6USART&#xff1a;USART1挂载在APB2总线上&#xff0c;USART2和USART3挂载在APB1总线上&#xff1b; 二、USART框图 TXE…

STM32外部中断(红外传感器与旋转编码器计数案例)

文章目录 一、介绍部分简介中断系统中断执行流程STM32中断NVIC基本结构NVIC优先级分组外部中断外部中断简介外部中断基本结构外部中断的流程AFIOEXTI框图 相关外设介绍旋转编码器介绍硬件电路对射式红外传感器 二、代码实现对射式红外传感器计次连接电路封装红外传感器与中断函…

Cambalache in Ubuntu

文章目录 前言apt install flatpak这很ok快捷方式后记 前言 gtkmm4相比gtkmm3有很多改革, 代码也干净了许多, 但在windows上开发 有ui设计器那自然方便很多, 但glade又不支持gtkmm4, windows上装Cambalache很是困难. 各种问题都找不到答案.于是 我用VMware虚拟机Ubuntu20.xx安…

探索智慧文旅:科技如何提升游客体验

随着科技的迅猛发展&#xff0c;智慧文旅已成为旅游业的重要发展方向。通过运用先进的信息技术&#xff0c;智慧文旅不仅改变了传统旅游业的运营模式&#xff0c;更在提升游客体验方面取得了显著成效。本文将深入探讨科技如何助力智慧文旅提升游客体验。 一、智慧文旅的兴起与…

React详解

前言 React是一个用于构建用户界面的javaScript库&#xff0c;起源于facebook的内部项目&#xff0c;在13年f进行开源 17版本官网&#xff1a;React – A JavaScript library for building user interfaces 18版本官网&#xff1a;React 官方中文文档 特点&#xff1a; 声…

项目中使用sonar扫码代码

1.在maven的settings.xml配置 org.sonarsource.scanner.maven <profiles> <profile><id>sonar</id><activation><activeByDefault>true</activeByDefault></activation><properties><!-- Optional URL to server. D…

ubuntu20配置mysql8

首先更新软件包索引运行 sudo apt update命令。然后运行 sudo apt install mysql-server安装MySQL服务器。 安装完成后&#xff0c;MySQL服务将作为systemd服务自动启动。你可以运行 sudo systemctl status mysql命令验证MySQL服务器是否正在运行。 连接MySQL 当MySQL安装…

MySQL进阶45讲【10】MySQL为什么有时候会选错索引?

1 前言 前面我们介绍过索引&#xff0c;在MySQL中一张表其实是可以支持多个索引的。但是&#xff0c;写SQL语句的时候&#xff0c;并没有主动指定使用哪个索引。也就是说&#xff0c;使用哪个索引是由MySQL来确定的。 大家有没有碰到过这种情况&#xff0c;一条本来可以执行得…

【服务器】RAID(独立磁盘冗余阵列)

RAID&#xff08;独立磁盘冗余阵列&#xff09; 一、RAID的介绍二、RAID的分类#2-1 RAID 02-2 RAID 1#2-3 RAID 32-4 RAID 52-5 RAID 62-6 RAID 10(先做镜像&#xff0c;再做条带化)2-7 RAID 01&#xff08;先做条带&#xff0c;再做镜像&#xff09;2-8 RAID比较 三、磁盘阵列…

FANUC机器人示教器的菜单变成了图标,如何改成列表的形式?

FANUC机器人示教器的菜单变成了图标&#xff0c;如何改成列表的形式&#xff1f; 如下图所示&#xff0c;开机后按下MENU菜单键时&#xff0c;发现原来的列表形式变成了菜单图标的形式&#xff0c;同时在按F1-F5键时&#xff0c;提示&#xff1a;HMI模式-键不可用&#xff0c; …

蓝桥杯备战——12.超声波与测频代码优化

1.优化分析 昨天我在看原理图的发现超声波模块的反馈引脚P11刚好可以使用PCA模块0的捕获功能&#xff0c;我就想着把PCA功能留给超声波&#xff0c;然后测频功能还是改成定时器0来完成&#xff0c;然后前后台功能改成定时器1。 至于我为什么要这么改呢&#xff0c;看一下我原…

uniapp 高德地图显示

1. uniapp 高德地图显示 使用前需到**高德开放平台&#xff08;https://lbs.amap.com/&#xff09;**创建应用并申请Key   登录 高德开放平台&#xff0c;进入“控制台”&#xff0c;如果没有注册账号请先根据页面提示注册账号   打开 “应用管理” -> “我的应用”页面…

【Mysql】整理

Mysql整理与总结 整理Mysql的基本内容供回顾。 参考&#xff1a; [1]. 掘金.MySQL三大日志(binlog,redolog,undolog)详解 [2]. Javaguide.MySQL三大日志(binlog、redo log和undo log)详解

陶哲轩如何用 GPT-4 辅助数学研究

关于陶哲轩&#xff08;Terence Tao&#xff09;用 GPT-4 进行数学研究的话题始于陶本人在 微软 Unlocked 上发表的 Embracing Change and Resetting Expectations 一文。文中提到&#xff1a; …… I could feed GPT-4 the first few PDF pages of a recent math preprint and…

Zookeeper服务注册与发现实战

目录 设计思路 Zookeeper注册中心的优缺点 SpringCloudZookeeper实现微服务注册中心 第一步&#xff1a;在父pom文件中指定Spring Cloud版本 第二步&#xff1a;微服务pom文件中引入Spring Cloud Zookeeper注册中心依赖 第三步&#xff1a; 微服务配置文件application.y…

47 mmap 的实现

前言 mmap 函数经常是和 普通的 bio 进行一个参照对比 mmap 相比于 bio 减少了一次 系统空间 到 用户空间 的拷贝操作 普通的 bio 的流程可以参见这里 从磁盘读取数据到内存的调试 这里 我们来看一下 mmap 测试用例 测试用例如下, 仅仅是一个 mmap 的一个简单的使用 …

k8s之安装部署及kuboard发布应用

目录 环境准备 系统规划 配置免密 将桥接的IPv4流量传递到iptables的链 系统基础配置 安装docker 安装docker及基础依赖 配置docker的仓库下载地址 部署k8s 添加阿里云的k8s源 安装kubeadm&#xff0c;kubelet和kubectl 初始化masteer节点 部署node节点 部署flanne…

Java设计模式 – 四大类型

设计模式 – 四大类型 创建型模式结构型模式行为型模式J2EE模式 设计模式&#xff08;Design pattern&#xff09;是重构解决方案 根据书Design Patterns – Elements of Reusable Object-Oriented Software&#xff08;中文译名&#xff1a;设计模式 – 可复用的面向对象软件元…