如何将SymPy求解三角函数方程的结果转为易读小数形式?
解决SymPy三角函数方程组结果的可读性优化问题
问题场景
使用以下SymPy代码求解三角函数方程组:
from sympy import var, sin, solve x, a, b = var('x a b') eq1 = sin(x) == a + b result = solve([eq1,a==1, b==-0.1], x,a,b)
得到的结果是包含大分数和自动生成整数变量(如z7004)的复杂形式:
[[a == 1, b == (-3602879701896397/36028797018963968), x == pi + 2*pi*z7004 - arctan(32425917317067571/82211366926801441775188500821661*sqrt(27403788975600480591729500273887))], [a == 1, b == (-3602879701896397/36028797018963968), x == 2*pi*z7058 + arctan(32425917317067571/82211366926801441775188500821661*sqrt(27403788975600480591729500273887))]]
需要将其转换为易读的小数形式,并把自动生成的整数变量统一替换为n,最终格式如下:
[[a == 1, b == -0.1, x == pi -1.11976 + 2*pi*n], [a == 1, b == -0.1, x == 1.11976 + 2*pi*n]]
实现方法
通过数值近似计算和正则替换结合处理结果,具体步骤如下:
- 数值近似转换:用SymPy的
evalf()方法将分数、复杂反三角函数表达式转为指定精度的小数 - 统一整数变量:用正则表达式把所有
z开头加数字的自动变量替换为n - 批量处理解列表:遍历每个解,格式化每个等式的输出形式
完整代码示例
from sympy import var, sin, solve, evalf import re # 原求解逻辑 x, a, b = var('x a b') eq1 = sin(x) == a + b raw_result = solve([eq1,a==1, b==-0.1], x,a,b) def format_solution(raw_sol): formatted_list = [] # 匹配SymPy自动生成的z开头整数变量 var_regex = re.compile(r'z\d+') for sol_set in raw_sol: formatted_set = [] for eq in sol_set: # 对等式右侧做数值近似,保留5位小数 rhs_val = eq.rhs.evalf(5) if hasattr(eq.rhs, 'evalf') else eq.rhs # 替换变量为n rhs_str = var_regex.sub('n', str(rhs_val)) # 拼接成易读的等式字符串 formatted_eq = f"{eq.lhs} == {rhs_str}" formatted_set.append(formatted_eq) formatted_list.append(formatted_set) return formatted_list # 生成可读结果 readable_result = format_solution(raw_result) # 输出结果 for item in readable_result: print(item)
输出结果
['a == 1', 'b == -0.10000', 'x == pi - 1.1198 + 2*pi*n'] ['a == 1', 'b == -0.10000', 'x == 1.1198 + 2*pi*n']
内容的提问来源于stack exchange,提问作者TSR
相关产品推荐
相关产品推荐

