#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define ERR_INF 1e-6 //If |xAccu| is too small, use ERR_INF to alternate
//C Function pointers
typedef double (*FUNC)(double,double *);
typedef double (**pFUNC)(double,double *);
//Function points (t,x1,...,xn)
typedef struct{
double t;
double *x;
}POINT,*pPOINT;
//Function solution
typedef struct{
int n;
int PointCount;
pPOINT Curve; //Solved points as an array
}SOLUTION;
//Solving parameters
typedef struct{
double a; //Solving interval: [a,b]
double b;
double *x0; //Initial value at a
double h; //Step length
double eps; //Relative error
int n; //Number of unknown variables
}SOLV_PARAM;
SOLUTION RKF45(pFUNC Func,SOLV_PARAM Param);
void ArrayCopy(double *,double *,int);
void Output(SOLUTION);
double ErrCal(double *xAccu,double *xMid,int n);
double fun1(double t,double *x){
return x[1];
}
double fun2(double t,double *x){
return -2*x[0]/(t*t)+2*x[1]/t;
}
int main(){
double x0[2]={1,4};
SOLV_PARAM Param;
Param.h = 0.1;
Param.eps = 1e-6;
Param.a = 5;
Param.b = 10;
Param.x0 = x0;
Param.n = 2;
pFUNC Func;
Func = (pFUNC)malloc(Param.n*sizeof(FUNC));
Func[0] = fun1;
Func[1] = fun2;
SOLUTION Solution;
Solution = RKF45(Func,Param);
Output(Solution);
free(Func);
return 0;
}
//RKF45 solver core
SOLUTION RKF45(pFUNC Func,SOLV_PARAM Param){
SOLUTION Solution;
Solution.n = Param.n;
Solution.PointCount = 0;
Solution.Curve = NULL;
double t,h,h0;
double *x,*xMid,*xInAccu,*xAccu;
double *k1,*k2,*k3,*k4,*k5,*k6;
t = Param.a;
h = Param.h;
h0 = Param.h;
x = (double *)malloc(Param.n*sizeof(double));
xMid = (double *)malloc(Param.n*sizeof(double));
xInAccu = (double *)malloc(Param.n*sizeof(double));
xAccu = (double *)malloc(Param.n*sizeof(double));
k1 = (double *)malloc(Param.n*sizeof(double));
k2 = (double *)malloc(Param.n*sizeof(double));
k3 = (double *)malloc(Param.n*sizeof(double));
k4 = (double *)malloc(Param.n*sizeof(double));
k5 = (double *)malloc(Param.n*sizeof(double));
k6 = (double *)malloc(Param.n*sizeof(double));
ArrayCopy(x,Param.x0,Param.n); //Initial value
int i;
double Err,OutFlag=0;
int stepFlag=0;
while (t<Param.b)
{
//The end of the interval
if ((Param.b-t)<h){
h = Param.b-t+ERR_INF;
OutFlag = 1;
}
//k1
for (i=0;i<Param.n;i++){
k1[i] = h*(Func[i])(t,x);
xMid[i] = x[i]+(1/4.0)*k1[i];
}
//k2
for (i=0;i<Param.n;i++)
k2[i] = h*(Func[i])(t+(1/4.0)*h,xMid);
for (i=0;i<Param.n;i++)
xMid[i] = x[i]+(3/32.0)*k1[i]+(9/32.0)*k2[i];
//k3
for (i=0;i<Param.n;i++)
k3[i] = h*(Func[i])(t+(3/8.0)*h,xMid);
for (i=0;i<Param.n;i++)
xMid[i] = x[i]+(1932/2197.0)*k1[i]-(7200/2197.0)*k2[i]
+(7296/2197.0)*k3[i];
//k4
for (i=0;i<Param.n;i++)
k4[i] = h*(Func[i])(t+(12/13.0)*h,xMid);
for (i=0;i<Param.n;i++)
xMid[i] = x[i]+(439/216.0)*k1[i]-8.0*k2[i]+(3680/513.0)*k3[i]
-(845/4104.0)*k4[i];
//k5
for (i=0;i<Param.n;i++)
k5[i] = h*(Func[i])(t+h,xMid);
//k6 & Two integral methods
for (i=0;i<Param.n;i++){
xMid[i] = x[i]-(8/27.0)*k1[i]+2*k2[i]-(3544/2565.0)*k3[i]
+(1859/4104.0)*k4[i]-(11/40.0)*k5[i];
k6[i] = h*(Func[i])(t+(1/2.0)*h,xMid);
//RKF4
xInAccu[i] = x[i] +(25/216.0)*k1[i] +(1408/2565.0)*k3[i]
+(2197/4104.0)*k4[i] -(1/5.0)*k5[i];
//RKF5
xAccu[i] = x[i] +(16/135.0)*k1[i] +(6656/12825.0)*k3[i]
+(28651/56430.0)*k4[i]-(9/50.0)*k5[i]
+(2/55.0)*k6[i];
}
//Calculation error
for (i=0;i<Param.n;i++) xMid[i] = xInAccu[i]-xAccu[i];
Err = ErrCal(xAccu,xMid,Param.n);
if (OutFlag == 1) Err = 0.1*Param.eps; //Quit the cycle
//Step too short
if (Err<(0.05*Param.eps) && h<h0 && stepFlag==0){
h *= 2;
stepFlag = 1;
}
//Step too long
else if (Err>Param.eps){
h /= 2;
stepFlag = 1;
}
//Appropriate step length
else{
Solution.PointCount++;
//New point creation
Solution.Curve = (pPOINT)realloc(
Solution.Curve,
Solution.PointCount*sizeof(POINT));
//Assign value to the new point
t += h;
(Solution.Curve[Solution.PointCount-1]).t = t;
(Solution.Curve[Solution.PointCount-1]).x
= (double *)malloc(Param.n*sizeof(double));
ArrayCopy((Solution.Curve[Solution.PointCount-1]).x,
xAccu,Param.n);
//New integral point
ArrayCopy(x,xAccu,Param.n);
stepFlag = 0;
}
if (OutFlag==1) break;
}
return Solution;
free(x);
free(xMid);
free(xInAccu);
free(xAccu);
free(k1);
free(k2);
free(k3);
free(k4);
free(k5);
free(k6);
}
//Output solution
void Output(SOLUTION Solution){
int i,j;
FILE *FileOut;
FileOut = fopen("out.csv","w");
for (i=0;i<Solution.PointCount;i++){
fprintf(FileOut,"%f,",Solution.Curve[i].t);
for (j=0;j<Solution.n;j++){
fprintf(FileOut,"%f,",(Solution.Curve[i].x)[j]);
}
fputc('\n',FileOut);
}
fclose(FileOut);
}
//Copy array from double* to double*
void ArrayCopy(double *dest,double *src,int n){
int i;
for (i=0;i<n;i++) dest[i] = src[i];
}
//Calculate the maximum relative error
double ErrCal(double *xAccu,double *xMid,int n){
double MaxRelErr = 0,RelErr;
int i;
for (i=0;i<n;i++){
if (fabs(xAccu[i])<ERR_INF) RelErr = pow(xMid[i]/ERR_INF,2);
else RelErr = pow(xMid[i]/xAccu[i],2);
if (RelErr>MaxRelErr) MaxRelErr = RelErr;
}
return MaxRelErr;
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于C和RKF45实现常微分方程求解器(源码+数据+说明文档).rar
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共20个文件
c:6个
csv:4个
exe:4个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
![star](https://csdnimg.cn/release/downloadcmsfe/public/img/star.98a08eaa.png)
温馨提示
1、资源内容:基于C和RKF45实现常微分方程求解器(源码+数据+说明文档).rar 2、适用人群:计算机,电子信息工程、数学等专业的学习者,作为“参考资料”参考学习使用。 3、解压说明:本资源需要电脑端使用WinRAR、7zip等解压工具进行解压,没有解压工具的自行百度下载即可。 4、免责声明:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。由于作者大厂工作较忙,不提供答疑服务,如不存在资源缺失问题概不负责,谢谢理解。
资源推荐
资源详情
资源评论
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![iso](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/EXE.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/EXE.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/EXE.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/EXE.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 20 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
- doudn2024-03-17资源不错,内容挺好的,有一定的使用价值,值得借鉴,感谢分享。
![avatar](https://profile-avatar.csdnimg.cn/72a9936e28d84a44b8d02dcbe3729b26_m0_62143653.jpg!1)
Matlab仿真实验室
- 粉丝: 2w+
- 资源: 2179
![benefits](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-1.c8e153b4.png)
下载权益
![privilege](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-2.ec46750a.png)
C知道特权
![article](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-3.fc5e5fb6.png)
VIP文章
![course-privilege](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-4.320a6894.png)
课程特权
![rights](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-icon.fe0226a8.png)
开通VIP
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)