teratail header banner
teratail header banner
質問するログイン新規登録
C

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

Q&A

解決済

2回答

849閲覧

磁力の関係についてのシュミレーションができません。(訂正版)

riui

総合スコア4

C

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

0グッド

0クリップ

投稿2023/01/16 11:21

編集2023/01/16 12:47

0

0

前提

下のプログラムを立ててこれを利用してシュミレーションをしてみたいのですが、エラーの内容や改善方法がよくわかりません。
助けて欲しいです。
何卒宜しくお願い致します。

#include<stdio.h> #include<stdlib.h> #include<math.h> #define N (20) int main(){ double J = 2.0e-21; double E1,E2,T,P,kbT,N; int i,j,n,p; int m[N][N]; //磁化を代入する for( j = 0; j < N; j++){ for( i = 0; i < N; i++){ m[i][j]=1; //ランダム磁化① m[i][j]=(rand()%2)*2-1; //ランダム磁化② if((double)rand() / RAND_MAX > 0.5)m[i][j] = 1; else m[i][j]=-1; } } //エネルギー計算 E1=0.0; for(j=0;j<N;j++){ for(i=0;i<N;i++){ if(i < N-1)E1 += -J*m[i][j]*m[i+1][j]; if(j < N-1)E1 += -J*m[i][j]*m[i][j+1]; } } //ランダムで磁化を変化させるサイトを決定 i = rand()%20; j = rand()%20; m[i][j] = -m[i][j]; //エネルギー計算 E2=0.0; for(j=0;j<N;j++){ for(i=0;i<N;i++){ if(i < N-1)E2 += -J*m[i][j]*m[i+1][j]; if(j < N-1)E2 += -J*m[i][j]*m[i][j+1]; } } for(T=10;T<500;T=T+10){ kbT = kbT * (double)T; p = 1.0/(1.0+exp(-(E1-E2)/(kbT) )); printf("% lf %e %e %e\n",(double)T,P,E1,E2); } }

実現したいこと

計算値を用いたgnuplotでグラフを作成したいです。

エラーメッセージ 2.c: In function 'main': 2.c:4:12: error: expected identifier or '(' before numeric constant #define N (20) ^~ 2.c:8:23: note: in expansion of macro 'N' double E1,E2,T,P,kbT,N; ^

試したこと

1.温度300K, 500Kにおけるステップ数(横軸)と磁化(縦軸)のグラフを作成しなさい。
2. 上記条件において磁化(縦軸)-温度(横軸)のグラフを作成しなさい。
3. “2”において,”磁化の平均値”をどのように導出したか解説しなさい。
4. 交換エネルギーを変化させてシミュレーションし結果を考察しなさい。

補足情報

条件
1.磁性体のセル数を50 x 50 とする。
2. 交換エネルギーJ = 2.0 x 10^-21[ J]
3. ボルツマン定数kB = 1.38 x 10^-23[ J/K]
4. 温度は10K~500Kまで10Kごと。
5. 全てのセルのmの平均値の絶対値を磁化とする。(最大値+1)

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

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

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

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

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

episteme

2023/01/18 11:12

× シュミレーション 〇 シミュレーション
guest

回答2

0

Text

1#defineでNを定義したら、intとしてNを定義してはいけない。 2Pがint, double型として2回定義されている。 3if((double)rand() RAND_MAX > 0.5)m[i][j]-1; はおそらく(double)rand() / RAND_MAXの間違い。 4新たな変数kbTの型を指定しなければならない。 5pも定義しなければならない。 6math.hをincludeしなければならない。

投稿2023/01/16 11:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2023/01/16 11:52

勉強頑張ってください。
riui

2023/01/16 12:45

ご回答ありがとうございます! 頑張ります!
退会済みユーザー

退会済みユーザー

2023/01/16 13:34

👍
guest

0

ベストアンサー

c

1#define N (20) 2... 3 double E1,E2,T,P,kbT,N;

N(20) に置き換えろ、と指定されていますので、下の行は double E1,E2,T,P,kbT,(20); となり文法エラーです。下の行の,N が不要に見えます。

Cではマクロ名は大文字、変数は小文字で始まる名前にするのが一般的です。マクロ名と変数名の衝突はコンパイラでは検出できないので、名前付けのルールで未然に防ぎます。

投稿2023/01/16 21:32

編集2023/01/17 06:20
int32_t

総合スコア21933

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

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

riui

2023/01/17 09:37

ご丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問