如何用Python求解一阶齐次微分方程x·∂y/∂x=y+2x³sin²(y/x)并解决sympy报错
一阶齐次微分方程求解方案
你遇到的报错是因为sympy默认遍历求解方法时,没有匹配到该一阶齐次方程的适配规则,最终走到lie群方法分支时无法求解,抛出异常。可通过以下两种方式解决:
方法1:指定dsolve的求解类型参数
直接在dsolve中传入hint参数声明这是一阶齐次方程,sympy会自动使用齐次方程的变量代换逻辑求解,修改后的代码如下:
from sympy import * x = symbols('x') y = symbols('y', cls=Function) eq = Eq(Derivative(y(x),x), 2*x**2 * sin(y(x)/x)**2 + y(x)/x) display(eq) # 指定hint为一阶齐次方程求解规则 an_sol = dsolve(eq, y(x), hint='1st_homogeneous') display(an_sol)
运行后可以得到解析解,隐式形式为:-1/tan(y(x)/x) = x**2 + C1
也可以转换为显式形式:y(x) = x * atan(1/(C1 - x**2))
其中C1为任意常数。
方法2:手动变量代换后求解
你也可以手动做齐次方程的标准代换 u = y(x)/x(即 y(x) = u(x)*x),代入原方程化简为可分离变量的微分方程后求解,代码如下:
from sympy import * x = symbols('x') u = symbols('u', cls=Function) # 代换y = u*x,求导后代入原方程 y = u(x) * x dy_dx = diff(y, x) eq = Eq(x * dy_dx, y + 2*x**3 * sin(u(x))**2) # 整理化简方程 simplified_eq = simplify(eq) display(simplified_eq) # 求解u的微分方程 u_sol = dsolve(simplified_eq, u(x)) display(u_sol) # 代换回y得到最终解 y_sol = u_sol.subs(u(x), y(x)/x) display(y_sol)
两种方法得到的解完全一致,你可以代入原方程验证等式成立。
内容的提问来源于stack exchange,提问作者Altynay Utebayeva
相关产品推荐
相关产品推荐

