算法原理

对于常微分方程初值问题

在求解区间[a,b]上作等距分割的剖分,步长,记。用数值微商的方法,即用差商近似微商数值求解常微分方程。

用向前差商近似

做出y(x)的在x=x0处的一阶向前差商式:

,于是得到

而y(x1)的近似值y1可按

 或 

求得。类似地,由

 以及 

得到计算近似值的向前欧拉公式:

由差商(差分)得到的上述方程称为差分方程。

由yn直接算出yn+1值的计算格式称为显式格式,向前欧拉公式是显式格式。

算法流程

算法代码

[cpp] view plaincopy
  1.   //欧拉公式代码
  2. #include<iostream>
  3. #include<string>
  4. #include<vector>
  5. using namespace std;
  6. double f(double x,double y){
  7. return -50*y;
  8. }
  9. vector<double> Euler(double x0,double y0,double h,int N){
  10. vector<double> Y(N,0);
  11. double x=x0;
  12. Y[0]=y0;
  13. for(int n=1;n<N;n++){
  14. Y[n] = Y[n-1] + h*f(x,Y[n-1]);
  15. x += h;
  16. }
  17. return Y;
  18. }
  19. int main(){
  20. char a='n';
  21. do{
  22. cout<<"请输入步长h和要计算的函数值的个数N: "<<endl;
  23. double h;
  24. int N;
  25. cin>>h>>N;
  26. cout<<"请输入要初始函数点(x0,y0):"<<endl;
  27. double x0;
  28. double y0;
  29. cin>>x0>>y0;
  30. vector<double> Y=Euler(x0,y0,h,N+1);
  31. cout<<"欧拉格式计算结果为:  "<<endl;
  32. for(int i=0;i<N+1;i++){
  33. cout<<x0+i*h<<"     "<<Y[i]<<endl;
  34. }
  35. cout<<"是否要继续?(y/n)"<<endl;
  36. cin>>a;
  37. }while(a=='y');
  38. return 0;
  39. }
  40. //改进的欧拉公式
  41. #include<iostream>
  42. #include<string>
  43. #include<vector>
  44. using namespace std;
  45. double f(double x,double y){
  46. return y-(2*x)/y;
  47. }
  48. vector<double> ImprovedEuler(double x0,double y0,double h,int N){
  49. vector<double> Y(N,0);
  50. Y[0]=y0;
  51. double x=x0;
  52. double p=0;
  53. double c=0;
  54. for(int n=1;n<N;n++){
  55. p=Y[n-1]+h*f(x,Y[n-1]);
  56. x +=h;
  57. c=Y[n-1]+h*f(x,p);
  58. Y[n]=(p+c)/2;
  59. }
  60. return Y;
  61. }
  62. int main(){
  63. char a='n';
  64. do{
  65. cout<<"请输入步长h和要计算的函数值的个数N: "<<endl;
  66. double h;
  67. int N;
  68. cin>>h>>N;
  69. cout<<"请输入要初始函数点(x0,y0):"<<endl;
  70. double x0;
  71. double y0;
  72. cin>>x0>>y0;
  73. vector<double> Y=ImprovedEuler(x0,y0,h,N+1);
  74. cout<<"欧拉格式计算结果为:  "<<endl;
  75. for(int i=0;i<N+1;i++){
  76. cout<<x0+i*h<<"     "<<Y[i]<<endl;
  77. }
  78. cout<<"是否要继续?(y/n)"<<endl;
  79. cin>>a;
  80. }while(a=='y');
  81. return 0;
  82. }

实验过程原始记录

(1)分别取h=0.05,N=10;h=0.025,N=20;h=0.01,N=50,用显式欧拉方法求解微分方程初值 问题:y’=-50y,y(0)=10
h=0.05,N=10
h=0.025,N=20
h=0.01,N=50

(2)用改进的欧拉格式计算下列一阶常微分方程初值问题

其解析解为: 

实验结果及分析

1、欧拉公式用以求解常微分方程中的定解问题
2、可以看出,欧拉公式的精度很低,对于不同的步长求得相同点处的值差距可能很大;而且计算中的误差会累计。但显式欧拉公式取向前差商作为平均斜率,计算简单,且利于编写计算机程序,所以对于一些简单函数仍有很大的价值。
3、改进的欧拉公式是欧拉方法和梯形方法的综合,也是一种显式算法,计算简单,利于编写程序,与欧拉公式相比大大提高了精度。

