使用SymPy实现降阶法解微分方程时三角函数输入报错求助
问题:输入三角函数时出现Sympify解析错误
当输入sin x这类带空格的三角函数表达式时,触发如下错误:
SympifyError: Sympify of expression 'could not parse 'sin x'' failed, because of exception being raised: SyntaxError: invalid syntax (<string>, line 1)
错误原因
SymPy的sympify函数要求数学表达式符合Python/SymPy语法规范,三角函数(如sin、cos)的调用必须用括号包裹参数,sin x这种空格分隔的写法不符合语法,导致解析失败。
解决方法
方法1:规范输入格式
直接提示用户输入带括号的三角函数表达式,比如将sin x改为sin(x)、cos 2x改为cos(2*x)。
方法2:自动预处理输入(推荐)
在代码中添加输入预处理逻辑,用正则表达式将类似sin x的格式自动转换为sin(x),兼容用户的自然输入习惯。
修改后的完整代码
import re from sympy import symbols, sympify, integrate, exp def preprocess_input(expr_str): # 匹配三角函数、对数等函数名后接空格的情况,替换为带括号的形式 pattern = r'(sin|cos|tan|cot|sec|csc|log|ln|exp)\s+([a-zA-Z0-9\*\/\+\-]+)' processed = re.sub(pattern, r'\1(\2)', expr_str) # 自动补充数字与变量间的乘号,比如2x转为2*x processed = re.sub(r'(\d)([a-zA-Z])', r'\1*\2', processed) processed = re.sub(r'([a-zA-Z])(\d)', r'\1*\2', processed) return processed def DividirFuncion(expr): P1T = expr[0] newExpr = [] for i in range(len(expr)): NuevEle = expr[i]/P1T newExpr.append(NuevEle) return newExpr def main(): x = symbols("x") EDO = [] # 预处理输入后再解析 dy2_input = preprocess_input(input("Dame y'' ")) dy2 = sympify(dy2_input) dy1_input = preprocess_input(input("Dame y' ")) dy1 = sympify(dy1_input) dy_input = preprocess_input(input("Dame y ")) dy = sympify(dy_input) EDO.append(dy2) EDO.append(dy1) EDO.append(dy) Y1_input = preprocess_input(input("Ingresa el valor inicial de y1: ")) Y1 = sympify(Y1_input) Edo2 = DividirFuncion(EDO) dPx = Edo2[1] P = integrate(dPx) k = exp(-P)/(Y1**2) # 统一指定积分变量x,避免省略变量导致的歧义 y2 = Y1 * integrate(k, x) print("\nEl resultado final es:", y2) if __name__ == "__main__": main()
额外优化说明
- 修正了
integrate的调用逻辑:原代码中if k ==1的判断无必要,SymPy的integrate可统一指定积分变量x,避免歧义。 - 增加数字与变量间的乘号自动补充,用户输入
2x会自动转为2*x,进一步兼容自然输入习惯。
内容的提问来源于stack exchange,提问作者Rox_A
相关产品推荐
相关产品推荐

