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

Is there a method using sympy import in python to differentiate an equation, and find only the real horizontal and vertical tangents of the equation

提问人:Men Chi 提问时间:10/6/2023 最后编辑:jaredMen Chi 更新时间:10/7/2023 访问量:124

问:

我在 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()

每当我尝试打印时,我都会不断得到带有真实解决方案的想象解决方案。有没有人知道我能做些什么才能得到真正的水平线和切线?htanvtan

Python sympy 微分方程

评论

0赞 Achille G 10/6/2023
你不应该添加求解函数吗?real=True
0赞 Men Chi 10/6/2023
我不确定在求解函数中在哪里添加 real = True,我尝试了几个不同的地方,它们都给了我错误

答:

2赞 Davide_sd 10/6/2023 #1

正如评论中提到的@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 Plotting Backend 可视化结果:

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
)

enter image description here

如果你仔细观察,位于图表最右边的部分似乎是“分割”的。那是因为它附近有一个渐近线,并且该位置的表面非常非常陡峭。我们可以用 3D 图看到它:dy/dx

plot3d(
    dydx, (x, -10, 10), (y, -10, 10),
    wireframe=True, backend=PB, n=500, zlim=(-10, 10))

enter image description here

评论

0赞 Men Chi 10/7/2023
我爱你兄弟,谢谢
1赞 smichr 10/7/2023
这为两种情况提供了相同的解决方案。我建议编辑阅读.@Davide_sd,我希望有一个隐含的情节来显示交叉点!:-)vtansolve([4*x - y**2,LHS - RHS],[x,y])
1赞 Davide_sd 10/7/2023
谢谢@smichr,我什至没有想到:)做到了。
0赞 Men Chi 10/13/2023
2D 图形有助于将其可视化,谢谢,但我不是撒谎,我不知道 3D 图中发生了什么,但它看起来很酷,所以谢谢。
0赞 Davide_sd 10/13/2023
基本上,当您执行隐式 2D 绘图时,您正在可视化 3D 绘图的零等值线。看一下 3D 图:f(x, y) 和平面 z=0 之间的交集给出了 2D 隐式图。现在,3D 图显示 f(x, y) 变为无穷大(渐近线)。可悲的是,绘图模块不擅长分析 3D 绘图中的渐近线,因此您会得到一些奇怪的伪影......