/* 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);
}