Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何用matlab做高精度计算?【第一辑】

如何用matlab做高精度计算?【第一辑】

作者头像
巴山学长
发布于 2022-06-23 06:51:33
发布于 2022-06-23 06:51:33
2.2K00
代码可运行
举报
文章被收录于专栏:巴山学长巴山学长
运行总次数:0
代码可运行

高精度计算是一种程序设计的算法。由于中央处理器的字长限制,如32位CPU中一个整数最大只能取值4,294,967,295(=2^32-1),因此在超范围数值计算中,往往要采用模拟手段。通常使用分离字符的方法来处理数字数组。 维基百科【高精度计算】

对于跟咱一样的普通使用者而言,往往并不关心如何去实现高精度计算,更不会去研究相应的算法。咱这里讲的高精度计算也指的是计算过程中保持数据的精度不丢失。因为内容较多,计划分成三辑进行分享。

第一辑主要介绍matlab自带的高精度计算工具;第二辑主要介绍来自于File Exchange中的两款高精度计算工具箱;第三辑主要介绍一款收费的高精度计算工具箱Multiprecision Computing Toolbox。

matlab自带的高精度计算工具主要依赖于Symbolic Math Toolbox工具箱。因此,想要使用matlab自带的高精度计算工具,务必需要安装Symbolic Math Toolbox工具箱。

两个关键函数 —— vpadigits

digits函数使用来控制vpa的计算精度,使用前,按如下方式设置想要的精度即可:digits(num),num为设置的精度位数。示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
digits(45)  % 
>> vpa(pi)
ans = 3.1415926535897932384626433832795028841971694
>> length('3.1415926535897932384626433832795028841971694')
ans = 45

在计算过程中,精度越高所花费的时间会相应增加,精度越低所花费的时间会相应减少,因此需要在精度与计算时间间做一个权衡。默认情况下,MATLAB使用16位精度。而使用vpa可获得更高的精度,vpa的默认精度为32位,即在未使用digits进行精度位数定义时,digits的返回值为32。如重启matlab后,在命令窗口用π来测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>> digits
 Digits = 32
>> dpi = vpa(pi)
dpi = 3.1415926535897932384626433832795
>> length(char(dpi))
ans = 33            % 此处为33是因为有小数点

正如上面所讲matlab的默认浮点数是16位精度,若超过16位则使用四舍五入法进行截断,如下图所示。

那怎么来实现让MATLAB存储高精度数值呢?就得用到咱们主角vpa函数了,使用vpa处理的数据自动为sym型数据。而sym本身也是创建符号变量、表达式、函数、矩阵等函数,且其所创变量、表达式、函数、矩阵同样为sym型数据。

一、创建高精度数据

小伙伴们可能会想直接使用vpa或sym是不是就可以搞定了,那咱们就来看看下面的示例,定义一个高精度小数:3.141514546465512487984541。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>> a = sym(3.141514546465512487984541)
a = 7074061870420537/2251799813685248
>> vpa(a)
 ans = 3.1415145464655123141994863544824
>> b = vpa(3.141514546465512487984541)
b = 3.1415145464655123141994863544824
>> vpa(b)
ans = 3.1415145464655123141994863544824

从结果不难看出,无论直接使用sym还是vpa都未能正确创建咱们想要的数字,这是为什么呢?究其原因,就是MATLAB默认浮点数精度在作怪,超过16位精度的数字就会自动被截断,而其后被无效数值填充,导致无法得出正确结果。那要怎么解决此问题呢?问题根源既然出在数值上,那咱不用数值不就可以了吗?要不试试看?咱直接将数值定义成字符串,然后再使用sym或vpa。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>> a = sym('3.141514546465512487984541')
a = 3.141514546465512487984541
>> b = vpa('3.141514546465512487984541')
b = 3.141514546465512487984541

显然咱的方案是正确的。那有的小伙伴就问了,用num2str来转换上面的数值可以吗?不用怀疑,肯定是不会对的,不信的小伙伴可以私下试试。

二、sym型数据数值化

使用vpa函数可以将sym型数据数值化,通过char函数可将数值化的sym型数据转成可用的字符串型数据。如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>> p = sym(pi);
>> a = sym('3.141514546465512487984541');
>> b = sym(1/2);
>> f = a*sin(b*p);
>> val = vpa(f)
val = 3.141514546465512487984541
% vpa有效的保留计算精度,f和a完全相等

三、更改数据的精度

除了使用digits定义精度位数外,使用vpa也可以直接定义计算精度,如取pi的前128位:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>> pi128 = vpa(pi,128)
pi128 = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446

四、符号计算结果数值化

虽然符号计算的结果是精确的,但可能是一种不便于阅读的形式,如使用solve求解高次多项式的根,它给出的不是具体解的值,而是用root来表示根。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>> syms x
y = solve(x^3 - x + 1, x)
y = root(z^3 - z + 1, z, 1)
    root(z^3 - z + 1, z, 2)
    root(z^3 - z + 1, z, 3)
