Python 如何绘制一个非常复杂函数的导数

Python 如何绘制一个非常复杂函数的导数,python,derivative,Python,Derivative,这一问题与环境有关。如你所见,这个方程是超长的,我定义了很多变量来简化这个长方程。我想绘制(dU/dt)*(dP/dt)^-1,其中U和P都在代码中定义。这个等式有很多变量,这使得完成这项任务变得复杂。我已经尝试了所有我能尝试的方法,但仍然没有得到一个好的结果。请帮帮我,非常感谢 将numpy导入为np 输入数学 将matplotlib.pyplot作为plt导入 将sympy作为sym导入 #这些是我定义的常量变量 kb=1.381e-23 h=6.626e-34 me=9.109e-31 m

这一问题与环境有关。如你所见,这个方程是超长的,我定义了很多变量来简化这个长方程。我想绘制
(dU/dt)*(dP/dt)^-1
,其中
U
P
都在代码中定义。这个等式有很多变量,这使得完成这项任务变得复杂。我已经尝试了所有我能尝试的方法,但仍然没有得到一个好的结果。请帮帮我,非常感谢

将numpy导入为np
输入数学
将matplotlib.pyplot作为plt导入
将sympy作为sym导入
#这些是我定义的常量变量
kb=1.381e-23
h=6.626e-34
me=9.109e-31
mh=1.67e-27
pi=math.pi
rho1=10e-7
rho2=10e-5
rho3=10e-3
#以下变量将用于P和U的定义
t=np.linspace(5000250001000)
k1=(1/rho1)*(mh*((2*3.1415926*me*kb)**(3/2))/(h**3)
k2=2.18e-18/kb
k3=(1/rho2)*(mh*((2*3.1415926*me*kb)**(3/2))/(h**3)
k4=(1/rho3)*(mh*((2*3.1415926*me*kb)**(3/2))/(h**3)
x1=(-k1*(t**(3/2))*np.exp(-k2/t)+np.sqrt((k1**2)*(t**3)*np.exp(-k2*2/t)+4*k1*(t**(3/2))*np.exp(-k2/t))/2)
x2=(-k3*(t**(3/2))*np.exp(-k2/t)+np.sqrt((k3**2)*(t**3)*np.exp(-k2*2/t)+4*k3*(t**(3/2))*np.exp(-k2/t))/2)
x3=(-k4*(t**(3/2))*np.exp(-k2/t)+np.sqrt((k4**2)*(t**3)*np.exp(-k2*2/t)+4*k4*(t**(3/2))*np.exp(-k2/t))/2)
#我在这里定义了P和U
P=(rho3/mh)*(1+x3)*(kb*t)
U=1.5*P+rho3*x3*2.18e-18/(mh)
选项#1
通过分析计算导数,例如,用手或用手计算并绘制

选项2
例如,使用数值梯度近似。以下是您的问题的一个示例:

defsaha(t):
kb=1.381e-23
h=6.626e-34
me=9.109e-31
mh=1.67e-27
pi=math.pi
rho1=10e-7
rho2=10e-5
rho3=10e-3
k1=(1/rho1)*(mh*((2*3.1415926*me*kb)**(3/2))/(h**3)
k2=2.18e-18/kb
k3=(1/rho2)*(mh*((2*3.1415926*me*kb)**(3/2))/(h**3)
k4=(1/rho3)*(mh*((2*3.1415926*me*kb)**(3/2))/(h**3)
x1=(-k1*(t**(3/2))*np.exp(-k2/t)+np.sqrt((k1**2)*(t**3)*np.exp(-k2*2/t)+4*k1*(t**(3/2))*np.exp(-k2/t))/2)
x2=(-k3*(t**(3/2))*np.exp(-k2/t)+np.sqrt((k3**2)*(t**3)*np.exp(-k2*2/t)+4*k3*(t**(3/2))*np.exp(-k2/t))/2)
x3=(-k4*(t**(3/2))*np.exp(-k2/t)+np.sqrt((k4**2)*(t**3)*np.exp(-k2*2/t)+4*k4*(t**(3/2))*np.exp(-k2/t))/2)
P=(rho3/mh)*(1+x3)*(kb*t)
U=1.5*p+rho3*x3*2.18e-18/(mh)
返回P,U
#计算U和P
t=np.linspace(5000250001000)
p、 u=saha(t)
#计算U和P w.r.t.的梯度
u_梯度=np梯度(u)
p_梯度=np梯度(p)
#密谋
plt.绘图(t,u_梯度*1/(p_梯度))
plt.ylabel(“(dU/dt)*(dP/dt)^-1”)
plt.xlabel(“T”)
plt.savefig(“saha.png”,dpi=100)

使用有限差分法计算dU/dt和dP/dt的近似值,并绘制所需的导数。

这太难理解了,请附上一个表达式好吗?能否详细说明您到底尝试了什么,输出是什么,以及输出是如何意外/无法使用的?优雅的matplotlib只做点和线,绘制表达式意味着将其解析为n个点。@Weilory这是正确的。但这已经是TS正在做的事情了,所以做起来并不难。下面的选项#2已经做到了这一点。谢谢你,我尝试了你发布的代码,但是没有显示任何图形,为什么会发生这种情况,非常感谢你的回答
plt.savefig()
将保存图形。您可以使用
plt.show()
简单地显示绘图。如果解决了您的问题,请随时接受我的答案。谢谢