質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

1575閲覧

c言語でのサンプル数分のx自乗の平均とtの関係のグラフを求めたい。

Okuhira007

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/09/30 06:43

編集2020/09/30 08:10

プログラムのフローチャートの通りにプログラムを組んだのですが、どこが間違っているのかいまいちわからなくて困っています。ran1.cとgasdev.cは正常にうごきます。langevin3.cのforの中がいまいちわかりません。
エラーは出ませんが、望んでいる結果と違う結果となっています。望んでいる結果は通常の目盛り(片対数や両対数ではない)で線形の関係になります。具体的には、[0, 1]の範囲でy=xを描きます。
追記
修正しましたが、実行の際に動作が停止してしまいました。

c言語

1コード 2//langevin3.cのプログラム。 3#include <stdio.h> 4#include <math.h> 5#include "gasdev.c" 6 7double gasdev(long *idum); 8 9int main() 10{ 11 FILE *fp; 12 fp = fopen("langevin3.dat", "w"); 13 long idum; 14 float F, ehta, gamma, kT, h, ave; 15 int i, im, j, nsmp; 16 float t, g, a, x2; 17 float x[100]; 18 nsmp = 100; 19 idum = -123456789; 20 F = 0; 21 im = 1000; 22 h = 1.0e-3; 23 kT = 298 * 1.381e-23; 24 ehta = 0.89e-3; 25 gamma = 6 * acos(-1.0) * ehta * 0.5e-6; 26 a = sqrt(2*kT*h/gamma); 27 t = 0.0; 28 for (i=1;i<=im;i++) { 29 x[j] = 0.0; 30 for (j=1;j<=nsmp;j++){ 31 x[j] += a*gasdev(&idum); 32 if (i % 50 == 0) { 33 x2 = 0.0; 34 x2 += x[j]*x[j]; 35 ave = x2/nsmp; 36 fprintf(fp, "%f\t%e\n", t, ave * 1.0e12); 37 } else { 38 ; 39 } 40 t += h; 41 } 42 } 43 fclose(fp); 44}

c言語

1コード 2//ran1.cのプログラム 3#define IA 16807 4#define IM 2147483647 5#define AM (1.0/IM) 6#define IQ 127773 7#define IR 2836 8#define NTAB 32 9#define NDIV (1+(IM-1)/NTAB) 10#define EPS 1.2e-7 11#define RNMX (1.0-EPS) 12 13double ran1(long *idum) 14{ 15 long j; 16 long k; 17 static long iy=0; 18 static long iv[NTAB]; 19 double temp; 20 21 if (*idum <= 0 || !iy) { 22 if (-(*idum) < 1) *idum=1; 23 else *idum = -(*idum); 24 for (j=NTAB+7;j>=0;j--) { 25 k=(*idum)/IQ; 26 *idum=IA*(*idum-k*IQ)-IR*k; 27 if (*idum < 0) *idum += IM; 28 if (j < NTAB) iv[j] = *idum; 29 } 30 iy=iv[0]; 31 } 32 k=(*idum)/IQ; 33 *idum=IA*(*idum-k*IQ)-IR*k; 34 if (*idum < 0) *idum += IM; 35 j=iy/NDIV; 36 iy=iv[j]; 37 iv[j] = *idum; 38 if ((temp=AM*iy) > RNMX) return RNMX; 39 else return temp; 40} 41#undef IA 42#undef IM 43#undef AM 44#undef IQ 45#undef IR 46#undef NTAB 47#undef NDIV 48#undef EPS 49#undef RNMX

c言語

1コード 2//gasdev.cのプログラム 3#include <math.h> 4#include "ran1.c" 5 6double gasdev(long *idum) 7{ 8 double ran1(long *idum); 9 static int iset = 0; 10 static double gset; 11 double fac, rsq, v1, v2; 12 13 if (iset == 0) { 14 do { 15 v1 = 2.0*ran1(idum) - 1.0; 16 v2 = 2.0*ran1(idum) - 1.0; 17 rsq = v1*v1 + v2*v2; 18 } while (rsq >= 1.0 || rsq == 0.0); 19 fac = sqrt(-2.0*log(rsq)/rsq); 20 gset = v1*fac; 21 iset = 1; 22 return v2*fac; 23 } else { 24 iset = 0; 25 return gset; 26 } 27}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C

1float x[100];

初期値を設定していないため、x[1]以外は不定値です。


xをすべて0初期化したいなら以下のようにするだけで良いです。

C

1float x[100] = { 0 };

投稿2020/09/30 07:24

編集2020/09/30 09:19
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Okuhira007

2020/09/30 07:46

x[j] = 0.0;をjのforループの直後に追加しましたが、結果はうまくいきませんでした。 お忙しい中、ありがとうございます。
e-watt

2020/09/30 08:01

そこで0を代入すると、次の行で積算していた部分が台無しになりませんか? x[j] += a*gasdev(&idum); // 0.0 にされた要素に加算(≒実質的に代入) 素直にループに入る前に初期化しましょう(独立にループを書く)
Okuhira007

2020/09/30 08:07

了解しました。ありがとうございます。
SHOMI

2020/09/30 09:25 編集

for (i=1;i<=im;i++) { x[j] = 0.0; for (j=1;j<=nsmp;j++){ x[j]に代入後にjが変わるのでこれでは意味がないです。 jは1周目は不定値、2周目以降はnsmp+1になっています。 はじめにxの全要素を0初期化したいだけなら回答に追記した方法で良いです。
Okuhira007

2020/09/30 09:45

解決しました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問