ガウス関数を少しずつずらして足し上げるプログラム

このQ&Aのポイント
  • ガウス関数を少しずつずらして足し上げるプログラムで、入力した値のガウス関数の広がりにより重ね合わされた結果を数値計算する。しかし、実行結果におかしい数値が現れる問題が発生している。
  • 行列演算を使用して、各値の寄与を計算しているが、計算結果に明らかにおかしい数値が含まれている。
  • 実行結果におかしい数値が現れる問題の原因は、ソースコードのどこかにあると考えられる。
回答を見る
  • ベストアンサー

ガウス関数を少しずつずらして足し上げるプログラム

ある値をある検出器に入力したときに出力結果がその入力したを中心にガウス関数のように広がってしまう場合を考え,ある関数の値を小刻みに入力したとき、その関数が出力されたときそれぞれ値のガウス関数の広がりにより重ね合わされてどのように見えるか数値計算してみようと思い、以下のソースコードを書いて見ました。行列で考えてそれぞれの値の寄与を足しあげて見ようとしたのしたのですが、実行結果をみると明らかにおかしい10^19などの数値が見られます。これはなぜでしょうか。私のソースコードのどこに問題があるのでしょうか。お手数をお掛けしますが回答よろしくおねがいします。 インデントが反映されていませんでしたらすみません。 ---------------------------ソースコード------------------------------------------ #include<stdio.h> #include <stdlib.h> #include<math.h> #define N 100 #define f(x) pow(x,-1.7) //この関数が検出器に入力したときどのように見えるか知りたい// void mat_product(double ec[N],double r[N][N],double e[N]) { int i,j; for(i=0; i<N; i++){ for(j=0; j<N;j++){ ec[i]+=r[i][j]*e[j]; } } } int main(void) { int i,j; double ec[N],r[N][N],e[N]; double max,min, ei,E,sigma,min1,min2,m,pi; sigma=0.08; //keV// max=10.5; min=0.5; min1=0.5; min2=0.5; m=0.5; ei=(max-min)/N; pi=3.141592; for(i=0; i<N ;i++){ for(j=0; j<N ;j++){ r[j][i]=(1/(pow(2*pi,0.5)*sigma))*exp(-1*pow(m-min1,2)/(2*pow(sigma,2))); m+=ei; } e[i]=f(min2); m=0.5; min1+=ei; min2+=ei; } mat_product(ec,r,e); for(i=0; i<N; i++){ printf("%g\t%g\n",min,ec[i]); min+=ei; } return 0; } ---------------------------出力結果--------------------------------- 0.5 22.0512 0.6 23.8139 0.7 18.9 0.8 14.9642 0.9 12.1864 1 10.1512 1.1 8.60991 1.2 7.4112 1.3 6.45833 1.4 5.68688 1.5 5.05253 1.6 4.52387 1.7 4.07814 1.8 3.69846 1.9 3.37209 2 3.08926 2.1 2.84239 2.2 2.62547 2.3 2.43375 2.4 2.26337 2.5 2.1112 2.6 1.66592 2.7 1.85166 2.8 1.7404 2.9 1.63941 3 1.54742 3.1 1.46337 3.2 1.38635 3.3 1.31558 3.4 4.47979e+30 3.5 1.19017 3.6 1.13444 3.7 1.08275 3.8 1.0347 3.9 0.989949 4 0.9482 4.1 0.909181 4.2 0.872652 4.3 0.838401 4.4 0.806238 4.5 0.775991 4.6 0.747509 4.7 0.720652 4.8 0.695296 4.9 0.671329 5 0.648648 5.1 0.627161 5.2 0.606783 5.3 0.587437 5.4 0.569053 5.5 0.551566 5.6 0.534917 5.7 0.519053 5.8 0.503924 5.9 0.489483 6 0.475689 6.1 0.462502 6.2 0.449887 6.3 0.437809 6.4 0.426239 6.5 0.415146 6.6 0.404506 6.7 0.394292 6.8 0.384482 6.9 0.375054 7 0.365988 7.1 0.357265 7.2 0.348868 7.3 0.34078 7.4 0.332986 7.5 0.325471 7.6 0.318222 7.7 0.311226 7.8 0.304472 7.9 0.297947 8 0.291642 8.1 0.285546 8.2 0.27965 8.3 0.273945 8.4 -0.0404521 8.5 0.263075 8.6 0.257894 8.7 0.252874 8.8 0.248007 8.9 0.243288 9 0.238709 9.1 7.46629e+19 9.2 0.229953 9.3 0.225764 9.4 0.221696 9.5 0.217743 9.6 0.2139 9.7 0.210164 9.8 0.206531 9.9 0.202996 10 0.199557 10.1 0.196209 10.2 0.192868 10.3 0.185672 10.4 0.140717

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> double ec[N],r[N][N],e[N]; のecが初期化されていないまま、mat_product(ec,r,e);が実行され、 mat_product中でも、初期化しないまま > ec[i]+=r[i][j]*e[j]; で、仮引数ec[i](→main中のec[i])にr[i][j]*e[j]が加算されています。 初期化しない自動変数には、何が入っているかわかりません。 ・宣言時に ec[N]={0} と初期化する ・mat_productを呼ぶ前に for(i=0;i<N;i++) {ec[i]=0;}等として0を代入する ・mat_product中で > for(i=0; i<N; i++){ > ec[i]=0 /*初期値*/ と0を代入する

seturi38
質問者

お礼

正常に動作しました!ずっと悩んでいたので。。。。 本当にありがとうございました.

関連するQ&A

  • γ関数のプログラム(初心者です)

    以下のようにγ関数のプログラムを組みました。 とりあえず整数値を入力すれば、正しい値は返しているということがprintfの4で確認できました。 もとはfortranで組んだプログラムをCに置き換えました。 ですが、実際走らせてみると、4で値は確認できますがsegmentation faultが出てしまいます。 ですからサブルーチンファイル(ユーザー関数?)として利用できません。 何がいけないのでしょうか? 正しくyが帰ってくるようにどうなおしたらよいのか教えてください。 #include <stdio.h> #include <math.h> double gamma(double x) { double c[8],y,a,r,b,s; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<8;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1,b))) *((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*(r+(0.03586834*((double)(pow(-1,8)))*((double)(pow(x,8))))); printf("4 %f\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム %lf\n",x); y=gamma(x); printf("%f\n",y); }

  • ガウスの消去法のプログラムについて

    ガウスの消去法のプログラムについて #include <stdio.h> #define N 3 void main(void) { static double a[N][N+1]={{3.0, 1.0, 1.0, 8.0}, {6.0, 2.0, 3.0, 4.0}, {9.0, 4.0, 5.0, 12.0}}; double d; int i,j,k; for (k=0;k<N-1;k++){ for (i=k+1;i<N;i++){ d=a[i][k]/a[k][k]; for (j=k+1;j<=N;j++) a[i][j]=a[i][j]-a[k][j]*d; } } for (i=N-1;i>=0;i++){ d=a[i][N]; for (j=i+1;j<N;j++){ d=d-a[i][j]*a[j][N]; a[i][N]=d/a[i][i]; } } for (k=0;k<N;k++){ printf("x%d=%f\n",k+1,a[k][N]); } } というプログラムを実行したら 8-5.c: In function `main': 8-5.c:4: warning: return type of `main' is not `int' と出たのですがどこを直せばよいのでしょうか?><

  • ガウスのの単純消去法のプログラムです。

    ガウスのの単純消去法のプログラムです。 前進消去の第k段階が終わった段階でaij,biが表示されるようにしたいんですがどうすればいいでしょうか↓ よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<math.h> #define ERROR -1 #define EPS 1.0e-15 int gausssimp(double *, double *, double *, int); int main(void) { double *a,*b,*x,val; char s[32]; int i,j,n,result; printf("Input size n="); gets(s); sscanf(s,"%d",&n); if((a=(double *)calloc(n*n,sizeof(double)) ) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } if((b=(double *)calloc(n,sizeof(double))) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } if((x=(double *)calloc(n,sizeof(double))) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } /* A,b の成分を入力 */ printf("----- A -----\n"); for(i=0; i<n; i++){ for(j=0; j<n; j++){ printf("a(%2d,%2d)=",i+1,j+1); gets(s); sscanf(s,"%lf",&val); a[n*i+j]=val; } } printf("\n----- b -----\n"); for(i=0; i<n; i++){ printf("b(%2d)=",i+1); gets(s); sscanf(s,"%lf",&val); b[i]=val; } /* Gaussの単純消去法による求解 */ result = gausssimp(x,a,b,n); /* 解の表示 */ if(result == ERROR){ printf("ERROR occurs. pivot 0\n"); } else { printf("\n----- solution -----\n"); for(i=0; i<n; i++){ printf("x(%2d)=%.8e\n",i+1, x[i]); } } free(a); free(b); free(x); return 0; } int gausssimp(double *x, double *a, double *b, int n) { int i,j,k; double tmp,p,sum; /* step 1: 前進消去 */ /**** 追加 ****/ /* 前進消去の各段階を終えるごとに,式がどのように変化しているかわかるように表示する */ /**************/ for(k=0; k<n-1;k++){ if(a[n*k+k] == 0.0) { /* ピボットの値が0.割り算でエラーが起きる.*/ return ERROR; } else { /* k+1番目以降の式から x[k] の項を消去 */ for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; } b[i]=b[i]-p*b[k]; printf("a[%d %d]=%d b[%d]=%d",i,j,a[n*i+j]-p*a[n*k+j],i,b[i]-p*a[n*k+j]); ↑これではできませんでした。。。 } /**********************************/ } printf("k=%d\n",k); } /* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS) return(ERROR); sum=0.0; for(j=k+1; j<n; j++) sum+=a[n*k+j]*x[j]; x[k]=(b[k] - sum)/a[k*n+k]; } return 0; }

  • Windowsでは出るエラーでMacでは出ない

    現在、Visual C++ 2013 Expressを使っているのですが、そちらではエラーが出るのに、MacbookのXcodeで走らせたらエラーも出ずに正常に実行することができます。 いったい何が原因でエラーが起こっているのでしょうか? エラーメッセージは"XXXXX.exe has triggered a breakpoint."で"malloc.c"のタブがVC++上に開きます。以下がそのコードになるのですが、アドバイス宜しくお願い致します。 #define _USE_MATH_DEFINES #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> #include <iostream> #include <complex> #include <stdlib.h> using namespace std; typedef complex<double> dcmplx; complex<double> M_i = dcmplx(0, 1); //--------------------------------------------------------------- // Characteristic Function dcmplx* CharFunc(double alpha, double* nu, double s0, double r, double q, double sigma, double t, int N) { dcmplx* out = (dcmplx*)malloc(sizeof(dcmplx) * N); dcmplx* u = (dcmplx*)malloc(sizeof(dcmplx) * N); for (int j = 0; j < N; ++j){ // j = 1,...,N u[j] = nu[j] - (alpha + 1) * M_i; out[j] = exp(M_i*(log(s0) + (r - q - sigma*sigma / 2.0)*t)*u[j] - sigma*sigma * u[j] * u[j] * t / 2.0); } return out; } // Characteristic Function for C dcmplx CharFuncC(double u, double s0, double K, double r, double q, double sigma, double t, int N) { return exp(M_i*((log(s0) - log(K)) + (r - q - sigma*sigma / 2.0)*t)*u - sigma*sigma * u*u * t / 2.0); } //--------------------------------------------------------------- // Main int main(int, char**) { double alpha[] = { -1.2, -1.5, -5.0, -10.0 }; double eta; double s0; double r; double q; double sigma; double t; double K; int pow2; int N; int m_atm = 0; FILE *fp; if (!(fp = fopen("inputa.txt", "r"))){ printf("File \'inputa\' could not be opened!"); exit(-1); } fscanf(fp, "%lg%lg%lg%lg%lg%lg%d", &eta, &s0, &r, &q, &sigma, &t, &pow2); double a; double b; double v; double abs_ab[] = { 2.0, 5.0, 10.0, 20.0 }; double sum =0; for (pow2 = 7; pow2 <= 10; ++pow2){ N = (int)pow(2.0, pow2); double *nu = (double*)malloc(sizeof(double)* N);// nu * (b - a) / M_PI; double *Vp = (double*)malloc(sizeof(double)* N); double *chi = (double*)malloc(sizeof(double)* N); double *phi = (double*)malloc(sizeof(double)* N); dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N); for (int i = 0; i < 4; ++i){ b = abs_ab[i]; a = -b; cout << "N:" << N << ", (a, b): (" << a << ", " << b << ")" << endl; for (K = 1600; K <= 1900; K += 100){ for (int k = 0; k < N; ++k){ nu[k] = k * M_PI / (b - a); // chi for Put with (c,d) = (a,0) chi[k] = 1.0 / (1.0 + nu[k] * nu[k]) * (cos(nu[k] * (-a)) - exp(a) + nu[k] * sin(nu[k] * (-a))); // phi for Put with (c,d) = (a,0) phi[k] = sin(nu[k] * (-a)) * (1.0 / nu[k]); phi[0] = -a; // COS expasion coeff V for Put Vp[k] = (2.0 / (b - a)) * K * (-chi[k] + phi[k]); // Characteristic Function for C, (just different argument inputs) nu[k] = k * M_PI / (b - a); Phi[k] = CharFuncC(nu[k], s0, K, r, q, sigma, t, N); sum += real(Phi[k] * exp(-M_i*(k*M_PI) * a / (b - a)))*Vp[k]; if (k == 0) sum /= 2.0; } v = exp(-r*t)*sum; cout << "strike=" << K << ", price=" << v << endl; sum = 0.0; } } } system("Pause"); return 0; }

  • ガウスの消去法のプログラム

    ガウスの消去法(部分ピボット選択)のプログラムを組んでみたつもりなのですが上手くいきません。 間違いだらけだと思いますがどうかアドバイスをして頂けませんでしょうか? #include <stdio.h> double main(void){ int i,j,k,N,M,m; double A[N+1][N+1][N+1],B[j],S,X[N+1]; printf("次数の入力。\n"); scanf("%d",&N); for(k=1;k<=N;k++){ for(i=1;i<=N;i++){ for(j=1;j<=N+1;j++){ A[k][i][j]=0; } } } for(i=1;i<=N;i++){ for(j=1;j<=N+1;j++){ printf("係数の入力.\n A[1][%d][%d]?\n",i,j); scanf("%f",&A[1][i][j]); } } for(k=2;k<=N;k++){ if(A[k-1][k-1][k-1]=0){ for(M=k;M<=N;M++){ if(A[k-1][M][k-1]!=0){ for(j=k-1;j<=N+1;j++){ B[j]=A[k-1][k-1][j]; A[k-1][k-1][j]=A[k-1][M][j]; A[k-1][M][j]=B[j]; } goto abc; } else {printf("解は無い\n");} } } abc: for(i=k;i<=N;i++){ for(j=k;j<=N+1;j++){ A[k][i][j]=A[k-1][i][j]-(A[k-1][i][k-1]/A[k-1][k-1][k-1])*A[k-1][k-1][j]; } } X[N]=A[N][N][N+1]/A[N][N][N]; printf("解X(N)は %f 。\n",X[N]); for(k=N-1;k>=1;k--){ S=0; for(m=N;m>=k+1;m--){ S+=A[k][k][m]*X[m]; } X[k]=(A[k][k][N+1]-S)/A[k][k][k]; printf("解X(%d)は %f 。\n",k,X[k]);} } }

  • c++について質問です

    c++について質問です. 以下を実行するとerror C2601: 'f' : ローカル関数の定義が正しくありません。 と出てしまいます. 原因はmainの中に積分計算の関数を入れているせいだと思うのですが,どのように解決すればよいでしょうか? 計算の都合上,積分はmain関数内で行う必要があります. お時間のある方,よろしくお願いします. //hello2.cpp #define _COMPLEX_DEFINED #include <iostream> #include <string> #include "complex.h" #include "bessel.h" #include <math.h> #include <iostream.h> #include <cmath> #include <stdio.h> #define RADIAN(ARC) ((ARC) * 3.14159 / 180) using namespace std; int main(void) { const double pi=3.141592654; const double I0=2829; const double r0=0; const double z=0; const double B1=6.07*pow(10,7); int k; double omega,freq,x; double R,Rk; double lambdag,ag; double lambda1,a1,l1; double lambda2,a2,l2; double p,p2,pg; double a11,a21,ag1,Rk1,l11,l21,p11,p21; double Km,Kn,Kg,am; complex r1,g,S2; complex sigma1,sigma2,sigmag; complex G,P,B,H; complex RR,NI,NI2,NI3,BE; double ANS,sumRIm,sumRRe; int x1; double r,r00,r001,r01; double imag(),real(); printf("接触熱抵抗"); scanf("%lf",&R); printf("加熱光半径(10^-6)×"); scanf("%lf",&Rk1); Rk=Rk1*pow(10,-6); printf("1層目熱伝導率"); scanf("%lf",&lambda1); printf("1層目温度伝導率(10^-6)×"); scanf("%lf",&a11); a1=a11*pow(10,-6); printf("1層目厚み(10^-6)×"); scanf("%lf",&l11); l1=l11*pow(10,-6); printf("2層目熱伝導率"); scanf("%lf",&lambda2); printf("2層目温度伝導率(10^-6)×"); scanf("%lf",&a21); a2=a21*pow(10,-6); printf("2層目厚み(10^-6)×"); scanf("%lf",&l21); l2=l21*pow(10,-6); printf("バッキング熱伝導率"); scanf("%lf",&lambdag); printf("バッキング温度伝導率(10^-6)×"); scanf("%lf",&ag1); ag=ag1*pow(10,-6); printf("1層目半径境界(10^-6)×"); scanf("%lf",&p11); p=p11*pow(10,-6); printf("2層目半径境界(10^-6)×"); scanf("%lf",&p21); p2=p21*pow(10,-6); printf("バッキング半径境界"); scanf("%lf",&pg); printf("am範囲"); scanf("%d", &x1); FILE *file; file = fopen("test929.csv","w"); for (x=1; x<=7; x+=0.1) { freq=pow(10,x); omega=2*pi*freq; sumRIm=0; sumRRe=0; for (int i=1; i<=x1; i++) { am=(double)i; Km=am/p; Kn=am/p2; Kg=am/pg; sigma1=cpow(pow(Km,2)+complex(0,omega/a1),0.5); sigma2=cpow(pow(Kn,2)+complex(0,omega/a2),0.5); sigmag=cpow(pow(Kg,2)+complex(0,omega/ag),0.5); r1=B1/sigma1; g=(lambdag*sigmag)/(lambda1*sigma1); S2=(lambda2*sigma2)/(lambda1*sigma1); G = (1/(2*(S2+g)))*((S2-g)*(-1+R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(1+R*lambda2*sigma2+S2)); P = (1/(2*(S2+g)))*((S2-g)*(1-R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1-R*lambda2*sigma2+S2)); B = (1/(2*(S2+g)))*((S2-g)*((1-R*lambda2*sigma2)*r1+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1*(1+R*lambda2*sigma2)*r1+S2)); H = ((g+r1)*cexp(sigma1*l1)*G+(1-g)*cexp(-1*B1*l1)*B)/((1-g)*cexp(-1*sigma1*l1)*P+(1+g)*cexp(sigma1*l1)*G); r=0; r00=0; r001=1; r01=0.00005; BE=1; NI= exp(-1*(2*pow(r01,2)/pow(Rk,2)))*j0(Km*r)*r01; NI2=2*pi*r001*j0(Km*r00); NI3=cpow(j1(am),-2); RR= (B1*I0/(2*lambda1*(cpow(sigma1,2)-pow(B1,2))))*2*pow(p,-2)*cpow(BE,-2)*NI*(1/(1-g))*(-2*H+r1+1)*NI2*cexp(sigmag*z); sumRIm+= RR.imag(); sumRRe+= RR.real(); } ANS=-atan((sumRIm/sumRRe))*(180/pi); printf("%f\n",ANS); fprintf(file,"%f\n",ANS); } /* nを大きくすると精度が上がる */ const int n = 100000; const double Kmm=100; /* 積分する関数 f(w) */ double f(double w){ return 2*pi*w*j0(Kmm*w); } /* 積分の範囲 w0からw_max */ const double w0 = 0; // x0を0としないのは、xが0の時に発散するため const double w_max = 0.4; int kk; /* シンプソン法による積分計算 */ double simpson(double w0,double w_max){ double delta = (w_max - w0)/n; double a; a = f(w0); a += f(w0 + delta * n); int i; for(i=1; i<n; i+=2){ a += 4.0 * f(w0 + delta * i); } for(i=2; i<n; i+=2){ a += 2.0 * f(w0 + delta * i); } return a*delta/3.0; } printf("%f\n",simpson(w0,w_max)); scanf("%d",&k);// fclose(file); return 0; }

  • C++の繰り返し

    たびたび申し訳ありません.C++総和の質問です Microsoft Visual Basic 6.0の質問です. 以下の用に繰り返しの総和計算を書いたのですが,それぞれの総和が計算されず,例えば最もシンプルな総和sumも0となってしまう状態です.(他の総和も全て0になります) 何か間違いなどありますでしょうか? //hello2.cpp #define _COMPLEX_DEFINED #include <iostream> #include <string> #include "complex.h" #include "bessel.h" #include <math.h> #include <cmath> #include <stdio.h> #define RADIAN(ARC) ((ARC) * 3.14159 / 180) using namespace std; int main(void) { const double pi=3.141592654; const double I0=2829; const double r0=0; const double z=0; const double B1=6.07*pow(10,7); int k; double omega,freq,x; double R,Rk; double lambdag,ag; double lambda1,a1,l1; double lambda2,a2,l2; double p,p2,pg; double a11,a21,ag1,Rk1,l11,l21,p11,p21; double Km,Kn,Kg,am; complex r1,g,S2; complex sigma1,sigma2,sigmag; complex G,P,B,H; complex RR,NI,NI2,NI3,BE; double ANS,sumRIm,sumRRe,sumKm,sum; int x1; double r,r00,r001,r01; double imag(),real(); printf("接触熱抵抗"); scanf("%lf",&R); printf("加熱光半径(10^-6)×"); scanf("%lf",&Rk1); Rk=Rk1*pow(10,-6); printf("1層目熱伝導率"); scanf("%lf",&lambda1); printf("1層目温度伝導率(10^-6)×"); scanf("%lf",&a11); a1=a11*pow(10,-6); printf("1層目厚み(10^-6)×"); scanf("%lf",&l11); l1=l11*pow(10,-6); printf("2層目熱伝導率"); scanf("%lf",&lambda2); printf("2層目温度伝導率(10^-6)×"); scanf("%lf",&a21); a2=a21*pow(10,-6); printf("2層目厚み(10^-6)×"); scanf("%lf",&l21); l2=l21*pow(10,-6); printf("バッキング熱伝導率"); scanf("%lf",&lambdag); printf("バッキング温度伝導率(10^-6)×"); scanf("%lf",&ag1); ag=ag1*pow(10,-6); printf("1層目半径境界(10^-6)×"); scanf("%lf",&p11); p=p11*pow(10,-6); printf("2層目半径境界(10^-6)×"); scanf("%lf",&p21); p2=p21*pow(10,-6); printf("バッキング半径境界"); scanf("%lf",&pg); printf("am範囲"); scanf("%lf",&x1); x=2; freq=pow(10,x); omega=2*pi*freq; sum=0; sumRIm=0; sumRRe=0; sumKm=0; for (int i=1; i<=x1; i++) { sum+=i; am=(double)i; Km=am/p; Kn=am/p2; Kg=am/pg; sigma1=cpow(pow(Km,2)+complex(0,omega/a1),0.5); sigma2=cpow(pow(Kn,2)+complex(0,omega/a2),0.5); sigmag=cpow(pow(Kg,2)+complex(0,omega/ag),0.5); r1=B1/sigma1; g=(lambdag*sigmag)/(lambda1*sigma1); S2=(lambda2*sigma2)/(lambda1*sigma1); G = (1/(2*(S2+g)))*((S2-g)*(-1+R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(1+R*lambda2*sigma2+S2)); P = (1/(2*(S2+g)))*((S2-g)*(1-R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1-R*lambda2*sigma2+S2)); B = (1/(2*(S2+g)))*((S2-g)*((1-R*lambda2*sigma2)*r1+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1*(1+R*lambda2*sigma2)*r1+S2)); H = ((g+r1)*cexp(sigma1*l1)*G+(1-g)*cexp(-1*B1*l1)*B)/((1-g)*cexp(-1*sigma1*l1)*P+(1+g)*cexp(sigma1*l1)*G); r=0; r00=0; r001=1; r01=0.00005; BE=1; NI= exp(-1*(2*pow(r01,2)/pow(Rk,2)))*j0(Km*r)*r01; NI2=2*pi*r001*j0(Km*r00); NI3=cpow(j1(am),-2); RR= (B1*I0/(2*lambda1*(cpow(sigma1,2)-pow(B1,2))))*2*pow(p,-2)*cpow(BE,-2)*NI*(1/(1-g))*(-2*H+r1+1)*NI2*cexp(sigmag*z); sumKm+= Km; sumRIm+= RR.imag(); sumRRe+= RR.real(); } ANS=-atan((sumRIm/sumRRe)*(180/pi)); printf("%e\n",R*Rk); printf("%e\n",Rk); printf("%e\n",lambda1); printf("%e\n",B1); printf("%e\n",Km); printf("%e\n",sigmag); printf("%e\n",g); printf("%e\n",r1); printf("%e\n",j0(am)); printf("%e\n",G); printf("%e\n",P); printf("%e\n",B); printf("%e\n",H); printf("%e\n",NI3); printf("%e",RR.real()); printf("+"); printf("%e",RR.imag()); printf("i""\n"); printf("%e\n",sumKm); printf("%e\n",sumRRe); printf("%e\n",sum); printf("%e\n",ANS); scanf("%d",&k);// return 0; }

  • 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]); } } 正規乱数を発生させたいんですけど、変な値が出てしまいます。 正しくはどうすれば良いか教えてもらえませんか?

  • C++総和の質問です

    Microsoft Visual Basic 6.0の質問です. 色々試してもうまくいかない箇所があるので質問させていただきます. この式の中で,am=1となっているものをam=1からam=x(xはscanfで入力) とし,最後のRRR上で1からxまでのRRRの総和を計算させることは可能でしょうか? 基本的な総和と違い,RRRより前に計算しているKmやKn上にそれぞれのamを代入し,最終的にRRRの総和を計算するという形にするやりかたがわからない状態です. プログラムが無駄に長くて申し訳ありませんが,わかる方いらっしゃいましたらよろしくお願いいたします. 以下プログラムです //hello2.cpp #define _COMPLEX_DEFINED #include <iostream> #include <string> #include "complex.h" #include "bessel.h" #include <math.h> #include <cmath> #include <stdio.h> #define RADIAN(ARC) ((ARC) * 3.14159 / 180) using namespace std; int main(void) { const double pi=3.141592654; const double I0=2829; const double r0=0; const double z=0; const double B1=6.07*pow(10,7); int k; double omega,freq,x; double R,Rk; double lambdag,ag; double lambda1,a1,l1; double lambda2,a2,l2; double p,p2,pg; double a11,a21,ag1,Rk1,l11,l21,p11,p21; double Km,Kn,Kg,am; complex r1,g,S2; complex sigma1,sigma2,sigmag; complex G,P,B,H; complex RR,NI,NI2,NI3,BE,RRR; double r,r00,r001,r01; double imag(),real(); printf("接触熱抵抗"); scanf("%lf",&R); printf("加熱光半径(10^-6)×"); scanf("%lf",&Rk1); Rk=Rk1*pow(10,-6); printf("1層目熱伝導率"); scanf("%lf",&lambda1); printf("1層目温度伝導率(10^-6)×"); scanf("%lf",&a11); a1=a11*pow(10,-6); printf("1層目厚み(10^-6)×"); scanf("%lf",&l11); l1=l11*pow(10,-6); printf("2層目熱伝導率"); scanf("%lf",&lambda2); printf("2層目温度伝導率(10^-6)×"); scanf("%lf",&a21); a2=a21*pow(10,-6); printf("2層目厚み(10^-6)×"); scanf("%lf",&l21); l2=l21*pow(10,-6); printf("バッキング熱伝導率"); scanf("%lf",&lambdag); printf("バッキング温度伝導率(10^-6)×"); scanf("%lf",&ag1); ag=ag1*pow(10,-6); printf("1層目半径境界(10^-6)×"); scanf("%lf",&p11); p=p11*pow(10,-6); printf("2層目半径境界(10^-6)×"); scanf("%lf",&p21); p2=p21*pow(10,-6); printf("バッキング半径境界"); scanf("%lf",&pg); x=2; freq=pow(10,x); omega=2*pi*freq; am=1; Km=am/p; Kn=am/p2; Kg=am/pg; sigma1=cpow(pow(Km,2)+complex(0,omega/a1),0.5); sigma2=cpow(pow(Kn,2)+complex(0,omega/a2),0.5); sigmag=cpow(pow(Kg,2)+complex(0,omega/ag),0.5); r1=B1/sigma1; g=(lambdag*sigmag)/(lambda1*sigma1); S2=(lambda2*sigma2)/(lambda1*sigma1); G = (1/(2*(S2+g)))*((S2-g)*(-1+R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(1+R*lambda2*sigma2+S2)); P = (1/(2*(S2+g)))*((S2-g)*(1-R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1-R*lambda2*sigma2+S2)); B = (1/(2*(S2+g)))*((S2-g)*((1-R*lambda2*sigma2)*r1+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1*(1+R*lambda2*sigma2)*r1+S2)); H = ((g+r1)*cexp(sigma1*l1)*G+(1-g)*cexp(-1*B1*l1)*B)/((1-g)*cexp(-1*sigma1*l1)*P+(1+g)*cexp(sigma1*l1)*G); r=0; r00=0; r001=1; r01=0.00005; BE=1; NI= exp(-1*(2*pow(r01,2)/pow(Rk,2)))*j0(Km*r)*r01; NI2=2*pi*r001*j0(Km*r00); NI3=cpow(j1(am),-2); RR= (B1*I0/(2*lambda1*(cpow(sigma1,2)-pow(B1,2))))*2*pow(p,-2)*cpow(BE,-2)*NI*(1/(1-g))*(-2*H+r1+1)*NI2*cexp(sigmag*z); RRR=-atan(((RR.imag())/(RR.real()))*(180/pi)); printf("%e\n",R*Rk); printf("%e\n",Rk); printf("%e\n",lambda1); printf("%e\n",B1); printf("%e\n",sigma1); printf("%e\n",sigmag); printf("%e\n",g); printf("%e\n",r1); printf("%e\n",j0(am)); printf("%e\n",G); printf("%e\n",P); printf("%e\n",B); printf("%e\n",H); printf("%e\n",NI3); printf("%e",RR.real()); printf("+"); printf("%e",RR.imag()); printf("i""\n"); printf("%e\n",RRR); scanf("%d",&k);// return 0; }

  • 正規分布するプログラムを教えてください。

    正規分布する乱数プログラムを作りたいのですが、うまく作れません・・。 プログラムソースは長くなりますので見ていただかなくても結構なのですが、下記のようなプログラムを実行したところ、実行結果下記になり、正規分布にはなりませんでした・・。 色々ネットで調べたものの理解できないのでどなたか教えていただけないでしょうか>< 正規分布を利用して、例えば50~100位の間に分布する乱数を生成したりしたいのです。。。 #include <math.h> #include <time.h> #include <stdlib.h> #include <stdio.h> #define PI 3.14159265358979323846264 double p_nor(){ double rnd,t,u,r1,r2; rnd=rand()%10000/10000.0; t=sqrt(-2.0 * log(1-rnd)); u=2*PI*rnd; r1=t*sin(u); return r1; } int main(){ int i,bunpu[30]={}; double p,min=0,max=0,total=0; srand((unsigned)time(NULL)); for(i=0;i<100000;i++){ p=p_nor(); for(int j=0;j<30;j++){ if(p>-2.0+0.1*j && p<=-1.9+0.1*j) bunpu[j]++; } if(min>p)min=p; if(max<p)max=p; total+=p; } printf("min:%f max%f 平均%f\n",min,max,total/100000); for(int j=0;j<30;j++){ for(i=0;i<bunpu[j]/200;i++){ printf("*"); } printf("\n"); } return 0; } 実行結果 min:-1.711381 max0.803275 平均-0.247841 **************** ************************************ ******************** **************** ************** ************ *********** ********** ********** ********* ********* ******** ******** ******** ******** ******** ******** ******** ************************************* ************************* *********************** *********************** ************************ **************************** ******************************** **************************************************************** ***********