Python求解微分方程(数值解法)

对于一些微分方程来说,数值解法对于求解具有很好的帮助,因为难以求得其原方程。
比如方程:
但是我们知道了它的初始条件,这对于我们叠代求解很有帮助,也是必须的。

那么现在我们也用Python去解决这一些问题,一般的数值解法有欧拉法、隐式梯形法等,我们也来看看这些算法对叠代的精度有什么区别?


```python```python
import numpy as np
from scipy.integrate import odeint
from matplotlib import pyplot as plt
import os
#先从odeint函数直接求解微分方程#创建欧拉法的类
class Euler:#构造方法,当创建对象的时候,自动执行的函数def __init__(self,h,y0):#将对象与对象的属性绑在一起self.h = hself.y0 = y0self.y = y0self.n = 1/self.hself.x = 0self.list = [1]#欧拉法用list列表,其x用y叠加储存self.list2 = [1]self.y1 = y0#改进欧拉法用list2列表,其x用y1叠加储存self.list3 = [1]self.y2 = y0#隐式梯形法用list3列表,其x用y2叠加储存#欧拉法的算法,算法返回t,xdef countall(self):for i in range(int(self.n)):y_dere = -20*self.list[i]#欧拉法叠加量y_dere = -20 * xy_dere2 = -20*self.list2[i] + 0.5*400*self.h*self.list2[i]#改进欧拉法叠加量 y_dere2 = -20*x(k) + 0.5*400*delta_t*x(k)y_dere3 = (1-10*self.h)*self.list3[i]/(1+10*self.h)#隐式梯形法计算 y_dere3 = (1-10*delta_t)*x(k)/(1+10*delta_t)self.y += self.h*y_dereself.y1 += self.h*y_dere2self.y2 =y_dere3self.list.append(float("%.10f" %self.y))self.list2.append(float("%.10f"%self.y1))self.list3.append(float("%.10f"%self.y2))return np.linspace(0,1,int(self.n+1)), self.list,self.list2,self.list3step = input("请输入你需要求解的步长:")
step = float(step)
work1 = Euler(step,1)
ax1,ay1,ay2,ay3 = work1.countall()
#画图工具plt
plt.figure(1)
plt.subplot(1,3,1)
plt.plot(ax1,ay1,'s-.',MarkerFaceColor = 'g')
plt.xlabel('横坐标t',fontproperties = 'simHei',fontsize =20)
plt.ylabel('纵坐标x',fontproperties = 'simHei',fontsize =20)
plt.title('欧拉法求解微分线性方程步长为'+str(step),fontproperties = 'simHei',fontsize =20)plt.subplot(1,3,2)
plt.plot(ax1,ay2,'s-.',MarkerFaceColor = 'r')
plt.xlabel('横坐标t',fontproperties = 'simHei',fontsize =20)
plt.ylabel('纵坐标x',fontproperties = 'simHei',fontsize =20)
plt.title('改进欧拉法求解微分线性方程步长为'+str(step),fontproperties = 'simHei',fontsize =20)plt.subplot(1,3,3)
plt.plot(ax1,ay3,'s-.',MarkerFaceColor = 'b')
plt.xlabel('横坐标t',fontproperties = 'simHei',fontsize =20)
plt.ylabel('纵坐标x',fontproperties = 'simHei',fontsize =20)
plt.title('隐式梯形法求解微分线性方程步长为'+str(step),fontproperties = 'simHei',fontsize =20)plt.figure(2)
plt.plot(ax1,ay1,ax1,ay2,ax1,ay3,'s-.',MarkerSize = 3)
plt.xlabel('横坐标t',fontproperties = 'simHei',fontsize =20)
plt.ylabel('纵坐标x',fontproperties = 'simHei',fontsize =20)
plt.title('三合一图像步长为'+str(step),fontproperties = 'simHei',fontsize =20)
ax = plt.gca()
ax.legend(('$Eular$','$fixed Eular$','$trapezoid$'),loc = 'lower right',title = 'legend')
plt.show()
os.system("pause")

对于欧拉法,它的叠代方法是:

改进欧拉法的叠代方法:

隐式梯形法:

对于不同的步长,其求解的精度也会有很大的不同,我先放一几张结果图:

希望对你有所帮助!