>> vvpa = vpa(y)
vvpa =
0.66235897862237301298045442723905 - 0.56227951206230124389918214490937i
0.66235897862237301298045442723905 + 0.56227951206230124389918214490937i
                                      -1.3247179572447460259609088544781

由于篇幅不宜过长,更多有关vpa的应用小伙伴可以自行研究使用。接下来会在另外两辑中介绍第三方高精度计算工具。欲知后事如何,且看下回分解!

参考资料:

[1] www.mathworks.com/help/symbolic/vpa.html

[2] https://zh.m.wikipedia.org/zh-hans/高精度计算

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 巴山学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何用matlab做高精度计算?【第三辑】(完)
在一、二辑中,给大家介绍了如何使用matlab自带工具箱以及大神John D'Errico开发的工具箱实现高精度计算。本辑作为用matlab做高精度计算的压轴辑,将给大家介绍一款效率远超前面两辑中所介绍的工具箱的高精度计算神器 —— Multiprecision Computing Toolbox for MATLAB (AdvanpixMCT)。
巴山学长
2022/06/23
1.7K0
如何用matlab做高精度计算?【第三辑】(完)
如何用matlab做高精度计算?【第二辑】
在上一辑中,给大家介绍了如何使用matlab自带工具箱实现高精度计算(详见:如何用matlab做高精度计算?【第一辑】)。本期给大家带来两款来自File Exchange源代码共享资源库的宝贝,它们都是出自大神John D'Errico之手。前者是专门用于处理超大值整数运算的 —— Variable Precision Integer Arithmetic,对应数据类型为vpi,后者是用于处理浮点数计算的 —— HPF (a big decimal class),对应数据类型为hpf。
巴山学长
2022/06/23
1.3K0
如何用matlab做高精度计算?【第二辑】
优化方法,通过MATLAB提升复杂数学模型的计算精度
总之,通过选择合适的数值计算方法、使用高级的数值计算函数和工具箱、增加计算的精度、控制计算误差以及优化算法参数调整等方法,可以提升MATLAB中复杂数学模型优化问题的计算精度。
一凡sir
2023/08/09
1.3K0
Matlab系列之符号运算(上)(祝大家双节快乐~)
看到文章的名字,可能很多人都没懂意思,如果叫它的另一个名字:代数运算,或许你就懂了;与正常的数值计算对数值处理有点不一样,符号运算处理的是符号;符号除了可以代表数以外,还可以代表多项式、函数、数学结构等等,MATLAB的符号数学工具箱(Symbolic Math Toolbox简称sym)具有丰富的内容,工具箱中符号表达式的计算都是在Maple内核下运行。Maple是一款数学软件,具体我也没了解过,反正符号运算功能很强就对了
狂人V
2020/10/10
2.5K0
Matlab系列之符号运算(上)(祝大家双节快乐~)
高等应用数学问题MATLAB求解.第一,二章
这里说了,就是装maple的锅,估计是32位的Maple替换了原本64位matlab自带的maple库,我还能遇到这种事情???
云深无际
2021/09/14
9810
高等应用数学问题MATLAB求解.第一,二章
如何有效解决AppDesigner中使用符号工具箱syms后打包发布成exe等可执行文件不兼容的问题?
前几天有个小伙伴,找我问了一个问题,他在AppDesigner中使用了syms符号变量,结果就出现上图所示的警告画面。看似已经打包完成,但是不难发现中间出现了警告符号。点击“日志文件”打开一看出现了如下的关键警告信息:警告: 在 "D:\Documents\Matlab\app2.mlapp" 中,根据 MATLAB Compiler 许可证,对 MATLAB Runtime 环境打包时不包含 "syms"。请从代码中删除文件或函数,或者使用 MATLAB 函数 "isdeployed" 确保函数不会在所部署的组件中被调用。
巴山学长
2023/03/15
1.4K0
如何有效解决AppDesigner中使用符号工具箱syms后打包发布成exe等可执行文件不兼容的问题?
有人知道如何提取matlab符号表达式系数吗?
调用方法:[C,T] = coeffs(___),C为返回的系数,T为对应多项式项
巴山学长
2019/12/27
4.9K0
白话解说,半分钟就懂 ---建模Matlab中符号运算和数值运算的区别?
两者的根本区别是 : 数值计算的表达式、矩阵变量中不允许有未定义的自由变量 , 而符号计算可以含有未定义的符号变量。对于一般的程序设计软件如 C, C + + 等语言实现数值计算还可以 , 但是实现符号计算并不是一件容易的事。而 Matlab 自带有符号工具箱 Symbolic Math Tooibox , 而且可以借助数学软件 Maple, 所以 Matlab 也具有强大的符号运算功能。
瑞新
2020/07/08
2.2K0
高精度数学计算的瑞士军刀,mpmath库详解与应用示例
hello,大家好,我是一点,专注于Python编程,如果你也对感Python感兴趣,欢迎关注交流。
一点sir
2024/05/09
4210
高精度数学计算的瑞士军刀,mpmath库详解与应用示例
MATLAB软件怎么下载?科学计算工具MATLAB 2022中文版下载安装
MATLAB是一款广泛用于科学计算和工程领域的软件,其具有强大的数值分析和图形处理能力,在各个领域都得到了广泛应用。而MATLAB软件的独特之处在于其语法简单易学,可以很方便地进行算法设计和仿真,因此备受学术圈和工业界的青睐。本文将从MATLAB的基本操作流程、特色功能、高级操作、常用工具箱和应用案例五个方面进行详细的讲解。
用户10436734
2023/04/17
5090
matlab符号计算(一)
计算一般可分为解析计算和数值计算,解析计算是连续的求解过程,而数值计算则是离散的求解过程。在matlab中,原则上只要数学上能解析计算的,采用matlab符号计算就能够精确求解。
巴山学长
2019/07/15
3.2K0
matlab符号计算(一)
机器人工具箱matlab robotics toolbox使用
1 首先检测Matlab 中已经安装的工具箱,采用“ver”命令 MATLAB 版本 9.9 (R2020b) Simulink 版本 10.2 (R2020b) Computer Vision Toolbox 版本 9.3 (R2020b) Control System Toolbox 版本 10.9 (R2020b) Curve Fitting Toolbox 版本 3.5.12 (R2020b) Data Acquisition Toolbox 版本 4.2 (R2020b) Deep Learning Toolbox 版本 14.1 (R2020b) Global Optimization Toolbox 版本 4.4 (R2020b) Image Acquisition Toolbox 版本 6.3 (R2020b) Image Processing Toolbox 版本 11.2 (R2020b) MATLAB Coder 版本 5.1 (R2020b) Machine Vision Toolbox for MATLAB 版本 4.3 Model Predictive Control Toolbox 版本 7.0 (R2020b) Optimization Toolbox 版本 9.0 (R2020b) Parallel Computing Toolbox 版本 7.3 (R2020b) Partial Differential Equation Toolbox 版本 3.5 (R2020b) Robotics System Toolbox 版本 3.2 (R2020b) Robotics Toolbox for MATLAB 版本 10.4 Robust Control Toolbox 版本 6.9 (R2020b) Signal Processing Toolbox 版本 8.5 (R2020b) Simscape 版本 5.0 (R2020b) Simscape Multibody 版本 7.2 (R2020b) Simulink Coder 版本 9.4 (R2020b) Simulink Control Design 版本 5.6 (R2020b) Simulink Design Optimiz
ZC_Robot机器人技术
2021/04/09
5K3
机器人工具箱matlab robotics toolbox使用
过冷水带您走进matlab数据转换新世界
数据转换对于经常使用matlab的伙伴来说是很基础且实用的知识点,but! 相互之间转换关系不太容易厘清,免不了书到用时求谷哥度娘。为了方便伙伴们记住不同数据类型之间的相互转换关系,matlab数据转换图便应运而生,下图就是过冷水要给大家分享的转换图。
巴山学长
2021/01/12
4790
Matlab学习
此 MATLAB 函数 清除命令行窗口中的所有文本,让屏幕变得干净。运行 clc
裴来凡
2022/05/29
1.4K0
Matlab学习
【V课堂】数据挖掘知识脉络与资源整理(六)–matlab
简介 MATLAB 是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。 重要
小莹莹
2018/04/23
1.1K0
【V课堂】数据挖掘知识脉络与资源整理(六)–matlab
Matlab机器人工具箱
因为需要用到和机器人相关的东西,就用到了这个工具箱,作者官网 http://www.petercorke.com/Robotics_Toolbox.html
全栈程序员站长
2022/08/13
8320
Matlab机器人工具箱
数据咖小课堂:数据挖掘知识脉络与资源整理(八)–matlab
Matlab 1 简介 MATLAB 是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulin
小莹莹
2018/04/25
8660
数据咖小课堂:数据挖掘知识脉络与资源整理(八)–matlab
Matlab 和 C 语言的区别
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。MATLAB和MathemaTIca、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。
AI 电堂
2021/03/24
3.5K0
MATLAB的solve函数
[y1,…,yN,parameters,conditions] = solve(eqns,vars,’ReturnConditions’,true)example
全栈程序员站长
2022/09/13
1.1K0
matlab
对于一些nc数据或者遥感影像处理时,虽然一些第三方软件可以出图,但我们往往需要借助python或者matlab软件进行数据处理,但最后保存下来数据如何导入arcgis进行分析呢?
用户6841540
2024/08/05
4390
推荐阅读
相关推荐
如何用matlab做高精度计算?【第三辑】(完)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验