• ベストアンサー

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

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

  • DIY1
  • お礼率1% (2/130)

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

  • ベストアンサー
  • 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/

関連するQ&A

  • fortranのプログラムについて

    fortranでプログラムを作成する課題が出たのですが、やり方が全くわかりません。 何を使ってどういう順番で組めばよいか教えてください。 課題は以下のとおりです。 x^2+y^2<1を満たす領域の面積を、以下の方法で近似計算するプログラムを作成せよ。 はじめは、領域を0<x<1、0<y<1と設定し、x、y方向にそれぞれn等分に分割し、多数の正方形を用意する。 分割されたそれぞれの正方形の面積は、みな等しく1/n^2である。 各正方形の重心位置(xi,yj)は、 xi=1/2n+i/n i=0~n-1 yj=1/2n+j/n j=0~n-1 であらわされる。 個々の正方形について、その重心位置(xi,yj)が求めたい領域に含まれるかどうかを判断し、この総数から近似面積を求める。最後に、この値を4倍したもの(つまりx^2+y^2<1の近似面積)を出力することとする。 なお、i,j,nはinteger(8)で、x,y,求めたい面積等はreal(8)を用い、n=100000(nはread文で入力する形でよい)で計算することとする。 よろしくお願いします。

  • xのn乗の微分の公式!!

    参考書に「(定理) xのn乗の微分の公式        (i) f(x)=xのn乗(nは正の整数)のとき         f '(x)=d/dx・xのn乗=n・xのn-1乗        (ii) f(x)=c(cは定数)のとき          f '(x)=d/dx・c=0 ただしx=0の場合を除けば、(ii)は(i)のn=0の場合に含めることもできる。」とかいてあったのですが、「ただし・・」いこうの文がどういういみなのかわかりません。 教えてください!!!おねがいします!!!!

  • 数学におけるプログラムの問題です。

    「次のプログラムは何をするものか説明し、nに360が入力されたときのp,qを求めよ。   100 INPUT n     110 FOR i=1 TO SQR(n)   120 IF MOD(n,i*i)=0 THEN LET p=i   130 NEXT i   140 LET q=n/(p*p)   150 PRINT "p=";p   160 PRINT "q=";q    END」 という問題です。  p=6,q=10 はわかります。このプログラムは「入力された値に対して、2乗して割り切れる最大の値とその時の商を求めるものである」でよろしいのでしょうか?

  • プログラムについてですが・・・

    今、画像処理の最小二乗法のプログラムを作成しているのですが、どうも上手く出力されません。以下のプログラムが、メインのプログラムでして、余分な #include は気にしないでください。画像の表示自体のプログラムは特に問題はありませんでしたので省きました。このプログラムにどんな問題があるか、わかりません。どなたか教えてください。 お願いします。 #include <math.h> #include <windows.h> #include <commdlg.h> #include <memory.h> #include <dos.h> #include <time.h> #include <wchar.h> #include <stdio.h> #include <iostream.h> #include "../DibFile.h" #include "ImageSDK.h" int n,n4,n5,n6,n7,n8,n9 ; double n10,n11 ; int n0[1000],n1[1000],n2[1000],n3[1000] ; n = 0 ; for(y = 0 ; y < h ; y++){   for(x = 0 ; x < w ; x++){ i = x+y*w ; if( *(buff1+i) == 0x00 ){                n0[n] = x ;                n1[n] = y ;                n2[n] = x*x ;                n3[n] = x*y ;                ++n ; } } } n5 = 0 ; n6 = 0 ; n7 = 0 ; n8 = 0 ; n9 = 0 ; for(n4 = 0 ; n4 < n ; n4++){ n5 += n2[n4] ; n6 += n0[n4] ; ++n7 ; n8 += n3[n4] ; n9 += n1[n4] ; } if((n6*n6-n7*n5) != 0){  n10 = ((n9*n6)-(n7*n8)) / ((n6*n6)-(n7*n5)) ;  n11 = (n8-(n5*n10)) / n6 ; for(x = 0 ; x < w ; x++){   y = (int) (n10*x+n11) ;    if(y < h && y > 0){  *(buff1+(x+y*w)) = 0x80 ;    } }

  • Cプログラムです

    #include<stdio.h> #include<math.h> int main(void) { double D[512]; short data[16000]; double datafft[512]; double horizon[256]; double dB[256]; double power[256]; double Xr[512],Xi[512]; double w, pai=3.1415926; double er, ei; double r,x,r1,x1,r2,x2 ; int i,k,n,N=500; for(k = 0; k < N; k++) { Xr[k] = 0.0; Xi[k] = 0.0; for(n = 0; n < N; n++) { w = 2 * pai * k * n / N; er = cos(w); ei = sin(-w); r = r1 * r2 - x1 * x2; x = r1 * x2 + r2 * x1; Xr[k] = Xr[k] + er / N; Xi[k] = Xi[k] + ei / N; } } for(i=0;i<512;i++) { datafft[i] = (double)data[i+1000]; power[i] = Xr[i] * Xr[i] + Xi[i] * Xi[i]; } for(i=0;i < 256;i++) { horizon[i] = 16000.0 * ((double)i /512); dB[i] = 10 * log10(power[i]); printf("%f %f \n", horizon[i], dB[i]); } } 正規乱数を発生させたいんですけど、変な値が出てしまいます。 正しくはどうすれば良いか教えてもらえませんか?

  • 問題 数学

    1.シグマk=1から∞ kの3乗/k!は何eですか? e=1+1/1!+1/2!+1/3!+… 2.整数n≧1と実数x>-1に対して、次のうちどれが真ですか? (A) (1+x)のn乗≧1+nx (B) (1+x)のn乗≧1+nx (C) (1+nx)のn乗≧eのnx乗 (D) (1+x)のn乗≦eのnx乗(1-n xの2乗) (E) (1+x)のn乗<1+nx 3. exp(iθ)に等しいものはどれですか?θ=π/6,iの2乗=-1

  • Cプログラムによる画像の高速フーリエ変換FFT

    Cプログラムにる画像処理について教えてください。逆高速フーリエ変換(IFFT)によって周波数領域から実空間領域に変換する際、周波数帯域を(低周波数領域に)制限してIFFTを実行できるという文献があるのですが可能でしょうか?通常の逆離散フーリエ変換(IDFT)では可能でした。 以下のコードの修正で可能でしょうか? 例) 512*512の空間周波数領域データを212*212(仮に)の低周波数領域に帯域制限してIFFTで画像に戻したいのです。 以下の以下の一次元FFTコードを用いてX方向とY方向にIFFTしたいと考えています。 void FFT(int ir, int nx, float *xr, float *xi, float *si, float *co, unsigned short *brv) // 1次元フーリエ変換 // int ir; 順変換(1)と逆変換(-1) // int nx; 1次元FFTのデータ数 // float *xr; 実部のデータ xr[nx] // float *xi; 虚部のデータ xi[nx] // float *si; FFT用のサインデータ si[nx/2] // float *co; FFT用のコサインデータ co[nx/2] // unsigned short *brv; FFT用の入れ替えデータ brv[nx] { int i, j, n1, n2=nx, j3, j4, k, l, ll, d=1, g; float a, b, c, s; for(l = 1; l <= nx/2; l *= 2, d += d) { g = 0; ll = n2; n2 /= 2; for(k = 1; k <= n2; k++) { n1 = k-ll; c = co[g]; s = -ir*si[g]; g += d; for(j = ll; j <= nx; j += ll) { j3 = j+n1-1; j4 = j3+n2; a = xr[j3]-xr[j4]; b = xi[j3]-xi[j4]; xr[j3] += xr[j4]; xi[j3] += xi[j4]; xr[j4] = c*a+s*b; xi[j4] = c*b-s*a; } } } 通常のDFTでの帯域制限はこのように行い可能でした。 void fourier1d(int ir, float *fr, float *fi, int nx) { int i, j, n = 1; float *gr, *gi; double u, x; gr = (float *)malloc((unsigned long)nx*sizeof(float)); gi = (float *)malloc((unsigned long)nx*sizeof(float)); for(i = 0 ; i < nx ; i++) { u = i-nx/2; gr[i] = gi[i] = 0; for(j = 150 ; j < 362 ; j++) { x = j-nx/2; gr[i] += (float)( fr[j]*cos(2*PI*u*x/nx)+ir*fi[j]*sin(2*PI*u*x/nx)); gi[i] += (float)(-ir*fr[j]*sin(2*PI*u*x/nx)+fi[j]*cos(2*PI*u*x/nx)); } } if(ir == -1) n = 212; // 逆変換はデータ数で割る for(i = 0 ; i < nx ; i++) { fr[i] = gr[i]/n; fi[i] = gi[i]/n; } free(gr); free(gi); }

  • Java・プログラムが正常に動きません。

    Javaで、シミュレーションを行った結果を出力するようなプログラムを作っています。コンパイルはできるのですが、Exceptionn in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 というようなメッセージが出てしまいます。 とても初心者で恥ずかしいですがソースはこうです。 import java.awt.*; import java.awt.event.*; public class TestFrame extends Frame{ public static void main(String [] args){ new TestFrame(); } TestFrame(){ super ("TestFrame"); setSize(500,500); setLayout(new BorderLayout()); MyCanvas mc1 = new MyCanvas(); add(mc1, BorderLayout.CENTER); setVisible(true); } } class MyCanvas extends Canvas{ static boolean upsidedown; Color fClr = Color.blue; Color bClr = Color.pink;; int by = 30; int t=0; int R=5; int n=2; public void paint(Graphics g){ Dimension d = getSize(); int radius = R*by; int ox = d.width/2-radius; int oy = d.height/2-radius; g.setColor(bClr); g.fillOval(ox, oy, radius*2,radius*2); Test test = new Test(); ReturnData data = test.method(t,R,n); int i; double x1[], y1[]; x1 = new double [n]; y1 = new double [n]; int x[], y[]; x = new int [n]; y = new int [n]; for(i=0;i<n;i++){ x1[i] = data.x[i]*by + d.width/2; y1[i] = data.y[i]*by + d.height/2; x[i] = (int) x1[i]; y[i] = (int) y1[i]; } for(i=0;i<n;i++){ g.setColor(fClr); g.fillOval(x[i], y[i], 5, 5); } } } ピンクの丸の上に、Test.classで計算した内容を返して青い点を表示させたいのですが、青い点は表示されません。でもなぜかn=1にすると表示されます。 原因の分かりそうな方いらっしゃいませんでしょうか?お願いします。

  • 最小二乗法のn次曲線について

    最小二乗法のn次曲線について Pn(x)=anx^n+an-1x^(n-1)+……+a1x+a0 の時、最小二乗誤差E2は、 E2=Σ(i=1,m)(yi-Pn(xi))^2 =Σ(i=1,m)yi^2-2Σ(i=1,m)Pn(xi)yi+Σ(i=1,m)(Pn(xi))^2 =Σ(i=1,m)yi^2-2Σ(i=1,m)(Σ(j=0,n)ajxi^j)yi+Σ(i=1,m)(Σ(j=0,n)ajxi^j)^2 ここまではわかるんですが、次の式になる理由が分りません。 E2=Σ(i=1,m)yi^2-2Σ(j=0,n)aj(Σ(i=1,m)yixi^j)+Σ(j=0,n)ajΣ(k=0,n)ajak(Σ(i=1,m)xi^(j+k)) 一番後ろの項Σ(j=0,n)ajΣ(k=0,n)ajak(Σ(i=1,m)xi^(j+k))はどうやったらでてくるんでしょうか? なんでいきなりkがでてくるんでしょうか? jとiの組を2乗してるんだからkというのがでてくるのは変だとおもうんですが、どういう考え方なんでしょうか?

  • プログラム

    下のようなプログラムを作ったのですが、10進2進変換をj=n>>2&1の部分にあるようなビットシフトではなく、 for(i=1;i<8;i++){printf("bit[%d]=%d\n",i,n%2);n=n/2;}に変えて剰余計算で行うプログラムにしたいのですが、分かる方がいましたら教えて下さい。お願いします。 #include <stdio.h> int main(void) { int i,j,n; i=2; printf("数字を入力="); scanf("%d",&n); printf("Dec=%d\n",n); printf("heX=0x%x\n",n); j=n>>2&1; printf("bit[%d]=%d\n",i,j); return(0); }

専門家に質問してみよう