python解决微分方程(数值解法)相关推荐

  1. 微分方程数值解法(PID仿真用一阶被控对象库PLC算法实现)

    微分方程除极特殊情况外,大部分不可能求出它的精确解,只能用各种近似方法得到满足一定精度的近似解,之前大家学过的教程知道微分方程有级数解法和Picard逐步逼近法,这些方法可以给出解的近似表达式,称为近 ...

  2. 微分方程数值解法(实际应用)

    微分方程数值解法(实际应用) 假设有这样一种情况,关于人行走的,从A到B地,行走速度越来越慢,速度是关于时间1/(t+A)的函数,现在求当s和时间t的关系: 从微分的角度看,v=s'=1/(t+A) ...

  3. 微分方程数值解法(欧拉方法)

    微分方程数值解法(欧拉方法) 假设y'=-x/y,这里采用分离变量法可以得到x^2+y^2=C,是一个圆: 现在假设C=4,并且有初始值为(-2,0),比较用数值方法获得的值与用公式计算的值之间的误差 ...

  4. 学习日记11--常微分方程数值解法

    8.00 开始学习 常微分方程数值解法--龙格库塔法(RK法) RK法的K的个数就是其精度的阶数,常用的有四阶RK法 y(i+1) = y(i)+h*(K1+2*K2+2*K3+K4)/6       ...

  5. 用python解决微分方程

    一.用python求解一阶常微分方程 标准形式: 准备工作: 1.首先需要导入scipy库,只需在终端输入pip install scipy然后回车即可 同理导入numpy,matplotlib 包 ...

  6. 微分方程的数值解法——常微分方程——欧拉法与改进欧拉法(2)

    改进欧拉法 与上一篇中实例相比,改进欧拉法多了一步修正过程,正是应为有了该一步修正过程使得数值解法具有更高一级精度. 先看下面两幅图,第一幅是没有改进的欧拉法,第二幅是改进的欧拉法 两者相比误差有很大 ...

  7. 微分方程的数值解法——常微分方程——差分法(1)

    微分方程的数值解法--常微分方程--差分法 差分法思想: 差分就是讲解析解中的差分方程中的微分项用差分来代替,当取得变量步长足够小时可以无限逼近. 两大步骤: 1.建立差分格式 1.对解得存在区域划分 ...

  8. python差分法_数值偏微分方程-差分法(Python)

    在前面的笔记里孤光一点萤:数值常微分方程-欧拉法与龙格-库塔法​zhuanlan.zhihu.com 整理了常微分方程的一些数值解法.类似的方法可以拓展到解偏微分方程的问题,这里整理有限差分法的相关笔 ...

  9. 偏微分方程数值解法python_基于python求解偏微分方程的有限差分法资料

    基于python求解偏微分方程的有限差分法资料 Computer Era No. 11 2016 0 引言 在数学中, 偏微分方程是包含多变量和它们的偏 导数在内的微分方程.偏微分方程通常被用来求解 ...

最新文章

  1. 当钢铁直男去应聘...... | 每日趣闻
  2. WPF - 本质:数据和行为
  3. Matlab-重构和重新排列数组
  4. diff算法_详解 React 16 的 Diff 策略
  5. vant组件搜索并选择_Vant Weapp - 有赞出品的免费开源微信小程序组件库
  6. java事务代码_关于java中实现JDBC事务控制代码示例
  7. bat递归查找指定文件_批处理脚本遍历指定文件夹下的文件
  8. 【Elasticsearch】Elasticsearch 相关度评分 TFIDF
  9. Python安装GDAL库的问题
  10. 8192 oracle,ORA-39095: 转储文件空间已耗尽: 无法分配 8192 字节
  11. 如何保证缓存与数据库双写时的数据一致性?
  12. 解决 Error:No suitable device found: no device found for connection System eth0
  13. Atitit 分期理论 attilax总结
  14. 构造者模式(Builder)
  15. android语音唤醒app,breeno助手语音唤醒
  16. ENet-论文笔记-理解
  17. photoshop基础操作集合01
  18. 坐标求四面体体积_「体积公式」四面体体积公式 - seo实验室
  19. JS求 一张纸厚度是0.07毫米,假设这张纸可以限次对折,问对折几次可以超过珠峰?8848米
  20. GT9xx触摸屏驱动总结

热门文章

  1. 华为鸿蒙电脑操作系统测试版,华为鸿蒙OS测试
  2. js 字符串截取数组常用方法总结(前端)
  3. 8个实用、强大、超厉害的软件推荐,快收藏吧!
  4. QImage和QPixmap相互转换
  5. Jquery实现AJAX异步通信
  6. 【测试用例】测试用例设计的关键点总结
  7. VTS-DEBUG VtsHalCameraProviderV2_4TargetTest CameraHidlTest.noHal1AfterP FAIL
  8. vue props命名为啥使用kebab-case (短横线隔开式) 来命名
  9. EOS智能合约开发系列(六): eosio.token
  10. Spring源码分析(二):底层架构核心概念解析