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

这篇具有很好参考价值的文章主要介绍了如何用matlab做高精度计算?【第一辑】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

高精度计算是一种程序设计的算法。由于中央处理器的字长限制,如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为设置的精度位数。示例如下:

digits(45)  % 
>> vpa(pi)
ans = 3.1415926535897932384626433832795028841971694
>> length('3.1415926535897932384626433832795028841971694')
ans = 45

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

>> digits
 Digits = 32
>> dpi = vpa(pi)
dpi = 3.1415926535897932384626433832795
>> length(char(dpi))
ans = 33            % 此处为33是因为有小数点

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

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

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

一、创建高精度数据

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

>> 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。

>> a = sym('3.141514546465512487984541')
a = 3.141514546465512487984541
>> b = vpa('3.141514546465512487984541')
b = 3.141514546465512487984541

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

二、sym型数据数值化

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

>> 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位:

>> pi128 = vpa(pi,128)
pi128 = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446

四、符号计算结果数值化

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

>> 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/高精度计算

如需转载,请在公众号中回复“转载”获取授权!文章来源地址https://www.toymoban.com/news/detail-451271.html

到了这里,关于如何用matlab做高精度计算?【第一辑】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++基础算法①——高精度加减法计算

    当我们利用计算机进行数值计算,有时候会遇到这样的问题: n!的精确结果是多少? 当n小于30的时候,我们当然可以通过电脑自带的计算器计算出来。但是当我们遇到 100! 的时候就没有办法直接计算出精确的结果。再比如,求两个20000位的数的和。 那怎么解决精度缺失的问

    2024年02月16日
    浏览(48)
  • C语言 加减乘除模 的 高精度计算 (超详细)

    目录 高精度加法 高精度乘法 高精度减法          高精度除法 高精度模法   高精度计算 是模拟算法的一种,通过字符串和整型数组的使用,将加减乘除的竖式运算 模拟 出来,达到计算的目的。其步骤大致分为:一,将字符串数据存到整型数组中,二,模拟算法,不同的

    2023年04月24日
    浏览(38)
  • (基础算法)高精度加法,高精度减法

    什么叫做高精度加法呢?包括接下来的高精度减法,高精度乘法与除法都是同一个道理。正常来讲的话加减乘除,四则运算的数字都是整数,也就是需要在int的范围之内,但当这个操作数变得非常\\\"大\\\"的时候( 其实就是一个字符串,比方说有一个数是20位,如果用整数视角来

    2024年02月01日
    浏览(55)
  • 深入理解Python中的math和decimal模块:数学基础与高精度计算实战【第104篇—math和decimal模块】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python中, math 和 decimal 模块是处理数学运算的重要工具。 math 提供了一系列常见的数学函数,而 decimal 则专注于高精度的浮点数运算。本文

    2024年03月19日
    浏览(50)
  • 【计算机视觉】不仅能分割一切简单物体,而且还能高精度分割一切复杂物体的SAM升级版本HQ-SAM来了

    相信很多朋友都对Facebook开源的Segement Anything(SAM)算法有很深的印象,当前SAM已经被开发出众多的热门应用,至今为止,可能已经有很多朋友用它来提升自己的工作与生产效率。 虽然SAM算法效果很好,但是当碰到复杂的图像分割任务时,SAM输出的效果并不能满足我们的需求。

    2024年02月06日
    浏览(58)
  • 高精度减法

    要实现两个高精度数的减法,和高精度加法一样都是模拟竖式计算的过程,主要就是解决以下两个问题。 谁大谁小? 由于这两个数字都很大,但是不知道谁更大,所以要先判断哪个数更大,思路如下: 判断这两个数谁的位数更大,位数更大的自然更大。 如果位数不相同,从

    2024年02月08日
    浏览(50)
  • 高精度/前缀和/差分

    存储方式: 整数的长度一般小于1e6 大整数的每一位存储到数组里 存储时低位在前,高位在后,方便进位 高精度加法 每一位相加Ai + Bi + t, t表示进位取值0/1,逢十进一 模板: 高精度减法 每一位相减Ai - Bi - t, t 表示借位取值0/1 模板: 高精度乘法 A * b ,b=10000, len(A) = 1e6 , 乘的

    2024年02月16日
    浏览(48)
  • 【算法】模拟,高精度

      P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路就是模拟,值得注意的就是要用字符串类型输入。存进自己的int数组时要倒着存,因为如果是正着存的话,进位会有点trouble。 时间复杂度O(max(m,n))    P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (lu

    2024年02月09日
    浏览(49)
  • 高精度延时

    在使用STM32的时候可以使用SYSTICK来实现高精度延时。 I.MX6U没有SYSTICK定时器,但是有GPT定时器来实现高精度延时。 GPT定时器是一个32位向上定时器(也就是从0x00000000开始向上递增计数), GPT定时器也可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生

    2024年02月02日
    浏览(38)
  • 高精度加法(含代码)

    例如: 1111111111111+9, 列成 竖式 , 先算个位, 1 + 9 = 10 , 满 10 , 向十位进 1 。 接下来, 处理 进位 。 十位: 1+1=2 - 2 百位: 无进位, 直接照抄. 1 - 1 千位: 1 - 1 万位: ... ...: ... 最高位: 1 - 1 最终结果: 所以, 1111111111111+ 9 = 1111111111120 1111111111111+8888888888889, 这个算式变成了 高精度 + 高精度

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包