*题目描述:*求常微分方程y’=y-2x/y && y(0)=1的数值解。解析解为:y=sqrt(1+2x)
编译环境vc++6.0
代码如下:

/*
1、y'=y-2x/y && y(0)=1;
2、解析解为y=sqrt(1+2x)
*/#include <stdio.h>
#include <math.h>
#define N 5                    //离散点个数,分别取5,8,10,对应步长0.2,0.125,0.1
#define low 0                   //定义域x区间下限
#define high  1.0               //定义域x区间上限
#define h  (high-low)/N        //步长/*************************4、解析解实现**********************/
double AnalyticalSolution(double x) {return sqrt(1 + 2 * x);
}/*************************1、显示欧拉实现**********************/
double EulerMethod(double x)
{//若x==0if (fabs(x - low) < 1e-6)  //浮点数之间不能直接判断是否相等,则可以用 fabs(f1-f2)<=给定差值精度 来判断f1和f2是否相等return 1;             //f(low)== f(0)==1else return EulerMethod(x - h) + h * (EulerMethod(x - h) - (2 * (x - h) / EulerMethod(x - h)));
}/*************************2、隐式欧拉实现**********************/
//隐式欧拉实现由下面两个函数组成
double ImplicitEulerMethod_1(double x)          /*隐示欧拉第一次迭代,
用显示欧拉计算f(x)的初值,带入隐式欧拉方程 f(x)=f(x-1)+h*(f(x)-2*x/f(x))*/
{if (fabs(x - low) < 1e-6)   //浮点数之间不能直接判断是否相等,则可以用 fabs(f1-f2)<=给定差值精度 来判断f1和f2是否相等return 1;elsereturn ImplicitEulerMethod_1(x - h) + h * (EulerMethod(x) - 2 * x / EulerMethod(x));   //迭代
}double ImplicitEulerMethod_2(double x) /*隐示欧拉第2--n次迭代,
用第一次迭代的结果f(x)作为初值带入隐式欧拉方程进行第二次迭代,
第二次迭代的结果f(x)作为初值带入隐式欧拉方程进行第三次迭代.....
直到本次迭代的结果y1与上次的迭代结果y0,满足|y1-y0|<1e-6,则认为收敛
迭代结束
*/
{if (fabs(x - low) < 1e-6)  //浮点数之间不能直接判断是否相等,则可以用 fabs(f1-f2)<=给定差值精度 来判断f1和f2是否相等return 1;else {double y0 = ImplicitEulerMethod_1(x), y1 = ImplicitEulerMethod_1(x);      //将第一次迭代的结果作为初值带入第二次迭代do {y0 = y1;y1 = ImplicitEulerMethod_2(x - h) + h * (y0 - 2 * x / y0);} while (fabs(y1 - y0) < 1e-6);       //本次迭代结果减去上一次迭代结果fabs(y1-y0)<=1e-6  认为是收敛return y1;}
}
/*************************3、两步欧拉实现**********************/
double DoubleStepEuler(double x)            //两步欧拉
{if (fabs(x - low) < 1e-6)   //若x==0   第一个初值给定return 1;else if (fabs(x - low - h) < 1e-6)   //若x==low+h   第二个初值用显示欧拉求出return EulerMethod(x);else return DoubleStepEuler(x - 2 * h) + 2 * h * (DoubleStepEuler(x - h) - 2 * (x - h) / DoubleStepEuler(x - h));
}/*************************四阶龙格-库塔法**********************/
double C_R_K_M(double x)
{if (fabs(x - low) < 1e-6)   //若x==0   第一个初值给定return 1;else {double k1 = C_R_K_M(x - h) - 2 * (x - h) / C_R_K_M(x - h);double k2 = C_R_K_M(x - h) + h / 2.0 * k1 - (2 * (x - h) + h) / (C_R_K_M(x - h) + h / 2.0 * k1);double k3 = C_R_K_M(x - h) + h / 2.0 * k2 - (2 * (x - h) + h) / (C_R_K_M(x - h) + h / 2.0 * k2);double k4 = C_R_K_M(x - h) + h * k3  - (2 * (x - h) + h) / (C_R_K_M(x - h) + h  * k3);return C_R_K_M(x - h) + h / 6.0 * (k1 + 2 * k2 + 2 * k3 + k4);}
}/*************************4、格式化输出函数**********************/
void prit(double (*p)(double x))
{int count=0;double i;for (i = low; high - i >0 ; i += h) {printf("y(%0.3lf)=%0.5lf\t", i, p(i));count++;if (count % 4 == 0)printf("\n");}printf("y(%0.3lf)=%0.5lf\t", i, p(i));     //high==i时printf("\n\n\n");
}int main()
{printf("解析解格式化输出:\n");prit(AnalyticalSolution);printf("显示欧拉法格式化输出:\n");prit(EulerMethod);printf("隐示欧拉法格式化输出:\n");prit(ImplicitEulerMethod_2);printf("两步欧拉法格式化输出:\n");prit(DoubleStepEuler);printf("四阶龙格-库塔法格式化输出:\n");prit(C_R_K_M);return 0;
}

输出结果:

