常微分方程数值解法(1)
欧拉方法:
#include <stdio.h>
#include <math.h>
#define N 10//离散点个数取10,对应步长0.1
#define low 0//定义域x区间下限
#define high 1.0//定义域x区间上限
#define h (high-low)/N//步长
double AnalyticalSolution(double x)//准确解
{
return pow((1+pow(x,2)),1.0/3);
}
double EulerMethod(double x)//欧拉公式
{
//若x==0
if(fabs(x-low)<1e-6)//浮点数之间不能直接判断是否相等,则可以用 fabs(f1-f2)<=给定差值精度 来判断f1和f2是否相等
return 1;//y(low)==y(0)==1
else
{
return EulerMethod(x-h)+h*(2.0/3*(x- h)*pow(EulerMethod(x-h),-2));
}
}
void prit(double (*p)(double x))//格式化输出
{
int count=0;
double i;
for(i=low+h;high-i>h;i+=h)
{
printf("y(%0.3lf)=%0.6lf ", i, p(i));
count++;
if(count%5==0)
printf("\n");
}
printf("y(%0.3lf)=%0.6lf\t",i,p(i));//high==i时
printf("\n\n");
}
int main()
{
printf("准确解格式化输出:\n");
prit(AnalyticalSolution);
printf("欧拉方法格式化输出:\n");
prit(EulerMethod);
return 0;
}
改进欧拉方法:
#include <stdio.h>
#include <math.h>
#define N 10//离散点个数取10,对应步长0.1
#define low 0.0//定义域x区间下限
#define high 1.0//定义域x区间上限
#define h (high-low)/N//步长
double AnalyticalSolution(double x)//准确解
{
return pow((1+pow(x,2)),1.0/3);
}
double ImplicitEulerMethod(double x)//改进欧拉方法
{
if(fabs(x-low)<1e-6)//浮点数之间不能直接判断是否相等,则可以用 fabs(f1-f2)<=给定差值精度 来判断f1和f2是否相等
return 1;
else
return ImplicitEulerMethod(x-h)+h/2.0*((2.0/3*(x-h)*pow(ImplicitEulerMe thod(x-h),-2))+(2.0/3*x*pow((ImplicitEulerMethod(x-h)+h*(2.0/3*(x-h)*pow(Implic itEulerMethod(x-h),-2))),-2)));
}
void prit(double (*p)(double x))//格式化输出
{
int count=0;
double i;
for(i=low+h;high-i>h;i+=h)
{
printf("y(%0.3lf)=%0.6lf ", i, p(i));
count++;
if(count%5==0)
printf("\n");
}
printf("y(%0.3lf)=%0.6lf\t",i,p(i));//high==i时
printf("\n\n");
}
int main()
{
printf("准确解格式化输出:\n");
prit(AnalyticalSolution);
printf("改进欧拉方法格式化输出:\n");
prit(ImplicitEulerMethod);
return 0;
}
经典R-K法:
#include <stdio.h>
#include <math.h>
#define N 10//离散点个数取10,对应步长0.1
#define low 0//定义域x区间下限
#define high 1.0//定义域x区间上限
#define h (high-low)/N//步长
double AnalyticalSolution(double x)//准确解
{
return pow((1+pow(x,2)),1.0/3);
}
double R_K(double x)//经典R-K法
{
if(fabs(x-low)<1e-6)//若x==0,第一个初值给定
return 1;
else {
double k1=2.0/3*(x-h)*pow(R_K(x-h),-2);
double k2=2.0/3*((x-h)+h/2.0)*pow((R_K(x-h)+h/2.0*k1),-2);
double k3=2.0/3*((x-h)+h/2.0)*pow((R_K(x-h)+h/2.0*k2),-2);
double k4=2.0/3*((x-h)+h)*pow((R_K(x-h)+h*k3),-2);
return R_K(x-h)+h/6.0*(k1+2*k2+2*k3+k4);//返回y_i+1
}
}
void prit(double (*p)(double x))//格式化输出
{
int count=0;
double i;
for(i=low+h;high-i>h;i+=h)
{
printf("y(%0.3lf)=%0.6lf ", i, p(i));
count++;
if(count%5==0)
printf("\n");
}
printf("y(%0.3lf)=%0.6lf\t",i,p(i));//high==i时
printf("\n\n");
}
int main()
{
printf("准确解格式化输出:\n");
prit(AnalyticalSolution);
printf("经典R-K法格式化输出:\n");
prit(R_K);
return 0;
}
常微分方程数值解法(1)相关推荐
- 欧拉折线法解常微分方程C语言,第五章:常微分方程数值解法第一节欧拉法
<第五章:常微分方程数值解法第一节欧拉法>由会员分享,可在线阅读,更多相关<第五章:常微分方程数值解法第一节欧拉法(32页珍藏版)>请在人人文库网上搜索. 1.第五章 常微分方 ...
- 常微分方程数值解matlab欧拉,matlab 常微分方程数值解法 源程序代码
matlab 常微分方程数值解法 源程序代码 所属分类:其他 开发工具:matlab 文件大小:16KB 下载次数:41 上传日期:2019-02-13 11:03:29 上 传 者:XWLYF 说明 ...
- 科学计算与数学建模-常微分方程数值解法 思维导图
第七章 常微分方程数值解法
- 常微分方程数值解法——python实现
研究生课程<应用数值分析>结课了,使用python简单记录了下常微分方程数值解法. 2022.11.26 Update: 文末补充C语言实现(C11标准) 向前欧拉法 {yi+1=yi+h ...
- 欧拉梯形格式C语言,常微分方程数值解法 欧拉格式和梯形格式比较.doc
常微分方程数值解法 欧拉格式和梯形格式比较 甥啼伐慑穗策步怀冻窿连鼓枉磷浮血腔氓玩伶樱拨惊款蹈耀突菩屠赘颧泥整抽蟹寥毋城舶败袍龙垫炯听记捅碉钠辞摆棒猩饯钒轮剂厅戎懦汝差栅寿坪赞壁洒日朵谰丛沛称怜给吟戏 ...
- 欧拉梯形格式C语言,常微分方程数值解法欧拉格式和梯形格式的比较.doc
常微分方程数值解法欧拉格式和梯形格式的比较 PAGE PAGE 4 年级00000班号0000学号0000专业000姓名00000实验名称000000实验类型设计型综合型创新型实验目的或要求常微分的数 ...
- 基础数学(8)——常微分方程数值解法
文章目录 期末考核方式 基础知识 解析解(公式法) 解析解例题(使用公式法,必考) 解析解的局限性 数值解 数值解的基本流程 显示Euler法 显示欧拉(差值理解) 显示欧拉(Taylor展开理解) ...
- 常微分方程数值解法-Python实现
目录 一阶微分方程 简介 四阶龙格库塔方法 广义 高阶微分方程 简介 一阶微分方程 简介 四阶龙格库塔方法 一阶微分方程解法 class Runge_Kutta:def __init__(self) ...
- 常微分方程数值解法1
1.牛顿迭代法 多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要.牛顿迭代法使用函数 的泰勒级数的前面几项来寻找方程 的根.牛顿迭代法是求方程根的重要方法之 ...
最新文章
- Forefront_TMG_2010-TMG建立站点间***
- mysql主从读写Windows_Windows操作系统下的MySQL主从复制及读写分离
- 聊一聊:MyBatis和Spring Data JPA的选择问题
- python装饰器_python装饰器完全指南之一
- Go报错:more than one character in rune literal
- java epoll select_Java 非阻塞 IO 和异步 IO
- rpm(centos)软件包管理工具
- 依赖注入_set方法注入_构造器注入
- spring-boot--整合thymeleaf模板
- python数据导出excel_【python Excel】如何使用python将大量数据导出到Excel中的小技巧之一...
- PetShop数据访问层之消息处理(转Bruce Zhang)
- 线程锁并不是想象的那样可靠
- java servlet 视频_Servlet开发的理论提升视频教程 - JavaWeb - Java - 私塾在线 - 只做精品视频课程服务...
- 微信小程序获取用户信息及手机号授权的流程
- linux安装红警教程,红警2任务安装教程_红色警戒2任务安装方法一览
- 由一道CTF pwn题深入理解libc2.26中的tcache机制
- 神华集团世界500强酷站欣赏
- 画PCB必备的3D元器件模型下载地址整理
- Beta周王者荣耀交流协会第六次会议
- TCP非持久连接、持久性连接(流水线方式、非流水线方式)例题