Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C上的Runge-Kutta积分_C_Function_Pointers_Runge Kutta - Fatal编程技术网

C上的Runge-Kutta积分

C上的Runge-Kutta积分,c,function,pointers,runge-kutta,C,Function,Pointers,Runge Kutta,所以我的代码可以工作,只是出于某种原因,我的代码总是运行两个if语句(两个y方程,无论我为第一个fprintf问题输入哪个数字)。此外,t,y列总是比t,y2列长得多(编辑,即如果我输入funt=1,t0=0,t1=10,inity=1,dt=0.1,我的t,y列有100行,我的t,yexact列有10行)。此外,t,y部分的t列对于第一个if语句(y方程)都是零,对于第二个if语句(y方程)都是一个数字。任何帮助都将不胜感激 #include <stdio.h> #include

所以我的代码可以工作,只是出于某种原因,我的代码总是运行两个if语句(两个y方程,无论我为第一个fprintf问题输入哪个数字)。此外,t,y列总是比t,y2列长得多(编辑,即如果我输入funt=1,t0=0,t1=10,inity=1,dt=0.1,我的t,y列有100行,我的t,yexact列有10行)。此外,t,y部分的t列对于第一个if语句(y方程)都是零,对于第二个if语句(y方程)都是一个数字。任何帮助都将不胜感激

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double rk4(double(*f)(double,double),double,double,double);
double user_fun_1(double,double);
double user_fun_2(double,double);

int main (void) {
  int funct;
  double *y,t,y2;
  double t0,t1,dt,inity,C;
  int i,n;
  fprintf(stdout, "Which function do you wish to integrate?\n(1)f(t,y)=t\n(2)f(t,y)=-y\n");
  fscanf(stdin,"%d",&funct);
  fprintf(stdout,"What is the initial time?\n");
  fscanf(stdin,"%lf",&t0);
  fprintf(stdout,"What is the final time?\n");
  fscanf(stdin,"%lf",&t1);
  fprintf(stdout,"What is the initial value of y?\n");
  fscanf(stdin,"%lf",&inity);
  fprintf(stdout,"what is the step size?\n");
  fscanf(stdin,"%lf",&dt);
  if (dt>(t1-t0)){
    printf("The stepsize has to be less than or equal to the total time\n");
    return EXIT_FAILURE;}
  n = 1 + (t1-t0)/dt;
  y = (double *)malloc(n*sizeof(double));
  if (funct=1){
    C=inity-(t0*t0*0.5);
    printf("%s%25s\n","t","y");
    for (y[0]=inity,i=1;i<n;i++){
      y[i]=rk4(user_fun_1,dt,t0 + dt * (i-1),y[i-1]);
      printf("%lf%25lf\n",t,y[i]);}
    printf("%s%25s\n","t","y exact");
    for(i=0;i<n;i+=t1){
      t=t0+dt*i;
      y2=(t*t*0.5) + C;
      printf("%lf%25lf\n",t,y2);}}

    if (funct=2){
      C=inity/(exp(-t0));
      printf("%s%25s\n","t","y");
      for(y[0]=inity,i=1;i<n;i++){
        y[i]=rk4(user_fun_2,dt,t0+dt*(i-1),y[i-1]);
        printf("%lf%25lf\n",t,y[i]);}
        printf("%s%25s\n","t","y exact");
      for(i=t0;i<n;i+=t1){
        t=t0+dt*i;
        y2=C*exp(-t);
        printf("%lf%25lf\n",t,y2);}}

  free(y);
  return EXIT_SUCCESS;}

double user_fun_1(double t,double y){
  return t;}
double user_fun_2(double t, double y){
  return -y;}
double rk4(double(*f)(double, double), double dt,double t,double y){
  double k1,k2,k3,k4;
  k1=dt*f(t,y);
  k2=dt*f(t + dt/2,y + k1/2);
  k3=dt*f(t + dt/2,y + k2/2);
  k4=dt*f(t + dt,y + k3);
  return y + (k1 + 2*k2 + 2*k3 +k4)/6;}