常微分方程的数值解-欧拉、四阶龙格-库塔法等C语言相关推荐

  1. 经典龙格-库塔法(四阶龙格-库塔法)求解求一阶常微分方程相应的特解的Python程序

    基本原理 例题 代码 #四阶龙格-库塔法 #求一阶常微分方程,相应的特解 #x变量的区间 a = 0 b = 1 #已知条件 X = [0] Y = [1] h = 0.2 #设置步长 n = (b- ...

  2. 欧拉梯形格式C语言,常微分方程数值解法 欧拉格式和梯形格式比较.doc

    常微分方程数值解法 欧拉格式和梯形格式比较 甥啼伐慑穗策步怀冻窿连鼓枉磷浮血腔氓玩伶樱拨惊款蹈耀突菩屠赘颧泥整抽蟹寥毋城舶败袍龙垫炯听记捅碉钠辞摆棒猩饯钒轮剂厅戎懦汝差栅寿坪赞壁洒日朵谰丛沛称怜给吟戏 ...

  3. 欧拉梯形格式C语言,常微分方程数值解法欧拉格式和梯形格式的比较.doc

    常微分方程数值解法欧拉格式和梯形格式的比较 PAGE PAGE 4 年级00000班号0000学号0000专业000姓名00000实验名称000000实验类型设计型综合型创新型实验目的或要求常微分的数 ...

  4. 有确定项微分方程的matlab程序,微分方程的数值解法matlab四阶龙格—库塔法课件...

    <微分方程的数值解法matlab四阶龙格-库塔法课件>由会员分享,可在线阅读,更多相关<微分方程的数值解法matlab四阶龙格-库塔法课件(36页珍藏版)>请在人人文库网上搜索 ...

  5. 四阶龙格-库塔法求解常微分方程的初值问题

    算法原理和程序框图 龙格-库塔法是一种求其准确解y(x)在一系列点xi处y(xi)的近似值yi的方法,yi称为数值解.经典的四阶龙格库塔法方程如下: y'=f(t,y),y(t0)=y0输出按如下求解 ...

  6. 隐式欧拉解常微分方程c语言,利用欧拉方法求常微分方程近似数值解.doc

    利用欧拉方法求常微分方程近似数值解,欧拉微分方程,欧拉运动微分方程,欧拉平衡微分方程,欧拉型微分方程,微分方程的欧拉算法,微分方程的欧拉解法,欧拉型常微分方程,偏微分方程数值解,微分方程数值解法 利用 ...

  7. 一阶欧拉近似matlab,MATLAB改进欧拉法与四阶龙格-库塔求解一阶常微分方程.doc

    MATLAB改进欧拉法与四阶龙格-库塔求解一阶常微分方程 姓名:樊元君 学号:2012200902 日期:2012.11.06 一.实验目的 掌握改进欧拉法与四阶龙格-库塔求解一阶常微分方程的初值问题 ...

  8. 四阶龙格库塔法的基本思想_数值常微分方程-欧拉法与龙格-库塔法

    大三时候在跳蚤市场闲逛,从一位数学院的学长那里买了一些闲书,最近翻出来刚好有李荣华.刘播老师的<微分方程数值解法>和王仁宏老师的<数值逼近>,结合周善贵老师的<计算物理& ...

  9. python解常微分方程龙格库_数值常微分方程-欧拉法与龙格-库塔法

    大三时候在跳蚤市场闲逛,从一位数学院的学长那里买了一些闲书,最近翻出来刚好有李荣华.刘播老师的<微分方程数值解法>和王仁宏老师的<数值逼近>,结合周善贵老师的<计算物理& ...

最新文章

  1. 重磅!Nature子刊:利用GAN来​“深度伪造大脑数据”可以改善残疾人的脑机接口...
  2. Re:从 0 开始的微服务架构--(四)如何保障微服务架构下的数据一致性--转
  3. 小谈RTMP中AMF3类型的Command message
  4. 深入浅出vc dll动态链接库
  5. [原创] 毕设---在myeclipes中安装Hadoop开发插件
  6. 正在锁定计算机 win7转圈圈打不开,Win7网络连接图标一直转圈的原因和解决方法...
  7. JS特效代码大全(十一)超炫的js图片展示效果(三)
  8. HBase-存储-HFile格式
  9. Web前端:前12个易于Web开发的前端开发工具
  10. 【分享360域名批量查询工具】
  11. c语言中进入临界区函数,VC/MFC 临界区使用方法事例
  12. rtsp开源视频播放器VideoLAN
  13. 养龟村长讲解三线闭壳龟的重要性,对于养殖的你深刻了解多少?
  14. ubuntu18.04 LTS 安装英伟达驱动
  15. 远程医疗是指通过计算机技术,E诊断:什么是远程医疗?
  16. iframe嵌入通讯
  17. VS2019中文输出乱码解决方法(C语言)
  18. Freesurfer教程(ubuntu)
  19. PTA 7-33 有理数加法(详解)
  20. js实现淘宝右侧导航栏功能

热门文章

  1. 马尔科夫毯(Markov Blanket)
  2. 树莓派Linux-raspberrypi域名解析失败:Temporary failure in name resolution
  3. 智慧畜牧养殖系统的感知设备
  4. 《Real-Time Rendering 4th Edition》全文翻译 - 第15章 非真实感渲染(下)15.3 ~ 15.5
  5. 最优传输论文(一)Sliced Wasserstein Discrepancy for Unsupervised Domain Adaptation
  6. 原来,数据分析还可以这样干......
  7. 'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。
  8. 64位windows无法正常安装dnw的解决方案
  9. html自动播放avi视频,使用HTML5 video标签的一系列问题
  10. JavaScript提取非行间样式