1. 实验结果

(1)解如下常微分方程:

(2)分别使用向前 Euler 法、向后 Euler 法、梯形方法、改进的 Euler 方法以及 四阶 Runge_Kutta 方法,结果如下图所示:

由结果可以发现,向前 Euler 法、向后 Euler 法和准确值的误差比较大, 梯形方法、改进的 Euler 方法以及四阶 Runge_Kutta 方法和准确值更为接近,并 且在该微分方程中的效果相差不大。
(3)因为上图中梯形方法、改进的 Euler 方法以及四阶 Runge_Kutta 方法的重叠, 单独的结果如下图:


2. 代码

test.py

from class6 import odeode = ode()  ode.shows()

class6.py

import math
import numpy as np
import matplotlib.pyplot as pltclass ode(object):"""包括: 1. 显示Euler; 2. 隐式Euler; 3. 梯形方法; 4. 改进Euler方法; 5. Runge-Kutta方法(四阶)"""def __init__(self):# 初始值self.y0 = 1# 区间[a,b]self.a = 0self.b = 1# 步长self.h = 0.1# 定义常微分方程def ODE(self, x, y):f = -y + x + 1return f# 计算准确值def acc(self, x):# 方程真解为 y = exp(-x)+xacc = math.exp(-x)+xreturn acc# 1. 显示Euler法def Euler_forward(self):yn = self.y0xn = self.aaccuracy = []Euler_forward = []x = []while xn <= 1:Euler_forward.append(yn)accuracy.append(self.acc(xn))  x.append(xn)f = self.ODE(xn, yn)# 显示Euler方法: y(n+1) = yn + hf(x(n+1),y(n+1)) , x(n+1) = x0 + (n+1)*h = x(n) + hyn = yn + self.h * fxn = xn + self.hreturn x, Euler_forward, accuracy# 2. 隐式Eulerdef Euler_back(self):yn = self.y0xn = self.aEuler_back = []x = []while xn < 1:xn1 = xn + self.h# 隐式Euler方法: y(n+1) = yn + hf(x(n+1),y(n+1)) , x(i) = x0 + i*h = xn + h# 由公式计算可得: y(n+1) = (h*x(n+1)+yn+h)/(1+h)yn = (self.h*xn1 + yn + self.h) / (1 + self.h)Euler_back.append(yn)x.append(xn1)xn = xn1return x, Euler_back# 3. 梯形方法def trapezoid(self):yn = self.y0xn = self.atrapezoid = []x = []while xn < 1:xn1 = xn + self.hf = self.ODE(xn, yn)ynn = yn + self.h * fynnn = (self.h*xn1 + yn + self.h) / (1 + self.h)#  梯形公式: 向前Euler法和向后Euler方法做算术平均yn = (ynn + ynnn) / 2trapezoid.append(yn)x.append(xn1)xn = xn1return x, trapezoid# 4. 改进Euler方法def impr_Euler(self):yn = self.y0xn = self.aimpr = []x = []while xn < 1:xn1 = xn + self.hf = self.ODE(xn, yn)ynn = yn + self.h * f  f1 = self.ODE(xn1, ynn)#  改进的Euler公式: 用显示公式作预估,用梯形公式作校正yn = yn + self.h*(f + f1) / 2impr.append(yn)x.append(xn1)xn = xn1return x, impr# 5. Runge-Kutta方法(四阶)def R_K(self):yn = self.y0xn = self.aR_K = []x = []while xn < 1:R_K.append(yn)x.append(xn)k1 = self.ODE(xn, yn)k2 = self.ODE(xn, yn) + self.h/2 - self.h*k1/2k3 = self.ODE(xn, yn) + self.h/2 - self.h*k2/2k4 = self.ODE(xn, yn) + self.h - self.h*k3#  四阶R_K公式: y(n+1) = yn + h*(k1+2*k2+2*k3+k4)/6yn = yn + self.h * (k1 + 2*k2 + 2*k3 + k4) / 6xn = xn + self.hreturn x, R_Kdef shows(self):# 绘制图像x1, Euler_forward, accuracy = self.Euler_forward()x2, Euler_back = self.Euler_back()x3, trapezoid = self.trapezoid()x4, impr_Euler = self.impr_Euler()x5, R_K = self.R_K()plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标题plt.plot(x1, Euler_forward, 'o', c='r', label='向前Euler法')plt.plot(x2, Euler_back, 'v', c='b', label='向后Euler法')plt.plot(x3, trapezoid, 's', c='g', label='梯形方法')plt.plot(x4, impr_Euler, 'p', c='y', label='改进的Euler方法')plt.plot(x5, R_K, '*', c='m', label='四阶R_K方法')plt.plot(x1, accuracy, c='k', label='精确解')plt.title('dy/dx=x-y-1  y(0)=1  [0,1]', fontsize=19)plt.xlim(-0.01, 1.01)plt.ylim(0.98, 1.4)plt.xlabel('x轴', fontsize=19)plt.ylabel('y轴', fontsize=19)plt.legend()  plt.grid()    plt.show()

