アプリ版:「スタンプのみでお礼する」機能のリリースについて

ある値をある検出器に入力したときに出力結果がその入力したを中心にガウス関数のように広がってしまう場合を考え,ある関数の値を小刻みに入力したとき、その関数が出力されたときそれぞれ値のガウス関数の広がりにより重ね合わされてどのように見えるか数値計算してみようと思い、以下のソースコードを書いて見ました。行列で考えてそれぞれの値の寄与を足しあげて見ようとしたのしたのですが、実行結果をみると明らかにおかしい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.522.0512
0.623.8139
0.718.9
0.814.9642
0.912.1864
110.1512
1.18.60991
1.27.4112
1.36.45833
1.45.68688
1.55.05253
1.64.52387
1.74.07814
1.83.69846
1.93.37209
23.08926
2.12.84239
2.22.62547
2.32.43375
2.42.26337
2.52.1112
2.61.66592
2.71.85166
2.81.7404
2.91.63941
31.54742
3.11.46337
3.21.38635
3.31.31558
3.44.47979e+30
3.51.19017
3.61.13444
3.71.08275
3.81.0347
3.90.989949
40.9482
4.10.909181
4.20.872652
4.30.838401
4.40.806238
4.50.775991
4.60.747509
4.70.720652
4.80.695296
4.90.671329
50.648648
5.10.627161
5.20.606783
5.30.587437
5.40.569053
5.50.551566
5.60.534917
5.70.519053
5.80.503924
5.90.489483
60.475689
6.10.462502
6.20.449887
6.30.437809
6.40.426239
6.50.415146
6.60.404506
6.70.394292
6.80.384482
6.90.375054
70.365988
7.10.357265
7.20.348868
7.30.34078
7.40.332986
7.50.325471
7.60.318222
7.70.311226
7.80.304472
7.90.297947
80.291642
8.10.285546
8.20.27965
8.30.273945
8.4-0.0404521
8.50.263075
8.60.257894
8.70.252874
8.80.248007
8.90.243288
90.238709
9.17.46629e+19
9.20.229953
9.30.225764
9.40.221696
9.50.217743
9.60.2139
9.70.210164
9.80.206531
9.90.202996
100.199557
10.10.196209
10.20.192868
10.30.185672
10.40.140717

A 回答 (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を代入する
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/10/08 14:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!