fork download
  1. /*
  2. [1] 授業単元: 現象数理
  3. [2] 問題文(含コード&リンク):
  4. f(x) = cosx - x^2 = 0 の近似解を求めるプログラムを作り、以下の問題を解け。
  5. なお、二分法を用いること。
  6. 
a = 0, b = 1 からa, b, c の値を求める。
  7. &#8232;|b - a| < 10^(-6) の条件を満たすまで実行し、
  8. もしくはこの条件を満たさない場合は30 回実行し、各回のa, b, cの値をまとめる。
  9. [3] 環境
  10.  [3.1] OS:Linux
  11.  [3.3] 言語:C
  12. [4] 期限:2013年10月26日24:00まで
  13. [5] その他の制限:特にありません。
  14. お願いします。
  15. */
  16.  
  17. #include <math.h>
  18. #include <stdio.h>
  19.  
  20. double f(double x)
  21. {
  22. return cos(x) - x * x;
  23. }
  24.  
  25. int main()
  26. {
  27. int i, lim = 30;
  28. double a = 0.0, b = 1.0, eps = 1e-6;
  29. double c, fa = f(a), fc;
  30.  
  31. if (fa == 0) { // f(a) == 0 なら答えわかってるやんw
  32. printf("a=%g is the answer.\n", a);
  33. return 0;
  34. }
  35. if (fa * f(b) > 0) { // f(a),f(b) 同符号 => 二分法では根を見つけられへん
  36. printf("i can't find the answer.\n");
  37. return 1;
  38. }
  39. for (i = 0; i < lim; i++) {
  40. c = (a + b) * 0.5;
  41. fc = f(c);
  42. printf("i=%d,a=%g,b=%g,c=%g,f(c)=%g\n", i, a, b, c, fc);
  43. if (fabs(b - a) < eps || fc == 0) break;
  44. if (fa * fc < 0) // f(a),f(c) 異符号 => a と c の間に根がある
  45. b = c;
  46. else // f(a),f(c) 同符号 => c と b の間に根がある
  47. a = c;
  48. }
  49. printf("c=%g is the answer.\n", c);
  50. return 0;
  51. }
  52.  
Success #stdin #stdout 0s 2248KB
stdin
Standard input is empty
stdout
i=0,a=0,b=1,c=0.5,f(c)=0.627583
i=1,a=0.5,b=1,c=0.75,f(c)=0.169189
i=2,a=0.75,b=1,c=0.875,f(c)=-0.124628
i=3,a=0.75,b=0.875,c=0.8125,f(c)=0.0275293
i=4,a=0.8125,b=0.875,c=0.84375,f(c)=-0.0472483
i=5,a=0.8125,b=0.84375,c=0.828125,f(c)=-0.00953282
i=6,a=0.8125,b=0.828125,c=0.820312,f(c)=0.00908009
i=7,a=0.820312,b=0.828125,c=0.824219,f(c)=-0.000205924
i=8,a=0.820312,b=0.824219,c=0.822266,f(c)=0.0044422
i=9,a=0.822266,b=0.824219,c=0.823242,f(c)=0.00211941
i=10,a=0.823242,b=0.824219,c=0.82373,f(c)=0.000957065
i=11,a=0.82373,b=0.824219,c=0.823975,f(c)=0.00037565
i=12,a=0.823975,b=0.824219,c=0.824097,f(c)=8.48831e-05
i=13,a=0.824097,b=0.824219,c=0.824158,f(c)=-6.05154e-05
i=14,a=0.824097,b=0.824158,c=0.824127,f(c)=1.21851e-05
i=15,a=0.824127,b=0.824158,c=0.824142,f(c)=-2.41648e-05
i=16,a=0.824127,b=0.824142,c=0.824135,f(c)=-5.98977e-06
i=17,a=0.824127,b=0.824135,c=0.824131,f(c)=3.0977e-06
i=18,a=0.824131,b=0.824135,c=0.824133,f(c)=-1.44603e-06
i=19,a=0.824131,b=0.824133,c=0.824132,f(c)=8.25834e-07
i=20,a=0.824132,b=0.824133,c=0.824132,f(c)=-3.10098e-07
c=0.824132 is the answer.