/* 40110A.c */

/* 平均変化率の極限としての x=a における微分係数を求める。 */

/* 関数f(x)はプログラムの中で与える。aの値はキーボードで与える。 */

/* 極限は与えられた精度の近似値に達するまで反復計算する。 */

/* 近似値の精度はプログラムの中で与える。 */

/* 出力はディスプレイとEドライブにファイル40110A.datを生成 */

 

/* --------注意:<関数>の書かれた行にF(x)を書いて下さい。(3箇所)-------- */

 

#include<stdio.h>

#define SEIDO 0.001

main(){

        int flag=0;   /* 精度に達した:1, 達していない:0 */

        float a,x,d=1.0,h; /* d:平均変化率のxの幅, h:一時保存用 */

        float f(float);  /* 関数の値を計算 */

        float HeikinHenkaritu;

        int print(FILE *,float,float); /* 反復計算の各ステップの結果を表示・保存 */

        FILE *fp;

        fp=fopen("E:4011A.dat","w");

        printf("\nf(x)=x^2+3*x-7, f'(a)を求める。精度=%.4f\na=?",SEIDO); /*<関数>*/

        fprintf(fp,"\nf(x)=x^2+3*x-7, f'(a)を求める。精度=%.4f\na=?",SEIDO); /*<関数>*/

        scanf("%f",&a);

        fprintf(fp,"a=%f\n",a);

        x=a+d;

        h=HeikinHenkaritu=(f(x)-f(a))/(x-a);

        print(fp,d,HeikinHenkaritu);

        while(flag==0){

                d=d/10;

                x=a+d;

                HeikinHenkaritu=(f(x)-f(a))/(x-a);

                if( (HeikinHenkaritu-h)*(HeikinHenkaritu-h) < SEIDO*SEIDO ){

                        flag = 1;

                }

                h=HeikinHenkaritu;

                print(fp,d,HeikinHenkaritu);

        }

        printf("\n  x=%f における微分係数 ≒ %.2f\n\n",a,h);

        fprintf(fp,"\n  x=%f における微分係数 ≒ %.2f\n",a,h);

        fclose(fp);

        return(0);

}

 

float f(float x){

        float y;

        y = x*x + 3*x -7;       /*<関数>*/

        return(y);

}

 

int print(FILE *fp,float d,float HeikinHenkaritu){

        printf("\n 幅 = %f : 平均変化率 = %.5f\n",d,HeikinHenkaritu);

        fprintf(fp,"\n 幅 = %f : 平均変化率 = %.5f\n",d,HeikinHenkaritu);

        return(0);

}