我做了一次mpmath和sendy的判断,发现了不一致的地方,这是我无法解决的.我相信mpath给出了正确的结果.拜托,有没有人能帮忙解决这个问题?

import sympy as sp
import mpmath as mp

# Set the desired precision to 120 decimal places using mpmath
mp.mp.dps = 30               

print('mp: ', mp.sin('0.4'))

# Define the variable and calculate the sine function
x = sp.symbols('x')

x = '0.4'
print('sp: ', (sp.sin(x).evalf(30)))
print('N : ', sp.N(sp.sin(x), 30))

x = sp.symbols('x')
sin_func = sp.sin('0.4')

# Convert the sine function to mpmath format
sin_func_mpmath = sp.lambdify(x, sin_func, modules='mpmath')

# Evaluate the sine function at a specific value of x
result = sin_func_mpmath(mp.mpf('0.4'))
print('mo: ', result)

带输出:

MP:0.3894 183423086491666166756796

SP:0.389418342308650522465285348517

编号:0.389418342308650522465285348517

莫:0.38941834230865052245285348517

推荐答案

在SymPy中,当您将浮点数传递给函数时,它会使用浮点数精度自动求值.传递字符串没有什么不同,因为如果字符串有小数点,则会将其转换为浮点数:

In [13]: sympy.sin(0.4)
Out[13]: 0.389418342308651

In [14]: sympy.sin('0.4')
Out[14]: 0.389418342308651

由于sin('0.4')已经以15位小数精度计算,因此呼叫evalf(30)不能增加预期结果的准确性.你得到了更多的数字,但它们只是更多的数字,代表了15位近似值的精确值.有了足够的数字,您将看到该近似值的精确值:

In [15]: sympy.sin('0.4').evalf(1000)
Out[15]: 
0.38941834230865052246528534851677250117063522338867187500000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000

使用SymPy时,如果您想要精确的值,或者想要使用超过默认的15位十进制数字(53个二进制位)的精度,则应该创建精确的有理数,而不是浮点数:

In [16]: sympy.sympify('0.4')
Out[16]: 0.400000000000000

In [17]: sympy.Rational('0.4')
Out[17]: 2/5

In [18]: sympy.sin(sympy.Rational('0.4'))
Out[18]: sin(2/5)

In [19]: sympy.sin(sympy.Rational('0.4')).evalf(30)
Out[19]: 0.389418342308650491666311756796

evalf需要像上面的sin(2/5)这样的精确表达式才能计算出精确到指定位数的答案.最后一个结果与30位的mpath一致,并且实际上是由mpath计算的,而SymPy在内部使用mpath表示evalf.

Python相关问答推荐

Python Hashicorp Vault库hvac创建新的秘密版本,但从先前版本中删除了密钥

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

运行总计基于多列pandas的分组和总和

管道冻结和管道卸载

如何列举Pandigital Prime Set

Julia CSV for Python中的等效性Pandas index_col参数

在Mac上安装ipython

当独立的网络调用不应该互相阻塞时,'

try 将一行连接到Tensorflow中的矩阵

在pandas中使用group_by,但有条件

Python列表不会在条件while循环中正确随机化'

在两极中过滤

pandas:对多级列框架的列进行排序/重新排序

将一个双框爆炸到另一个双框的范围内

Python 3试图访问在线程调用中实例化的类的对象

如何在验证文本列表时使正则表达式无序?

如何获得满足掩码条件的第一行的索引?

对数据帧进行分组,并按组间等概率抽样n行

从列表中分离数据的最佳方式

时长超过24小时如何从Excel导入时长数据