2021-11-12

解常微分方程

  1. 利用sympy的odient解ode
    以二阶为例
    f ( x ) = { y ′ ′ − y + x = 0 y ( 0 ) = y ( 1 ) = 0 f(x)=\left\{ \begin{aligned} y''-y+x & = 0 \\ y(0)=y(1) & = 0 \\ \end{aligned} \right. f(x)={yy+xy(0)=y(1)=0=0
    已知答案:
    y ′ = x − s i n h ( x ) s i n h ( 1 ) y'=x- \frac {sinh(x)}{sinh(1)} y=xsinh(1)sinh(x)
from scipy.integrate import odeint
from sympy.abc import t
import numpy as np
import matplotlib.pyplot as plt
import matplotlib



#定义一个方程组(微分方程组)
def pfun(y,x):
	y1,y2=y; #让'y'成为一个[y1',y2']的向量 所以将等式左边都化为1阶微分是很重要的
	return np.array([y2,y1-x]) #返回的是等式右边的值
x=np.arange(0,1,0.01) #创建自变量序列
soli=odeint(pfun,[0.0,0.149],x) #求数值解
plt.rc('font',size=16); plt.rc('font',family='SimHei')
plt.plot(x,soli[:,0],'r*',label="数值解")
plt.rcParams['axes.unicode_minus']=False
plt.plot(x,x-np.sinh(x)/np.sinh(1),'g',label="符号解曲线")
plt.legend()
plt.show()

针对于odeint必须有初始值,方程组未给一阶导初始值,这里利用答案反推`

import numpy as np
import sympy as s


def f(x):
    return x-np.sinh(x)/np.sinh(1)#x-np.sinh(x)/np.sinh(1)
x = s.symbols("x")
print(s.diff(f(x),x))

报错: ‘Symbol’ object has no attribute ‘sinh’
改进:
添加一行,并把np.sinh(x)改sinh

from sympy import sinh

得到初始值
0.149
解析解与数值解
总结:方法并不好,只能拿来掌握一下odient的函数,后续使用差分法做讨论

  1. 利用差分法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值