2013-06-25 27 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,總是在指針後面檢查。我現在要就這個問題發表評論。 –