#包括
#包括
#包括
双人rk4(双人(*f)(双人,双人),双人,双人,双人);
双用户_fun_1(双用户,双用户);
双用户_fun_2(双用户,双用户);
内部主(空){
int函数;
双*y,t,y2;
双t0,t1,dt,C;
inti,n;
fprintf(stdout,“您希望集成哪个函数?\n(1)f(t,y)=t\n(2)f(t,y)=-y\n”);
fscanf(标准输入、%d、&funct);
fprintf(stdout,“初始时间是多少?\n”);
fscanf(标准输入,%lf,&t0);
fprintf(标准“最后一次是什么时间?\n”);
fscanf(标准输入、%lf、&t1);
fprintf(stdout,“y的初始值是多少?\n”);
fscanf(标准输入、%lf、&inity);
fprintf(标准输出,“步长是多少?\n”);
fscanf(标准输入、%lf、&dt);
如果(dt>(t1-t0)){
printf(“步长必须小于或等于总时间\n”);
返回退出失败;}
n=1+(t1-t0)/dt;
y=(双*)malloc(n*sizeof(双));
if(funct=1){
C=初始值-(t0*t0*0.5);
printf(“%s%25s\n”、“t”、“y”);

对于(y[0]=inity,i=1;i您的
语句,如果
语句错误,则它是一个赋值而不是一个比较。它应该是

if (funct==2)
不是

第一个
if
语句也是如此

一个安全的c习惯是在if语句中交换常量和变量的位置。if(2==funtc)起作用,if(2=funtc)将给出编译时错误。 下次尝试打开编译器警告,它可以帮助您找到此类错误。如果您使用的是
gcc
,请添加
-Wall-Wextra
标志

你的
t,y
t,y确切的
长的原因是你的
n=101
,和
t1=10
。 因此,在第一个
for
循环中,您编写了
i++
,因此它循环了100次,但在第二个
for
循环中,您使用了
i+=t1
,因此它只循环了11次


t
始终为0的原因是,您从未为它分配任何初始值,也从未在第一个
循环中为
分配值。

如果
语句错误,则它是一个赋值,而不是比较。应该是

if (funct==2)
不是

第一个
if
语句也是如此

一个安全的c习惯是在if语句中交换常量和变量的位置。if(2==funtc)起作用,if(2=funtc)将给出编译时错误。 下次尝试打开编译器警告,它可以帮助您找到此类错误。如果您使用的是
gcc
,请添加
-Wall-Wextra
标志

你的
t,y
t,y确切的
长的原因是你的
n=101
,和
t1=10
。 因此,在第一个
for
循环中,您编写了
i++
,因此它循环了100次,但在第二个
for
循环中,您使用了
i+=t1
,因此它只循环了11次


之所以
t
总是0,是因为你从来没有给它赋值,也没有在第一个
for
循环中赋值。

谢谢!你知道为什么我的t,y列都是0,并且比t,y2列长很多吗?@Mike你能在你的问题中提供一些示例输入,这样ppl就可以复制了吗了解您的结果吗?@Mike我已经根据您的输入更新了我的答案。希望它能有所帮助。这就是为什么我希望GCC会这样做。就我个人而言,我讨厌阅读带有反向比较的代码;我更喜欢在左边写我正在比较的变量,在右边写我正在比较的值。因为有编译器选项来生成warning,我一直在使用它们,所以我不会长时间遇到这个问题-第一次编译失败(我也使用
-Werror
)。谢谢!你知道为什么我的t,y列都是0,并且比t,y2列长很多吗?@Mike你能在你的问题中提供一些示例输入,这样ppl就可以复制你的结果吗?@Mike我已经根据你的输入更新了我的答案。希望它能有所帮助。这就是为什么我希望GCC会这样做。就我个人而言,我讨厌读c带有反向比较的ode;我更喜欢在左边写我正在比较的变量,在右边写我正在比较的值。因为有编译器选项来生成警告,所以我一直在使用它们,所以我不会长时间遇到这个问题-第一次编译出错失败(我也使用了
-Werror
)。此行:if(funct=1){和此行if(funct=2)都不正确;它们将1或2赋值给funct变量。正确的语法是:if(1==funct){和if(2==funct){注意:这是将文本放在左边的主要原因,因此编译器会捕获这些类型的编码错误,因此我们不必花费时间调试代码。在编写printf格式参数字符串时,大多数参数之间应该有一个空格,尤其是连续字符串或连续数字,因此显示的结果是空的由于参数输出之间有一个空格,因此很容易读取:y[i]=rk4(user_-fun_2,dt,t0+dt*(i-1),y[i-1])不是对rk4()函数的有效调用,因为user_-fun_2()需要两个双参数。如果编译器启用了所有警告,它会告诉您user_-fun_2()的问题正在使用错误数量的参数调用..此行:if(funct=1){和此行if(funct=2)都不正确;它们将1或2赋值给funct变量。正确的语法是:if(1==funct){和if(2==funct){N