Sympy数值转换异常:导入计算结果后无法运行优化函数且出现无穷值
问题描述
我编写了一个用于优化SymPy数值的函数Optimize_function(),调用方式为:
Optimize_function(list_1)
在Jupyter Notebook中输入list_1,输出元素均为SymPy的Float对象,具体内容如下:
[1, -988311972974935601., -335500850087402876., 1.32380518039078953e+18, -152434983182794179., 5.01315110369571637e+30, 3.61720312745301514e+33, -4309097254489294.70, 2.92407586668978579e+30, -1.17625737323022613e+34, -6276449726684414.55, -1.11152085817592009e+18, -2.71731566816187054e+29, 8.23318771547418636e+33, -1.53357167323722711e+26, 495654166482945.700, -3.30342982583157026e+30, -123643162644077806., -3.86735929106876011e+30, -568654588842030.100, 2.84640254508985288e+30, -4.51320218189050107e+31, 2812838629251394.05, -3.34119272054976907e+30, 388482304818.400000, 1.17639569262675174e+26, -5308554527899933.75, 2468145414450498.30, 31883120268830274.4, 1.30178514781976186e+18, 64680837588749954.5]
但重启Jupyter Notebook后,手动导入上述list_1后,Optimize_function()无法运行。我尝试通过以下代码将其转换回SymPy Float对象:
list_1 = [ sp.Float(sp.N(value,50)) for value in list_1]
结果并未得到原始对象,反而出现多个无穷值。请问如何正确转换该结果,使其可用于SymPy计算?
解决方案
- 用字符串直接初始化SymPy Float:重启后导入的
list_1元素是Python原生float/整数,而原生float仅支持双精度(约15-17位有效数字),你的数值包含18位以上的有效数字,直接转换会丢失精度甚至溢出为无穷大。正确做法是将每个数值转为字符串后传入sp.Float,完整保留所有有效数字:import sympy as sp list_1_sympy = [sp.Float(str(val)) for val in list_1] - 不要使用
sp.N()转换:sp.N()的作用是将符号表达式转为数值近似,对原生数值使用会额外引入精度损失或溢出,完全没必要。直接用字符串初始化是最可靠的方式,SymPy会解析字符串中的全部数字。 - 验证转换有效性:转换后可以检查元素类型和数值是否匹配原始值:
# 检查类型 print(type(list_1_sympy[1])) # 输出 <class 'sympy.core.numbers.Float'> # 检查数值 print(list_1_sympy[1]) # 输出 -988311972974935601.0,与原始值一致
内容的提问来源于stack exchange,提问作者ShoutOutAndCalculate
相关产品推荐
相关产品推荐