常微分方程数值解:欧拉公式相关推荐

  1. 常微分方程数值解——差商、欧拉公式详细推导及代码实现

    引言 在自然科学的许多领域特别是科学与工程计算中,经常会遇到常微分方程的求解问题.然而只有非常少数且十分简单的微分方程可以用初值等方法求得它们的解,多数只能近似方法求解. 一.预备知识 (差商的推导) ...

  2. 欧拉折线法解常微分方程C语言,05常微分方程数值解.ppt

    05常微分方程数值解.ppt 第五章,常微分方程数值解法,(Numerical s for Ordinary Differential Equations ),常微分方程分为 (1)初值问题 (2)边 ...

  3. 《数值分析》李庆扬 09 常微分方程数值解

    # 写于2021.01.08 # 教材<数值分析> 第五版 李庆扬 王能超 易大义 # 只总结了考试需要的内容:①改进的欧拉公式 ②其他迭代格式 # 总结不易 望赞鼓励 0 内容串联 1. ...

  4. 常微分方程数值解的c语言程序,常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现.doc...

    常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现 导读:就爱阅读网友为您分享以下"一阶常微分方程数值解的C语言编程实现"资讯,希望对您有所帮助,感谢您对92的支持! 一阶 ...

  5. 数学建模:微分方程模型—常微分方程数值解算法及 Python 实现

    目录 一.显式欧拉 (Euler) 法 二.显式欧拉法的改进 隐式欧拉法 (后退欧拉法) 梯形法 两步欧拉法 (中点法) 预报 - 校正法 (改进欧拉法) 三.龙格 - 库塔 (Runge-Kutta ...

  6. 常微分方程数值解matlab欧拉,MATLAB实验报告_常微分方程数值解

    manlab软件应用试验题目 专业 序号 姓名 日期 实验3 常微分方程数值解 [实验目的] 1.掌握用MATLAB求微分方程初值问题数值解的方法: 2.通过实例学习微分方程模型解决简化的实际问题: ...

  7. 【数值分析】常微分方程数值解:欧拉公式

    本科课程参见:<软件学院那些课> 算法原理 对于常微分方程初值问题 在求解区间[a,b]上作等距分割的剖分,步长,记.用数值微商的方法,即用差商近似微商数值求解常微分方程. 用向前差商近似 ...

  8. 常微分方程数值解matlab欧拉,MATLAB题,用到欧拉公式求微分方程的数值解

    %欧拉法解一阶常微分方程 %例子dy/h=-y+x+1 %f=inline('-y+x+1','x','y');   %微分方程的右边项 f = inline('x-2*y','x','y'); y0 ...

  9. 常微分方程数值解matlab欧拉,matlab 常微分方程数值解法 源程序代码

    matlab 常微分方程数值解法 源程序代码 所属分类:其他 开发工具:matlab 文件大小:16KB 下载次数:41 上传日期:2019-02-13 11:03:29 上 传 者:XWLYF 说明 ...

最新文章

  1. PHP 自定义session储存 数据库 方式类   高洛峰 细说PHP
  2. python class类_Python——入门级(class类)
  3. CentOS安装libpcap
  4. ArcGIS在线资源集
  5. native react 图片多选_开源一个图片组件 react-native-border-radius-image
  6. linux uboot 源码分析,UBoot源码分析1.pdf
  7. linux提示链接层次太多,嵌入式linuxmusic播放器
  8. 【OpenCV 例程200篇】25. 图像的平移
  9. 学习java前_学习java之前
  10. indesign拖进去颜色变灰_在 InDesign 中管理颜色
  11. mysql 状态查询_MySQL状态查询
  12. 二分查找向上还是向下取整_113、股市中的跳空缺口判断技巧是向上还是向下
  13. nest.js 使用express需要提供多个静态目录的操作
  14. red5 + java+flex free download_Flex 4 +Red5 流媒体使用研究2——Flex4的VideoPlayer控件应用...
  15. pgadmin 转成oracle,pgAdmin快速备份还原数据库
  16. iphone 竖屏的视频转换为横屏
  17. 使用R,ggplot2绘制NMDS图
  18. 美妆护肤做短视频,利用选题策划来涨粉?
  19. linux中查看磁盘配额的数量,[Linux实用命令]-11-磁盘配额实例详解
  20. 同一用户不同终端登录限制(附:同一浏览器不同用户登录解决方案)

热门文章

  1. mongodb集群 java_MongoDB集群JavaAPI插入数据
  2. SpringBoot - 实践阿里巴巴【Manager 层_通用业务处理层】
  3. Spring5源码 - 13 Spring事件监听机制_@EventListener源码解析
  4. 设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
  5. 学习笔记Hadoop(十二)—— Hadoop基础操作(4)—— YARN资源管理与调度策略
  6. mongodb 事务_MongoDB 事务 — 基础入门篇
  7. 安卓屏幕适配方案(根据今日头条方案,升级版)
  8. easyui复杂表单_EasyUI中实现form表单提交的示例分享
  9. ie浏览器在线使用_全球浏览器5月份市场份额公布!Chrome和Edge浏览器迎来新一轮“撕X”大战...
  10. 解决Mybatis启动报错: Invalid bound statement (not found)