【数学建模知识】常微分方程数值解:欧拉公式
来源:互联网 发布:新手光束灯编程教学 编辑:程序博客网 时间:2024/05/17 02:51
算法原理
对于常微分方程初值问题
在求解区间[a,b]上作等距分割的剖分,步长,记。用数值微商的方法,即用差商近似微商数值求解常微分方程。
用向前差商近似
做出y(x)的在x=x0处的一阶向前差商式:
又,于是得到
而y(x1)的近似值y1可按
或
求得。类似地,由
以及
得到计算近似值的向前欧拉公式:
由差商(差分)得到的上述方程称为差分方程。
由yn直接算出yn+1值的计算格式称为显式格式,向前欧拉公式是显式格式。
算法流程
算法代码
- //欧拉公式代码
- #include<iostream>
- #include<string>
- #include<vector>
- using namespace std;
- double f(double x,double y){
- return -50*y;
- }
- vector<double> Euler(double x0,double y0,double h,int N){
- vector<double> Y(N,0);
- double x=x0;
- Y[0]=y0;
- for(int n=1;n<N;n++){
- Y[n] = Y[n-1] + h*f(x,Y[n-1]);
- x += h;
- }
- return Y;
- }
- int main(){
- char a='n';
- do{
- cout<<"请输入步长h和要计算的函数值的个数N: "<<endl;
- double h;
- int N;
- cin>>h>>N;
- cout<<"请输入要初始函数点(x0,y0):"<<endl;
- double x0;
- double y0;
- cin>>x0>>y0;
- vector<double> Y=Euler(x0,y0,h,N+1);
- cout<<"欧拉格式计算结果为: "<<endl;
- for(int i=0;i<N+1;i++){
- cout<<x0+i*h<<" "<<Y[i]<<endl;
- }
- cout<<"是否要继续?(y/n)"<<endl;
- cin>>a;
- }while(a=='y');
- return 0;
- }
- //改进的欧拉公式
- #include<iostream>
- #include<string>
- #include<vector>
- using namespace std;
- double f(double x,double y){
- return y-(2*x)/y;
- }
- vector<double> ImprovedEuler(double x0,double y0,double h,int N){
- vector<double> Y(N,0);
- Y[0]=y0;
- double x=x0;
- double p=0;
- double c=0;
- for(int n=1;n<N;n++){
- p=Y[n-1]+h*f(x,Y[n-1]);
- x +=h;
- c=Y[n-1]+h*f(x,p);
- Y[n]=(p+c)/2;
- }
- return Y;
- }
- int main(){
- char a='n';
- do{
- cout<<"请输入步长h和要计算的函数值的个数N: "<<endl;
- double h;
- int N;
- cin>>h>>N;
- cout<<"请输入要初始函数点(x0,y0):"<<endl;
- double x0;
- double y0;
- cin>>x0>>y0;
- vector<double> Y=ImprovedEuler(x0,y0,h,N+1);
- cout<<"欧拉格式计算结果为: "<<endl;
- for(int i=0;i<N+1;i++){
- cout<<x0+i*h<<" "<<Y[i]<<endl;
- }
- cout<<"是否要继续?(y/n)"<<endl;
- cin>>a;
- }while(a=='y');
- return 0;
- }
实验过程原始记录
(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、改进的欧拉公式是欧拉方法和梯形方法的综合,也是一种显式算法,计算简单,利于编写程序,与欧拉公式相比大大提高了精度。
(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)
0 0
- 【数学建模知识】常微分方程数值解:欧拉公式
- 常微分方程数值解:欧拉公式
- 【数值分析】常微分方程数值解:欧拉公式
- 【数值分析】常微分方程数值解:欧拉公式
- MATLAB数学建模(8)-常微分方程求解
- 常微分方程数值解上机
- matlab求解常微分方程数值解
- 常微分方程数值解法
- 微分方程数值解法(欧拉方法)
- 常微分方程的数值解法
- 实验四 常微分方程的数值解(android)
- Matlab解常微分方程
- 数值计算一阶常微分方程求解实现
- 数学基础IV——根据坐标系旋转建立欧拉微分方程解算姿态
- 微分方程数值解
- 数值分析 解微分方程
- 数值分析 第七章 常微分方程的数值解法
- 数学归纳法_欧拉公式
- Nginx安装部署
- MapReduce的输入处理类
- SIFT程序资源
- windows程序设计之添加菜单
- Javaweb 将excel文件内信息传入数据库中 并查询
- 【数学建模知识】常微分方程数值解:欧拉公式
- 从零开始学安卓
- MTK手机充电原理分析及问题总结
- 工作一年,你离理想更近了吗?
- 专利权利要求书写法
- ZOJ3870 Team Formation(2015浙江省赛) 位运算异或
- 第四章第6题
- android activity和service通过contentprovider通信
- ListView滑动删除实现之四——Scroller类与listview缓慢滑动