def differential_equation(x,f): return sy.diff(f(x),x,2)+f(x)#f(x)''+f(x)=0 二阶常系数齐次微分方程 x=sy.symbols('x')#约定变量 f=sy.Function('f')#约定函数 print(sy.dsolve(differential_equation(x,f),f(x)))#打印 sy.pprint(sy.dsolve(differential_equation(x,f),f(x)))#漂亮的打印 输出:
Eq(f(x), C1*sin(x) + C2*cos(x))
f(x) = C₁⋅sin(x) + C₂⋅cos(x)

如果学过二阶常系数齐次解法的话,很容易知道这是对的,你也可以试下更简单的微分方程验证。

二、scipy.integrate.odeint

这个用起来就比较麻烦了,不过用于画图还是很棒的。先看一个一阶微分方程的例子。

import numpy as np
from scipy.integrate import odeint
#一阶微分方程的例子
def diff_equation(y,x):
    #dy/dx=y,其实手工解的话,很容易知道,y=Cexp(x)
    return np.array(y)#微分方程格式,左边一定是dy/dx,返回右边
x=np.linspace(0,1,num=100)#初始点是0
result=odeint(diff_equation,1,x)#中间那个是y0初值,即x=0时y=1
plt.plot(x,result[:,0])#result整个矩阵的第一列
plt.grid()#网格
plt.show()#这是y=exp(x)的图像
输出:

然而二阶的话,就有点麻烦了。

import numpy as np
from scipy.integrate import odeint
#二阶微分方程
def diff_equation(y_list,x):
    #y''+y=0 二阶的话,要换成两个一阶微分方程的方程组
    #设y'=z
    #那么z'=y''=-y
    #手工解也很容易知道是 y=C1sin(x)+C2cos(x)
    y,z=y_list
    return np.array([z,-y])
x=np.linspace(0,np.pi*2,num=100)
y0=[1,1]#y(0)=1,y'(0)=1
result=odeint(diff_equation,y0,x)
plt.plot(x,result[:,0],label='y')#y的图像,y=cos(x)+sin(x)
plt.plot(x,result[:,1],label='z')#z的图像,也就是y'的图像,z=-sin(x)+cos(x)
plt.legend()
plt.grid()
plt.show()
输出:

对了,想知道更详细的参数就看官网吧:

1、 http://docs.sympy.org/dev/modules/solvers/ode.html

2、 https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.odeint.html

一、sympy.dsolve首先,感觉最科学的是用sympy的dsolve解常微分方程,直接贴代码import sympy as sydef differential_equation(x,f): return sy.diff(f(x),x,2)+f(x)#f(x)''+f(x)=0 二阶常系数齐次微分方程x=sy.symbols('x')#约定变量f=sy.Functio
我们可以使用dsolve函数 具有 的微分方程,比如 https://blog.csdn.net/weixin_41855010/article/details/104188103 这篇博客中给出的热传导问题微分方程,我们再把这个方程matlab 的代码复习一遍: syms y(t) eqn = diff(y,t) == -0.05*(y-20); con = y(0) == 100; yS ...
f = symbols('f', cls=Function) x = symbols('x') eq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x)) print(dsolve(eq, f(x))) Eq(f(x), (C1 + C2*x)*exp(x) + cos(x)/2) 附:布置考试中两题 1.利用 python 的Sympy库求 微分方程的 y=f(x),并尝试利用matplotlib绘制函数图像 程序,如下 from sympy import plt.plot(t, y[:, 0], 'b', label='y(t)') plt.plot(t, y[:, 1], 'g', label="y'(t)") plt.legend(loc='best') plt.xlabel('t') plt.grid() plt.show() 运行结果如下图所示: ![ 常微分方程 结果](https://img-blog.csdn.net/20180528165003209?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cGVyX2Jsb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80)