版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数值分析方法主编
李冬果李林高磊首都医科大学生物医学工程学院智能医学工程学学系面向“四新”人才培养普通高等教育系列教材第六章常微分方程数值解法目录/Contents6.1
认识微分方程
6.2
微分方程初值问题的Euler方法
6.3
微分方程初值问题数值解的误差与稳定性分析
6.4
微分方程初值问题的Runge-Kutta法
6.5
非线性微分方程组初值问题的龙格-库塔法
目录/Contents6.6
线性多步方法
6.7
微分方程组的刚性问题
6.8二阶微分方程的边值问题
6.9
微分方程计算机实验
6.9微分方程计算机实验6.9.1显式Euler公式和改进Euler公式的实现我们可以通过以下代码实现Euler法:defeuler(f,x0,y0,b,h):
y=[y0]
x=[x0]
while(x0+h)<=b:
y0=h*f(x0,y0)+y0
x0=x0+h
y.append(y0)
x.append(x0)
returny,x其中输入参数:函数f即为所求的初值问题中的导函数,x0为初值点,y0为初值点处对应的函数值,b为积分区间的终点,而h则是步长。返回值为两个列表,其中分别存储计算出的微分方程解的函数值,和与该函数值对应的自变量值。类似于Euler公式,将递推公式进行修改,就得到了改进Euler法的求解函数defeuler_improved(f,x0,y0,b,h):
y=[y0]
x=[x0]
while(x0+h)<=b:
x1=x0+h
yp=y0+h*f(x0,y0)
yc=y0+h*f(x1,yp)
y0=(yp+yc)/2
x0=x1
y.append(y0)
x.append(x0)
returny,x其参数与之前Euler法的定义相同。例6.9.1用Euler公式(6.2.2)和改进Euler公式(6.2.10)求解初值问题(6.2.3)。解:
为了实现指数运算,需要导入其他工具包,这里使用numpy工具包。importnumpyasnp使用lambda定义导函数fun_6_2_1和解函数real_ans_6_2_1fun_6_2_1=lambdax,y:y-3*x/y**(1/3)
real_ans_6_2_1=lambdax:(9+12*x-5*np.exp(4*x/3))**(3/4)/2**(3/2)应用之前定义的函数实现Euler公式和改进Euler公式,将函数值分别返回给y1和y2[y1,x1]=euler(fun_6_2_1,0,1,1,0.1)
[y2,x2]=euler_improved(fun_6_2_1,0,1,1,0.1)计算真实的函数值y_real:
y_real=[real_ans_6_2_1(x)forxinx1]
打印结果:print("x\tEuler法y\t真实值\t改进Euler法y")
forkinrange(11):
print(f"{x1[k]:.1f}\t{y1[k]:.6f}\t{y_real[k]:.6f}\t{y2[k]:.6f}")结果见表6-7。6.9.2四阶Runge-Kutta法的实现类似于之前Euler和改进Euler法的实现,可以根据公式(6.4.7)实现四阶的Runge-Kutta法,可以如下定义函数defrk4(f,x0,y0,b,h):
x=[x0]
y=[y0]
while(x0+h)<=b:
x1=x0+h
k1=f(x0,y0)
k2=f(x0+h/2,y0+h/2*k1)
k3=f(x0+h/2,y0+h/2*k2)
k4=f(x1,y0+h*k3)
y0=y0+h*(k1+2*k2+2*k3+k4)/6
x0=x1
y.append(y0)
x.append(x0)
returny,x其参数与之前Euler法的定义相同。
可以使用matplotlib工具包来绘制函数图像,为了方便数据处理,同时引入numpy工具包importnumpyasnp
importmatplotlib.pyplotasplt
x1_array=np.array(x1)
Y_array=np.array(Y)
markers=["s","o","s","^"]
markerfillstyles=["none","full","full","full"]
plt.figure(figsize=(10,6))
forkinrange(4):
plt.plot(x1_array[:200:5],Y_array[k,:200:5],
marker=markers[k],fillstyle=markerfillstyles[k],
linestyle='',color='blue')
plt.axhline(5,0,10,linestyle='-')
plt.axhline(2,0,10,linestyle='--')
plt.show()结果见图6-6。6.9.3方程组的四阶Runge-Kutta法实现根据公式(6.5.2),可以得到方程组的数值计算方法,可以编写Python函数如下。求解由2个方程组成的方程组的函数rk4_2:defrk4_2(f,g,t0,x0,y0,b,h):
t=[t0]
x=[x0]
y=[y0]
while(t0+h)<=b:
t1=t0+h
k1=f(t0,x0,y0)
l1=g(t0,x0,y0)
k2=f(t0+h/2,x0+h/2*k1,y0+h/2*l1)
l2=g(t0+h/2,x0+h/2*k1,y0+h/2*l1)
k3=f(t0+h/2,x0+h/2*k2,y0+h/2*l2)
l3=g(t0+h/2,x0+h/2*k2,y0+h/2*l2)
k4=f(t1,x0+h*k3,y0+h*l3)
l4=g(t1,x0+h*k3,y0+h*l3)
x0=x0+h*(k1+2*k2+2*k3+k4)/6
y0=y0+h*(l1+2*l2+2*l3+l4)/6
t0=t1
x.append(x0)
y.append(y0)
t.append(t0)
returnx,y,t
同理可以计算无阻尼假设下的运动轨迹:g2=lambdat,x,y:-1.2*x-0.1*y
x2,y2,t2=rk4_2(f,g2,t0,x0,y0,b,h)
可以使用matplotlib绘制图像:importmatplotlib.pyplotasplt
plt.figure(figsize=(14,6))
plt.subplot(1,2,2)
plt.plot(t1,x1)
plt.subplot(1,2,1)
plt.plot(t2,x2)
plt.show()由此得到无阻尼和正弦阻尼情形下的震动图像(见图6-7)。
相应Python程序如下:
si,b0,r=10,8/3,28
f=lambdat,x,y,z:si*(y-x)
g=lambdat,x,y,z:r*x-y-x*z
p=lambdat,x,y,z:y*x-b0*z
t0,x0,y0,z0,b,h=0,0,2,0,34,0.01
x1,y1,z1,t1=rk4_3(f,g,p,t0,x0,y0,z0,b,h)修改参数:y0=-2
x2,y2,z2,t2=rk4_3(f,g,p,t0,x0,y0,z0,b,h)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年年终奖金发放办法
- 某餐饮厨房操作细则
- 手持电动工具安全培训
- 某纸业厂纸张质量检验办法
- 第3节 实物粒子的波粒二象性说课稿2025学年高中物理鲁科版选修3-5-鲁科版2004
- 医疗设备保养与故障处理手册
- 中学校园文化建设方案及实施步骤
- 制造业安全隐患排查与整改指南
- 初中生心理教育说课稿2025年心理健康活动
- 小学生健康教育主题班会说课稿
- 2026广东东莞市城市管理和综合执法局招聘编外聘用人员6人备考题库及答案详解(真题汇编)
- 2026甘肃甘南州临潭县卫生健康系统紧缺卫生专业技术人员招聘30人考试备考题库及答案解析
- 2026年7月浙江高中学业水平合格考生物试卷试题(含答案详解)
- 2026年真空镀膜机电源行业分析报告及未来发展趋势报告
- 煤矿尽职调查报告
- (正式版)T∕CPCPA 0017-2026 托育机构婴幼儿回应性照护服务规范
- (2026版)视网膜中央动脉阻塞神经介入专家共识课件
- 2025年四川省广元市八年级地理生物会考考试真题及答案
- 2026年证券从业资格证题库检测试卷及完整答案详解(考点梳理)
- 边坡工程验收记录表模板
- 2026湖北三峡旅游集团股份有限公司招聘笔试参考试题及答案解析
评论
0/150
提交评论