有没有一种方法在python中使用sympy import来微分方程,并只找到方程的实水平和垂直切线

问题描述 投票:0回答:1

我在 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
时,我都会不断得到想象中的解决方案和真实的解决方案。有谁知道我能做什么才能得到真正的水平线和切线?

python sympy differential-equations
1个回答
0
投票

正如@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))

© www.soinside.com 2019 - 2024. All rights reserved.