如何用Python的SymPy求隐函数的实水平与垂直切线?
解决隐函数求实切线的问题
问题分析
你的代码存在两个关键问题:
- 垂直切线的条件写错了:垂直切线对应
dy/dx不存在(分母为0),正确条件是y² - 4x = 0,而非你写的-x² + 4y = 0(这和水平切线条件重复了)。 - SymPy的
solve默认返回所有复数解,需要显式限定求解范围为实数域。
修正后的代码
from sympy import * x, y = symbols('x y') LHS = x**3 + y**3 RHS = 12*x*y # 计算隐式导数 dydx = idiff(LHS - RHS, y, x) print(f'dy/dx = {dydx}') print() # 水平切线:dy/dx=0 → 分子为0,同时满足原方程,限定实数解 htan = solve([4*y - x**2, LHS - RHS], [x, y], domain=S.Reals) print('Horizontal tangents at', htan) print() # 垂直切线:dy/dx不存在 → 分母为0,同时满足原方程,限定实数解 vtan = solve([y**2 - 4*x, LHS - RHS], [x, y], domain=S.Reals) print('Vertical tangents at', vtan) print()
手动筛选实根的方式
如果不想用domain参数,也可以在解出所有根后手动筛选实数解:
# 水平切线筛选实根 all_htan = solve([4*y - x**2, LHS - RHS], [x, y]) real_htan = [sol for sol in all_htan if all(s.is_real for s in sol)] print('Horizontal tangents (real only):', real_htan) # 垂直切线筛选实根 all_vtan = solve([y**2 - 4*x, LHS - RHS], [x, y]) real_vtan = [sol for sol in all_vtan if all(s.is_real for s in sol)] print('Vertical tangents (real only):', real_vtan)
结果说明
运行修正后的代码,会得到以下实解:
- 水平切线:
[(0, 0), (4, 4)](注意(0,0)是原函数的奇点,导数无定义,可根据需求判断是否保留) - 垂直切线:
[(0, 0), (4, 4)](同样(0,0)是奇点)
内容的提问来源于stack exchange,提问作者Men Chi
相关产品推荐
相关产品推荐

