CSDN原文:https://blog.csdn.net/cauchy7203/article/details/107785295

Matlab一度被认为是最专业的数值计算工具之一,相信许多同学都或多或少用过这个工具。相比而言,Python作为一种胶水式的语言,其设计之初就不是为科学计算服务的。之前也看到许多人在吐槽说用Python去复现一些计算过程时经常失败,因此(包括本人)也怀疑过是Python本身数值精度不够导致的。那么Python的精度究竟如何,本文就来一探究竟。为了方便,我们就用线性方程组的求解来对比这一事实。

1、实验设计

  • 基本思路:

本文考虑的线性方程组:

  • 关键问题一:保证两种语言处理的数据完全一致

这里第二步其实很重要,由于Matlab默认数据类型为double,而Python的默认类型为float,如果直接粘贴或者导入就有可能在Python中被截断,从而导致在一开始使用的数据就存在误差,使得实验结果不可信。

  • 关键问题二:选取合适的指标来进行对比

第四步主要是计算两种程序跑完后误差的平方和: $$ |Ax-b|^2 $$ 这种验证方式比较简单。之所以这么做是因为数值计算过程中不一定能够得到100%的精度,这个问题的主要原因是在数值计算时数字不会一直保持为真实值。尤其在除法时由于数值长度的限制会被强行截断一部分,因此用这个指标来验证方法是否正确是很有必要的。当然,根据它的定义不难看出,这个值最小精度就越高。

2、数据生成和处理

首先由Matlab随机生成一个矩阵和一个向量:

A = rand(5,5)
b = rand(1,0)

然后在Matlab中将数据粘至txt文件,再整理成Python的格式粘生成Numpy数组,同时也将数据重新粘回Matlab代码。这里原始数据是这个样子:

A的值

0.814723686393179   0.0975404049994095  0.157613081677548   0.141886338627215   0.655740699156587
0.905791937075619   0.278498218867048   0.970592781760616   0.421761282626275   0.0357116785741896
0.126986816293506   0.546881519204984   0.957166948242946   0.915735525189067   0.849129305868777
0.913375856139019   0.957506835434298   0.485375648722841   0.792207329559554   0.933993247757551
0.632359246225410   0.964888535199277   0.800280468888800   0.959492426392903   0.678735154857774

b的值

0.757700000000000
0.743100000000000
0.392200000000000
0.655500000000000
0.171200000000000

当然也可以采用round函数一类的方式进行处理。

注意 这种操作虽然看似简单并且有点笨拙,但能很好地保证二者在初始化时得到的结果是一样的。

Matlab的操作相对简单,直接将txt中的内容首尾加上[],再粘回代码即可。对于Python要稍加处理,最终的代码是:

import numpy as np
A = np.array([0.814723686393179,0.905791937075619,0.126986816293506,0.913375856139019,0.632359246225410,0.0975404049994095,0.278498218867048,0.546881519204984,0.957506835434298,0.964888535199277,0.157613081677548,0.970592781760616,0.957166948242946,0.485375648722841,0.800280468888800,0.141886338627215,0.421761282626275,0.915735525189067,0.792207329559554,0.959492426392903,0.655740699156587,0.0357116785741896,0.849129305868777,0.933993247757551,0.678735154857774]).reshape([5,5]).Tb = np.array([0.757700000000000,0.743100000000000,0.392200000000000,0.655500000000000,0.171200000000000])

注意这里Python的代码最后要进行一下转置,否则与Matlab的数据就就不一致。

整理完成看看数据和txt中的形状就完全一致了:

Aarray([[0.81472369, 0.0975404 , 0.15761308, 0.14188634, 0.6557407 ],[0.90579194, 0.27849822, 0.97059278, 0.42176128, 0.03571168],[0.12698682, 0.54688152, 0.95716695, 0.91573553, 0.84912931],[0.91337586, 0.95750684, 0.48537565, 0.79220733, 0.93399325],[0.63235925, 0.96488854, 0.80028047, 0.95949243, 0.67873515]])barray([0.7577, 0.7431, 0.3922, 0.6555, 0.1712])

这里b变成了一维数组但不影响计算。

3、求解方程组

  • Matlab部分

用Matlab求解线性方程组十分简单,直接一个反除号就可以搞定:

>> x = A  bx =-0.84093.77013.8572-8.00502.4445

注意这里x跑出来的值只是显示值,实际值的位数是远大于这个值的:

-0.840928749143009  3.77006972003583    3.85716025378275    -8.00495386938441   2.44448015270832

  • Python部分

用Python求解线性方程组的方式其实也很多,最简单的办法就是直接用scipy库的linalg模块中的solve方法:

from scipy.linalg import solvex = solve(A,b)xarray([-0.84092875,  3.77006972,  3.85716025, -8.00495387,  2.44448015])

为了更准确地对比数值的精度,我们将x的值用np.savetxt函数保存至文件再看具体数字:

-8.409287491430091910e-01
3.770069720035832184e+00
3.857160253782746739e+00
-8.004953869384410226e+00
2.444480152708315313e+00

仔细观察发现,Python输出的数值位数要稍多一些,这是因为我们用Matlab粘贴的时候它默认显示的位数不太一样。

注:这也是为什么我们一定要在最开始进行数据统一规范的原因。Matlab在存储变量时数据是保存了完整的位数的,但即便从变量查看窗口粘出来的数值也不一定是完整的数字。

4、精度验证

  • Matlab部分
error = norm(A*x-b)error =1.5801e-15% 查看15位
% 1.580118849929844e-15

  • Python部分
np.sqrt(np.sum((A.dot(x)-b)**2))1.580118849929844e-15

