Sympy不动点法代码中符号值比较引发TypeError的解决求助
Sympy不动点法代码中符号值比较引发TypeError的解决求助
我遇到了在比较符号值时出现的问题,比如当我在代码中输入
e^(8*x)作为初始函数时,我尝试用evalf()把值转换成数值,但它们仍然是符号型的。我还能怎么做?
先帮你梳理下代码里的几个关键问题,这些就是导致符号值残留、引发类型错误的根源:
- 循环内重复定义符号变量:你每次循环都重新执行
x = sp.symbols('x'),这完全没必要,反而会让SymPy反复创建新的符号对象,导致后续计算的混淆——符号变量只需要在代码开头定义一次就够了。 - evalf()的使用方式错误:
evalf()是返回一个新的数值对象,不会原地修改原来的符号变量。你写的x.evalf()、resultado.evalf()都没有把返回值赋值给变量,等于白执行了这个方法。 - 类型转换不彻底:当你把
resultado赋值给valini时,resultado其实是SymPy的Float类型(本质还是符号对象),不是Python原生的浮点数,直接用来做比较或计算就容易触发类型错误。
我给你调整了代码,解决了这些问题:
import math import sympy as sp print("Fixed Point Method") # 符号变量x只定义一次,放在循环外部 x = sp.symbols('x') funini = input("Initial function\nx= ") # 用户输入初始函数 valini = float(input("Initial value of x\n")) # 直接将输入转为Python原生float errabs = float(input("Absolute error to obtain\n")) # 同样转为原生float i = 0 errorfin = 100.0 while True: i += 1 # 将用户输入的字符串转为符号表达式 funcion = sp.sympify(funini) # 代入x值计算后,直接转成Python原生float,彻底脱离符号类型 resultado = float(funcion.subs(x, valini).evalf()) print(f"For iteration {i}, x= {resultado}") # 用原生浮点数计算误差,避免符号类型干扰 errorfin = abs((resultado - valini) / resultado) print(f"The error is {errorfin}") # 更新初始值,保持原生float类型 valini = resultado if i == 10: print("已达到最大10次迭代,数值可能未收敛,请尝试新的初始x值") break elif errorfin <= errabs: print(f"误差已小于设定的绝对误差,根为 {resultado}") break
核心修改点说明:
- 把符号变量
x的定义移到循环外,避免重复创建符号对象; - 每次计算结果后用
float()转换成Python原生浮点数,彻底摆脱符号类型的影响; - 删除了无意义的
evalf()调用(没有赋值的话根本起不到转换作用); - 简化了输入转换逻辑,不需要重复执行
float()转换。
这样再测试e^(8*x)这类函数,应该就不会再出现符号值比较的问题了。
备注:内容来源于stack exchange,提问作者user30008060
相关产品推荐
相关产品推荐

