2013-06-25 26 views
1

我试图在文档中打印某些内容,但它只适用于我试过的第一个值!我试图自己弄清楚,但我不到一个小时就把这段代码给我的教授,所以我有点绝望。 :/当它经历一个循环时,fprintf不打印

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

double euler(double v0, double *t0, double h, double (*f)(double)); 
double dv(double v); 

int main(){ 
    double vlim, t = 0; 
    double *pt = &t; 
    double h0 = 1.e-7; 

    vlim = euler(0, pt, h0, dv); 
    printf("O tempo e a velocidade limite para um passo de %.0e s sao respectivamente:\n", h0); 
    printf("%.0e s e %lf mm/s.\n\n", *pt, vlim); 

    double h = h0, v = 0; 
    do { 
     *pt = 0; 
     v = euler(0, pt, h, dv); 
     h /= 5.; 
    } while (fabs(v-vlim)/v > 1e-5); 

    printf("O passo necessario para atingir a convergencia na velocidade limite e' %.1e s.\n",h); 
    return 0; 
} 

double euler(double y, double *x, double h, double (*f)(double)){ 
    FILE *arq = fopen("bolha.dat","w+"); 
    double y0, eps = 1e-4; 
    do{ 
     y0 = y; 
     y = y0 + h*f(y0); // Metodo de Euler 
     *x += h; 
     fprintf(arq, "%.1e\t%.7lf\n", *x, y); 
    } while (fabs((y-y0)/y) > eps); 

    fclose(arq); 
    return y; 
} 

dv是不相关的,所以我没有发布它。它看起来像循环中的东西真的很愚蠢,因为如果我把h0 = 2.e-8(这是我试图打印的值)它适用于该值。

+0

什么是f(y0)?你确定这不是0吗? – SheetJS

+0

@Nirk y0是另一个变量,对不起,我没有指定它。我的欧拉函数使用欧拉方法来求解微分方程。 f(y0)是导数。 –

+0

我的观点是,如果f(y0)== 0,循环会停止,因为y将是y0 + h * f(y0)= y0 + 0 = y0 – SheetJS

回答

0

我可以通过在euler函数中创建一个参数来修复它,然后在循环之后再次在另一个文件上调用它。这解决了问题,但我仍然不明白为什么它不工作。

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

double euler(double v0, double *t0, double h, double (*f)(double), FILE *arquivo); 
double dv(double v); 

int main(){ 
    FILE *saida = fopen("bolhateste.dat","w+"); 
    double vlim, t = 0; 
    double *pt = &t; 
    double h0 = 1.e-7; 

    vlim = euler(0, pt, h0, dv, saida); 
    printf("O tempo e a velocidade limite para um passo de %.0e s sao respectivamente:\n", h0); 
    printf("%.0e s e %lf mm/s.\n\n", *pt, vlim); 

    double h = h0, v = 0; 
    do { 
     *pt = 0; 
     v = euler(0, pt, h, dv, saida); 
     h /= 5.; 
    } while (fabs(v-vlim)/v > 1e-5); 

    saida = fopen("bolha.dat","w+"); 
    euler(0, pt, h, dv, saida); 

    printf("O passo necessario para atingir a convergencia na velocidade limite e' %.1e s.\n",h); 
    return 0; 
} 

double euler(double y, double *x, double h, double (*f)(double), FILE *arquivo){ 
    double y0, eps = 1e-4; 
    do{ 
     y0 = y; 
     y = y0 + h*f(y0); // Metodo de Euler 
     *x += h; 
     fprintf(arquivo, "%.1e\t%.7lf\n", *x, y); 
    } while (fabs((y-y0)/y) > eps); 

    return y; 
} 
+0

1)在程序结束时使用fclose。2)当你打开一个文件时,如果等于null,总是在指针后面检查。我现在要就这个问题发表评论。 –