首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请各位学长帮忙修改个程序!解决思路

2012-02-26 
请各位学长帮忙修改个程序!下面这个程序是用龙格库塔法求解微分方程的,哪位学长能帮忙把它改成用数组形式

请各位学长帮忙修改个程序!
下面这个程序是用龙格库塔法求解微分方程的,哪位学长能帮忙把它改成用数组形式的,我不太会,想学习一下,我编的这个太繁杂可,谢谢!
/*龙格库塔法求解微分方程*/
#include "stdio.h"
#include "math.h"
#define A 0 /*定义初值和步长*/
#define B 0.002
#define C 1
#define D 1
#define E 1

double f(double,double,double,double); /* 定义函数*/
double g(double,double,double,double);
double e(double,double,double,double);

main()
{
  double x0=A, h=B,
  y01=C, u01=D, v01=E,
  j01,j02,j03,j04,k01,k02,k03,k04,l01,l02,l03,l04;
  int i,n=10000;
  FILE *cfPtr;
  if((cfPtr=fopen("luolunzi.dat","w"))==NULL) /*数据要写入的文件*/
  printf("File could not be opened\n");
  else
  { 
  for (i=1;i<=n;i++)
  { /*套用公式开始计算*/ 
  x0=x0+h;
  j01=f(x0,y01,u01,v01);
  k01=g(x0,y01,u01,v01);
  l01=e(x0,y01,u01,v01);
   
  j02=f(x0+h/2.0,y01+h/2.0*j01,u01+h/2.0*k01,v01+h/2.0*l01);
  k02=g(x0+h/2.0,y01+h/2.0*j01,u01+h/2.0*k01,v01+h/2.0*l01);
l02=e(x0+h/2.0,y01+h/2.0*j01,u01+h/2.0*k01,v01+h/2.0*l01);

  j03=f(x0+h/2.0,y01+h/2.0*j02,u01+h/2.0*k02,v01+h/2.0*l02);
  k03=g(x0+h/2.0,y01+h/2.0*j02,u01+h/2.0*k02,v01+h/2.0*l02);
  l03=e(x0+h/2.0,y01+h/2.0*j02,u01+h/2.0*k02,v01+h/2.0*l02);
   
  j04=f(x0+h,y01+h*j02,u01+h*k02,v01+h*l02);
  k04=g(x0+h,y01+h*j02,u01+h*k02,v01+h*l02);
  l04=e(x0+h,y01+h*j02,u01+h*k02,v01+h*l02);
   
  y01=y01+h/6.0*(j01+2.0*j02+2.0*j03+j04);
  u01=u01+h/6.0*(k01+2.0*k02+2.0*k03+k04);
  v01=v01+h/6.0*(l01+2.0*l02+2.0*l03+l04);
   
  printf("%15.7f\t%15.7f\t%15.7f\t\n",x0,y01,u01,v01);
  fprintf(cfPtr,"%15.7f\t%15.7f\t%15.7f\t\n",x0,y01,u01,v01);
  }
  fclose(cfPtr);
}


double f(double s1,double q1,double u1,double r1) /*定义的微分方程*/  
{
  double z1;
  z1=-10*q1+(10*u1);
  return z1;
}
double g(double s2,double q2,double u2,double r2)
{
  double z2;
  z2=28*q2-u2-q2*r2;
  return z2;
}
double e(double s3,double q3,double u3,double r3)
{
double z3;
z3=(-8/3)*r3+q3*u3;
return z3;
}


[解决办法]
楼主的意思是把每次计算出来的x0,y01,u01,v01用数组的形式保存下来,是吗?
[解决办法]
整理修改如下:

C/C++ code
#include   <stdio.h> #include   <math.h> #define   A   0                                       /*定义初值和步长*/ #define   B   0.002 #define   C   1 #define   D   1 #define   E   1 #define   N   100double   f1(double   s1,double   q1,double   u1,double   r1)         //f     {     return (-10*q1 + 10*u1); } double   f2(double   s2,double   q2,double   u2,double   r2)          //g{     return (28*q2 - u2 - q2*r2);} double   f3(double   s3,double   q3,double   u3,double   r3)          //e{     return ((-8/3.0)*r3 + q3*u3);} int main(){    double result[3] = {C, D, E};    //y,u,v    double tmp[3][4];   //j,k,i    //初始化    double x = A, h = B;    double (* p[3])(double, double, double, double) = {f1, f2, f3};        int  i, j;     FILE *cfPtr;         if((cfPtr = fopen("luolunzi.dat","w")) == NULL)        printf("File could not be opened\n");     else     {           for(i = 1; i <= N; i++)           {                     x += h;            for(j = 0; j < 3; j++)            {                tmp[j][0] = p[j](x, result[0], result[1], result[2]);            }                for(j = 0; j < 3; j++)            {                tmp[j][1] = p[j](x + h/2.0, result[0]+h/2.0*tmp[0][0], result[1]+h/2.0*tmp[1][0], result[2]+h/2.0*tmp[2][0]);            }                for(j = 0; j < 3; j++)            {                tmp[j][2] = p[j](x + h/2.0, result[0]+h/2.0*tmp[0][1], result[1]+h/2.0*tmp[1][1], result[2]+h/2.0*tmp[2][1]);            }            for(j = 0; j < 3; j++)            {                tmp[j][3] = p[j](x + h, result[0]+h*tmp[0][1], result[1]+h*tmp[1][1], result[2]+h*tmp[2][1]);            }            printf("%15.7f\t", x);            for(j = 0; j < 3; j++)            {                result[j] += h/6.0*(tmp[j][0]+2.0*tmp[j][1]+2.0*tmp[j][2]+tmp[j][3]);                printf("%15.7f\t", result[j]);            }            fprintf(cfPtr,"%15.7f\t%15.7f\t%15.7f\t%15.7f\n", x, result[0], result[1], result[2]);        }        fclose(cfPtr);    }    return 0;} 


[解决办法]
太麻烦了,先这样了,不合适的地方,lz自己改改吧。

C/C++ code
/*龙格库塔法求解微分方程*/ #include   "stdio.h" #include   "math.h" #define   A   0                                       /*定义初值和步长*/ #define   B   0.002 #define   C   1 #define   D   1 #define   E   1 #define ARRAY_NUM(a) (sizeof(a) / sizeof((a)[0]))typedef double (*FUNC)(double,double,double,double);struct R_K_PARA {    double x;    double y;    double u;    double v;};typedef struct R_K_PARA R_K_PARA_t;double   f(double,double,double,double);                 /*   定义函数*/ double   g(double,double,double,double); double   e(double,double,double,double); FUNC r_k_func[] = {    f,    g,    e,};#define R_K_NUM ARRAY_NUM(r_k_func)R_K_PARA_t r_k(FUNC* func, int fn, R_K_PARA_t pa, double h);int main(void) {    double h = B;    int    i, n = 10000;     R_K_PARA_t pa = {A, C, D, E}, ret;    FILE   *cfPtr;     if ((cfPtr = fopen("luolunzi.dat", "w")) == NULL)                     /*数据要写入的文件*/         printf("File   could   not   be   opened\n");     else {           for (i = 1; i <= n; i++) {                                                                                               /*套用公式开始计算*/               pa.x += h;             pa = r_k(r_k_func, R_K_NUM, pa, h);            printf("%15.7f\t%15.7f\t%15.7f\t%15.7f\t\n", pa.x, pa.y, pa.u, pa.v);             fprintf("%15.7f\t%15.7f\t%15.7f\t%15.7f\t\n", ret.x, ret.y, ret.u, ret.v);         }         fclose(cfPtr);     }    return 0;}R_K_PARA_t r_k(FUNC* func, int fn, R_K_PARA_t pa, double h){    int i, j;    double rk[] = {0, 1 / 2.0, 1 / 2.0, 1};    double jkl[ARRAY_NUM(rk)][R_K_NUM];    for (i = 0; i < ARRAY_NUM(rk); i++) {        for (j = 0; j < R_K_NUM; j++) {            if (i == 0) {                jkl[i][j] = func[j](pa.x, pa.y, pa.u, pa.v);            } else {                jkl[i][j] = func[j](pa.x + h * rk[i], pa.y + h * rk[i] * jkl[i - 1][0],                                     pa.u + h * rk[i] * jkl[i - 1][1], pa.v + h * rk[i] * jkl[i - 1][2]);            }        }    }    pa.y += (jkl[0][0] + jkl[1][0] * 2.0 + jkl[2][0] * 2.0 + jkl[3][0]) * h / 6.0;    pa.u += (jkl[0][1] + jkl[1][1] * 2.0 + jkl[2][1] * 2.0 + jkl[3][1]) * h / 6.0;    pa.v += (jkl[0][2] + jkl[1][2] * 2.0 + jkl[2][2] * 2.0 + jkl[3][2]) * h / 6.0;    return pa;}double   f(double   s1,double   q1,double   u1,double   r1)                         /*定义的微分方程*/     {     double   z1;     z1=-10*q1+(10*u1);     return   z1; } double   g(double   s2,double   q2,double   u2,double   r2) {     double   z2;     z2=28*q2-u2-q2*r2;     return   z2; } double   e(double   s3,double   q3,double   u3,double   r3) {     double   z3;     z3=(-8/3)*r3+q3*u3;     return   z3; } 

热点排行