python用slove解微分方程

请问这个该怎么解?

先贴一下前两题的代码,后面的正在写:

导入库

from scipy.integrate import odeint, solve_bvp, solve_ivp
import numpy as np
import matplotlib.pyplot as plt

第一题 

#定义求解的函数
def fun(t,y):
  return t+y*y

t_span = (0,0.5) #定义自变量t的取值范围,(t0, tf)
y0 = [1]  #初始值 y0, y(t0) = y0
t = np.linspace(0,0.5,100) #方程数值解的点

ans = solve_ivp(fun, t_span, y0, t_eval=t) #求解
plt.plot(ans.t, ans.y[0]) #ans.y是二维的

第二题 

#定义求解的函数
def fun(t,y):
  return np.e**t/y

t_span = (0, 5) #定义自变量t的取值范围,(t0, tf)
y0 = [2]  #初始值 y0, y(t0) = y0
t = np.linspace(0, 5, 1000) #方程数值解的点

ans = solve_ivp(fun, t_span, y0, t_eval=t) #求解
plt.plot(ans.t, ans.y[0]) #ans.y是二维的

 

第三题 

def fun(t,y):
    '''
    要把y看出一个向量,y = [dy0,dy1,dy2,...]分别表示y的n阶导,那么
    y[0]就是需要求解的函数,y[1]表示一阶导,y[2]表示二阶导,以此类推
    '''
    dy1 = y[1]      # y[1]=dy/dt,一阶导
    dy2 = np.cos(t) - y[0] -y[1] # y[0]是最初始,也就是需要求解的函数
    # 注意返回的顺序是[一阶导, 二阶导],这就形成了关于y[0],y[1]一阶微分方程组
    return [dy1,dy2] 
  
t = np.linspace(0,6*np.pi,1000)
t_span = (0, 6*np.pi)
y0 = [1, 0] #初值条件
# 初值[2,0]表示y(0)=2,y'(0)=0
# 返回y,其中y[:,0]是y[0]的值,就是最终解,y[:,1]是y'(x)的值
ans = solve_ivp(fun, t_span, y0, t_eval=t)
plt.plot(ans.t,ans.y[0])

第四题

def fun(t,y):
    '''
    y = [y1,y1`,y2,y2`]
    '''
    
    dy1 = y[1]
    ddy1 = -y[0] + y[0]*y[3]      
    dy2 = y[3]
    ddy2 = -y[2]**3 + y[1]
    
    return [dy1,ddy1,dy2,ddy2]
  
t = np.linspace(0,10,10000)
t_span = (0,10)
y0 = [1,0,0,1] #初值条件
ans = solve_ivp(fun, t_span, y0, method='RK23') #RK45不平滑
plt.plot(ans.t,ans.y[0])
plt.plot(ans.t,ans.y[2])

 

参考一下

https://www.pythonheidong.com/blog/article/447172/b891a34954a1767ca3c0/