注意,由于两个数的量级都是1e-15,因此这里只需要看它们各自前16位即可。仔细观察不难发现,两个程序得到的结果完全一致。

这里我们把有效数字从第一位到最后一位排列直接放出来对比

# python
1580118849929843973242195223453751011511480618378089335607228349545039236545562744140625
# matlab
1580118849929843973242195223453751011511480618378089335607228349545039236545562744140625

肉眼观察信不过,全部放入Python字符串试试对不对:

#第一行数字(python结果):
s1 = '1580118849929843973242195223453751011511480618378089335607228349545039236545562744140625'#第二行数字(matlab结果):
s2 = '1580118849929843973242195223453751011511480618378089335607228349545039236545562744140625'

判断一下是否相等:

s1 == s2True

搞定!

5、结论

Python(Numpy, Scipy)的数值精度与Matlab是完全一致的。

matlab error函数_深度对比Python(Numpy,Scipy)与Matlab的数值精度相关推荐

  1. 深度对比Python(Numpy,Scipy)与Matlab的数值精度

    Matlab一度被认为是最专业的数值计算工具之一,相信许多同学都或多或少用过这个工具.相比而言,Python作为一种胶水式的语言,其设计之初就不是为科学计算服务的.之前也看到许多人在吐槽说用Pytho ...

  2. matlab plot函数_慧图大讲堂 | 一起来认识MATLAB吧!

    慧图大讲堂 岁月流转,时光飞逝.转眼间又开学了,小伙伴们在使用MATLAB吗?想知道漂亮的图表.还原模糊图像.图像识别.模型预测,这些好玩的东西怎么做?快点和慧图君一起认识MATLAB吧! 01 什么 ...

  3. python和matlab的区别_我为什么选择Python,不是Matlab和R语言呢?

    做数据分析.科学计算等离不开工具.语言的使用,目前最流行的数据语言,无非是MATLAB,R语言,Python这三种语言,但今天大圣众包(www.dashengzb.cn)小编简单总结了python语言 ...

  4. matlab db函数_图灵斑图与反应扩散方程——Matlab的实现

    假设我们在做一个化学反应实验,存在U和V两种化学物质,其中每单位U物质在两单位V物质的催化下,生成新的V物质.那么V物质的浓度将会发生怎样的变化? 设想一下,随着时间的推移,反应皿中 V物质的浓度应该 ...

  5. matlab disp函数_代码 | 求解LP问题单纯形法的Matlab代码

    介绍求解LP问题最优解的Matlab代码. Contents 求LP问题的基本(可行)解Matlab代码 基本原理 Matlab代码 初始化 是否随机生成LP问题还是自己指定LP问题 初始化系数矩阵A ...

  6. Matlab和Python(Numpy,Scipy)与Lapack的关系

    说到数值计算,可能许多人都能立马想到Matlab.Matlab多年的持续影响力已经让它成为许多人心中科学计算的代名词.但它底层一个重要的库Lapack却很少有人知道. 而Python年龄比Matlab ...

  7. python用于统计学_R 和 Python (numpy scipy pandas) 用于统计学分析,哪个更好?

    用R做过Python擅长的,也用Python做过R擅长的.有一天,打开官网,看到两句话,豁然开朗. R:R is a free software environment for statistical ...

  8. python编写函数_如何用Python编写自己喜欢的R函数

    python编写函数 数据科学和机器学习的伟大现代斗争之一是" Python vs. R". 毫无疑问,近年来两者都已经取得了巨大的发展,成为数据科学,预测分析和机器学习的顶级编程 ...

  9. python二维元素向量_详解python Numpy中求向量和矩阵的范数

    在python Numpy中求向量和矩阵的范数实例 np.linalg.norm(求范数):linalg=linear(线性)+algebra(代数),norm则表示范数. 函数参数 x_norm=n ...

最新文章

  1. 捉虫记 C++转java Java中equals和==的区别
  2. CF949A LFYZOJ#111 Zebras
  3. 最好理解的: spring ioc原理讲解,强烈推荐!
  4. python统计程序运行时间-如何方便地统计 Python 程序每一个函数、每一行代码执行所花的时间?...
  5. php递归简单例子,php递归json类实例
  6. dockerfile 与 docker-compose的区别
  7. 简单易懂的softmax交叉熵损失函数求导
  8. nginx下Thinkphp 隐藏index.php
  9. Matlab 绘制箱线图
  10. TransE 论文笔记
  11. 内部审计具体准则第28号—信息系统审计
  12. 编译原理 实验二 递归下降语法分析程序
  13. 第九十九章 SQL函数 NOW
  14. 松翰单片机--SN8F5702学习笔记(四)ADC
  15. 经典贪吃蛇大战逆向 去广告+游戏内购
  16. 路由交换接口类型详解——通俗易懂版
  17. MFC Ribbon模式下 菜单promt鼠标滑过时候的提示是需要在属性的promt前面加上\n
  18. 读内存为什么比读取磁盘快?快多少?
  19. 微信小程序全面屏适配
  20. 家长会计算机教师致辞,初中生物教师家长会发言稿

热门文章

  1. Nginx反向代理Redis服务
  2. 谷歌浏览器实现直接打印效果
  3. LSA类型讲解——LSA-1【1类LSA——Router LSA】详解
  4. rpm | 升级软件包
  5. GPLT-天梯赛-题解目录
  6. java中的lambda表达式学习
  7. MongoDB 安装与基本命令
  8. NodeJS获取命令行后面的参数
  9. 【Python】输入两个字符串,在第一字符串中删除第二个字符串中所包含的所有字符...
  10. 【Python】二维数据格式化