Python06 向前Euler法、向后Euler法、梯形方法、改进的Euler方法以及四阶Runge_Kutta方法(附代码)相关推荐

  1. 单链表基本操作的实现——前插法与后插法创建单链表

    一.前插法创建单链表 算法步骤: (1)创建一个只有头结点的空链表. (2)根据创建链表包括的元素n,循环n次以下操作: 生成新结点:-->输入元素值赋给新结点数据域:-->将新结点插入到 ...

  2. 数据结构—链表的前插法与后插法

    在进行单链表的基本运算之前必须先建立单链表,建立单链表的常用方法有两种:头插法建表和尾插法建表 头插法建表,从一个空表开始,读取字符数组a中的字符,生成新节点,将读取的数据存放到新节点的数据域中,然后 ...

  3. 求全排序的经典算法“后补法”

    //用于求全排序的经典算法"后补法",代码如下: #include <stdio.h> #include <conio.h> #include <st ...

  4. FTP口令受到穷举法暴力***后的蛛丝马迹

    FTP口令受到穷举法暴力***后的蛛丝马迹    在电脑网络时代,大家不可避免地会接触到有关***的世界,特别是对于网络管理员.******网络和系统的方法,是五花八门的.同时也千变万化,并且随着网络 ...

  5. 最大似然法和最小二乘法,最大后验法之间的关系

    内容导读: 1.最大似然法 2.最小二乘法 3.最大后验法 4.最大似然法和最小二乘法的统一 5.最大似然法和最大后验法的关系 一.最大似然法 最大似然法认为,我们多次观察到的结果就是最可能发生的结果 ...

  6. 单链表的前插法和后插法

    #include<stdio.h> #include<stdlib.h> typedef struct Link{int elem;struct Link *next; }li ...

  7. 链表笔记 (前插法 后插法 头插法 尾插法)

    链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个 ...

  8. 双向链表的前插法和后插法创建

    根据结点插入位置的不同,链表的创建方法可分为前插法和后插法 前插法 前插法是通过将新节点逐个插入链表的头部(头节点之后)来创建链表,每次申请一个新节点,读入相应的数据元素值,然后将新节点插入到头节点之 ...

  9. 单链表的前插法和后插法创建

    根据结点插入位置的不同,链表的创建方法可分为前插法和后插法 前插法 前插法是通过将新节点逐个插入链表的头部(头节点之后)来创建链表,每次申请一个新节点,读入相应的数据元素值,然后将新节点插入到头节点之 ...

最新文章

  1. 爬虫笔记|r.text-r.request.headers|修改,头
  2. 40个漂亮的单页网站设计案例(上篇)
  3. glassfish上部署firstcup-war
  4. linux 关联数组,Linux shell数组与关联数组的用法实例
  5. html5教学案例撰写,教学案例撰写基本格式
  6. webpack打包时提示:The following entrypoint(s) combined asset size exceeds the recommended limit
  7. 税务异常的公司如何办理注销?
  8. php 数组 批量替换字符串,php数组替换字符串
  9. Java之美[从菜鸟到高手演变]之字符串
  10. 激光脉冲产生发光的等离子灯丝 或使远程监控成为可能
  11. C++ 关于日期时间(四)asctime/ctime/gmtime/time_t/tm
  12. VUE-CLI/VUE-ROUTER
  13. Matlab高光谱遥感、数据处理与混合像元分解实践技术应用
  14. 利用matlab实现h 控制,利用Matlab实现H∞控制
  15. Machine Learning Stanford (week 2)
  16. 网页抓取实例之wildberries电商平台数据抓取
  17. Manjaro KDE 18.1.2踩坑指南(含双显卡黑屏解决方案)
  18. 【内网—权限提升】——linux本地提权_脏牛漏洞提权
  19. 在vs2010使用EF出现CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义...
  20. 鹅厂内部干货|微信小游戏开发技术怎么应用?

热门文章

  1. vi编辑器的学习使用(二十)
  2. 计算机辅助语文识字教学的优势,小学语文计算机辅助教学研究
  3. 移位运算符 实现 二进制数的 高低位翻转(完整逻辑代码)
  4. python基于值的内存管理模式_为什么说python采用的是基于值的内存管理模式
  5. 3. 机器学习中为什么需要梯度下降_【干货】机器学习 | 为什么机器能“学习”?——感知器和梯度下降...
  6. 国庆前的最后3场直播活动!!
  7. 一篇搞懂MySQL 8.0 Clone技术在线搭建主从复制全过程
  8. 万字通俗讲解何为复杂度
  9. 基于CarbonData的电信时空大数据探索
  10. 技术实践:教你用Python搭建gRPC服务