• ベストアンサー

困ってます!数学の公式を用いるプログラムについて。

数学の公式を使ってプログラムを書くのですが、よくわかりません。ちなみに式は以下の通りです。 n s=√Σ(xi-x)2乗 / n-1 i=1 n Σ(xi-x)2乗 全部にルートがかかっておりそれがn-1で割られてるとい i=1     うものです。 円錐の面積を求めるプログラムは簡単にできたのですが、この場合はどうなるのでしょうか?まずfloatに何を入れていいのかもわかりません。円錐を求めた時はfloatにそれぞれradius,height,volumeを入れ実際に動かした時にそれぞれの値を入れると計算できるようにしました。同じ要領でできると思うのですが、アイデアがうまく浮かびません。どなたかアドバイスしてくれる方教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • otn
  • ベストアンサー率66% (14/21)
回答No.5

標準偏差の公式ですね。まずは、入力ですが未知のものを入れて貰うことになります。ここではnとxiになります。nは母集団の全体数、xiは母集団ですから、例えばキーボードから入力するとすると // どんな数の母集団にも対応するには動的確保にします。 #define X_MAX (300) int n; int i; float x[X_MAX]; // 母集団(配列にしないと計算が大変です。) printf("n = "); scanf("%d", &n); for(i=0; i<n; i++){ printf("x%d = ", i+1); scanf("%f", &x[i]); } こんな感じになります。(量が増えた場合は大変なのでファイルからの読み込みにすべきでしょう。) また、数学的にはxは添え字は1から始まるのが普通ですが、コンピュータ的には0から始まる方が扱いやすいので、式を変形しておきます。   n-1 s=√Σ(xi-x)2乗 / n   i=0 基本的に手で計算するときと同じ順番で計算していきます。(細かく分割して考えます。)まずは平均xを計算しなければ、xi-xが計算できませんから、これを求めます。 float x_total; // 合計値 float x_avg; // 平均値 // 平均を求めるため合計を求める x_total = 0.0; for(i=0; i<n; i++){ x_total += x[i]; } // 平均を出す x_avg = x_total / (float)n; これで xi-x_avg で計算できるようになります。後は ・2乗の計算(pow()を使うよりも2回掛けた方が楽)をしながら足していく(Σの計算) ・nで割る ・ルート(sqrt())をとる でsを求めることができるはずです。簡単に計算できないものはあらかじめ計算しておくというのが基本です。 また、サンプルコードはエラー処理が全く入っていないのである値では落ちたり、強制終了したりします。

その他の回答 (4)

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.4

言語は良くわかりませんが  1.数値の数nを入力する。 2.数値を入力し配列に格納する。 3.for next文などで 数値の合計を求め平均xを求める 4.(xi-x)を求め 合計する。 5.4の合計値を二乗して n-1 で割る。 6.その平方根を求める。 要は母集団の標準偏差ですね。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.3

円錐の場合も同じだと思いますが、式を使って手計算した場合の計算式がどうなるか、一度書いてみては? 例) x=3.0 n=3で、 x1=4.3 x2=3.2 x3=2.5 の時のsは?とか。

  • dial8675
  • ベストアンサー率26% (42/159)
回答No.2

Σはループをまわして、 √はsqrt関数とか使えませんか?

  • Peater
  • ベストアンサー率32% (13/40)
回答No.1

シンプレックスの出している「カルキング」は如何でしょうか? ジャストシステムから、簡易版が出ています。

参考URL:
http://www.justsystem.co.jp/calkingj/