提问人:Men Chi 提问时间:10/6/2023 最后编辑:jaredMen Chi 更新时间:10/7/2023 访问量:124
有没有一种在 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
问:
我在 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
答:
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
)
如果你仔细观察,位于图表最右边的部分似乎是“分割”的。那是因为它附近有一个渐近线,并且该位置的表面非常非常陡峭。我们可以用 3D 图看到它:dy/dx
plot3d(
dydx, (x, -10, 10), (y, -10, 10),
wireframe=True, backend=PB, n=500, zlim=(-10, 10))
评论
0赞
Men Chi
10/7/2023
我爱你兄弟,谢谢
1赞
smichr
10/7/2023
这为两种情况提供了相同的解决方案。我建议编辑阅读.@Davide_sd,我希望有一个隐含的情节来显示交叉点!:-)vtan
solve([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 绘图中的渐近线,因此您会得到一些奇怪的伪影......
上一个:用条件语句求解一组常微分方程
评论
real=True