SymPy 中 evalf 的错误结果,但仅适用于某些精度值

如何解决SymPy 中 evalf 的错误结果,但仅适用于某些精度值

我想我遇到了 Sympy 的 evalf() 方法一个错误,并通过了替换。

偶然地,如果我将变量 x 替换为整数而不是 Float,我发现了一个计算结果为错误值的表达式。有趣的是,这只发生在某些精度值上。

这个表达式看起来有些随意,但如果我试图进一步简化它,错误就会消失。这是一个最小的工作示例

#!/usr/bin/env python
import sympy
from sympy.abc import x

# Some valid mathematical expression
expr = 1/((x - 9)*(x - 8)*(x - 7)*(x - 4)**2*(x - 3)**3*(x - 2))


def example(prec):
    # This is the string 1.( prec-2 zeroes )1
    almost1 = '1.'+(prec-2)*'0'+'1'
    
    # We replace the integer 1
    res1 = expr.evalf(prec,subs={x:1})
    
    # We replace a Float veeery close to 1
    res_almost1 = expr.evalf(prec,subs={x:sympy.Float(almost1,prec)})

    return res1,res_almost1

预期的结果是返回的元组应该包含相似的数字,因为 1almost1 非常接近。但是,对于 prec 的某些值,通过将 1 替换为 expr 获得的结果是。 (虽然通过替换 almost1 获得的接近正确的。)

您可能会问:“表达式错误prec 的值是什么?”。通过运行代码

wrong = [str(a) for a in range(10,1001) if example(a)[0] == 0]
print(','.join(wrong))

我得到了这个看似完全随机的列表

11,20,22,29,31,38,40,49,58,67,76,78,85,87,94,96,105,114,123,132,134,141,143,150,152,159,161,170,179,188,190,197,199,206,208,215,217,226,235,244,253,255,262,264,271,273,282,291,300,309,311,318,320,327,329,338,347,356,365,367,374,376,383,385,392,394,403,412,421,423,430,432,439,441,448,450,459,468,477,486,488,495,497,504,506,515,524,533,542,544,551,553,560,562,571,580,589,598,600,607,609,616,618,625,627,636,645,654,663,665,672,674,681,683,692,701,710,719,721,728,730,737,739,748,757,766,775,777,784,786,793,795,802,804,813,822,831,833,840,842,849,851,858,860,869,878,887,896,898,905,907,914,916,925,934,943,952,954,961,963,970,972,981,990,999

我把它贴在这里,看看我的代码是否犯了一些错误,否则我打算在 Sympy 的 github 上发布一个错误问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?