解方程(Python)
2025-12-14 11:31:58
发布于:浙江
在搞之前,请先安装Sympy,如果没有安装,请在cmd里用以下命令安装:
pip install sympy
好,安装好以后就可以开始了
先导入相关的模块
from sympy import symbols, Eq, solve, sin, cos, tan, pi, solveset, S, Union, ImageSet, Lambda, nsimplify, Symbol
接下来是符号部分
def preprocess_equation(equation_str):
# 替换幂运算符 '²' 为 '**2'
equation_str = equation_str.replace('²', '**2')
# 自动在系数和变量之间插入乘法运算符 '*'
import re
equation_str = re.sub(r'(\d+)([a-zA-Z])', r'\1*\2', equation_str)
# 处理^,将其视为乘方操作
equation_str = equation_str.replace('^', '**')
return equation_str
def format_solution(sol):
# 将 sqrt(n) 替换为 √n 并保留括号
sol_str = str(nsimplify(sol))
sol_str = sol_str.replace('sqrt', '√')
return sol_str
准备妥当以后来解方程
def solve_equation(equation_str):
# 定义变量x
x = symbols('x')
try:
# 预处理方程字符串
equation_str = preprocess_equation(equation_str)
# 将输入的字符串解析为SymPy表达式
left_side, right_side = equation_str.split('=')
equation = Eq(eval(left_side), eval(right_side))
# 解方程
if 'sin' in equation_str or 'cos' in equation_str or 'tan' in equation_str:
solutions = solveset(equation, x, domain=S.Reals)
else:
solutions = solve(equation, x)
# 格式化输出,只保留实数解,并尽量保持符号形式
formatted_solutions = []
if isinstance(solutions, (set, list)):
for sol in solutions:
if sol.is_real:
formatted_solutions.append(format_solution(sol))
elif isinstance(solutions, Union):
for subset in solutions.args:
if isinstance(subset, ImageSet):
n = Symbol('n', integer=True)
sol = subset.lamda(n)
formatted_solutions.append(format_solution(sol))
elif isinstance(solutions, str):
formatted_solutions.append(solutions)
else:
formatted_solutions.append(str(solutions))
return formatted_solutions
except Exception as e:
return f"Error: {e}"
if __name__ == "__main__":
equation_input = input("请输入方程:")
result = solve_equation(equation_input)
if type(result)==str:
print(result)
elif result==[]:
print("没有实数解!")
elif len(result)==1:
print(f"x={result[0].replace('**','^')}")
else:
for i in range(len(result)):
print(f"x{i+1}={result[i].replace('**','^')}")
这里给大家搞一个测试
请输入方程:8x3+10x2+100x+8=0
x=-575/(144*(3511/1728 + √(156201)/48)^(1/3)) - 5/12 + (3511/1728 + √(156201)/48)^(1/3)
不过有一个小问题,就是如果输入恒等式的话会显示“没有实数解!”
这里空空如也










有帮助,赞一个