我在 python 中使用 sympy 来隐式微分(x^3+y^3=12xy)。当我尝试求解水平切线和垂直切线时,问题就出现了。我不断为这两个问题找到想象中的解决方案。
这是我到目前为止的代码
from sympy import *
x,y,t=symbols('x y t')
LHS=x**3+y**3
RHS=12*x*y
dydx = idiff(LHS-RHS, y, x)
print(f'dy/dx = {dydx}')
print()
htan=solve([4*y-x**2,LHS-RHS],[x,y])
print('Horizontal tangents at',htan)
print()
vtan=solve([-x**2 + 4*y,RHS-LHS],[x,y])
print('Vertical tangents at',vtan)
print()
每当我尝试打印
htan
和 vtan
时,我都会不断得到想象中的解决方案和真实的解决方案。有谁知道我能做什么才能得到真正的水平线和切线?
正如@Archille在评论中提到的,只需在创建符号时设置
real=True
,如下所示:
from sympy import *
x,y,t=symbols('x y t', real=True)
LHS=x**3+y**3
RHS=12*x*y
dydx = idiff(LHS-RHS, y, x)
print(f'dy/dx = {dydx}')
print()
htan=solve([4*y-x**2,LHS-RHS],[x,y])
print('Horizontal tangents at',htan)
print()
vtan=solve([4*x - y**2,LHS - RHS],[x,y])
print('Vertical tangents at',vtan)
print()
编辑以包含@smichr建议的改进:
我们还可以使用 SymPy 绘图后端可视化结果:
from spb import *
xx1 = [p[0] for p in vtan]
yy1 = [p[1] for p in vtan]
xx2 = [p[0] for p in htan]
yy2 = [p[1] for p in htan]
graphics(
implicit_2d(Eq(LHS, RHS), (x, -10, 10), (y, -10, 10), n=200),
implicit_2d(dydx, (x, -10, 10), (y, -10, 10), label="dy/dx", n=500, adaptive=False),
list_2d(xx1, yy1, label="vtan", scatter=True, rendering_kw={"marker": "x", "markersize": 10}),
list_2d(xx2, yy2, label="htan", scatter=True),
grid=False
)
如果仔细观察,
dy/dx
位于图表最右侧的部分似乎是“分段的”。这是因为它附近有一条渐近线,并且该位置的表面非常非常陡。我们可以通过 3D 图来看到它:
plot3d(
dydx, (x, -10, 10), (y, -10, 10),
wireframe=True, backend=PB, n=500, zlim=(-10, 10))