質問編集履歴
9
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,315 +1,69 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
|
-
|
3
2
|
温度分布の計算のプログラムをディリクレ条件のガウス・ザイデル法を用いて数値計算をし、温度分布のグラフを作成したい。
|
4
|
-
|
5
|
-
|
6
3
|
|
7
4
|
ガウス・ザイデル法を用いて、ある行列の値が収束していくようなプログラムを作成します。(main_01.cを参照)
|
8
5
|
|
9
|
-
|
10
|
-
|
11
6
|
その数値計算を行った後にその行列をdat形式(g-s_result.datを参照)で出力し、gnuplotで温度分布のグラフを描画します。(g-s_method.pltを参照)
|
12
7
|
|
13
|
-
|
14
|
-
|
15
8
|
### 発生している問題・エラーメッセージ
|
16
|
-
|
17
9
|
現在つまづいていている点として、main_01.cの実行後に出力されるdat形式のファイルをgnuplotでpm3dを用いてsplotしても以下のようにグラフが全く表示されない点です。
|
18
|
-
|
19
10
|
![イメージ説明](de9fe11cc93958b27baa58d5384cff36.jpeg)
|
20
11
|
|
21
|
-
|
22
|
-
|
23
12
|
またgnuplot上で以下のエラーが表示されます。
|
24
|
-
|
25
13
|
```
|
26
|
-
|
27
14
|
Warning: Single isoline (scan) is not enough for a pm3d plot.
|
28
|
-
|
29
15
|
Hint: Missing blank lines in the data file? See 'help pm3d' and FAQ.
|
30
|
-
|
31
16
|
```
|
32
|
-
|
33
17
|
###追記1
|
34
|
-
|
35
18
|
描画結果1
|
36
|
-
|
37
19
|
![イメージ説明](d8bc8fe43f3cd4d5d85acdb27cf1dbd6.jpeg)
|
38
|
-
|
39
20
|
描画できるようにはなりましたが、直線になってしまいます。
|
40
21
|
|
41
|
-
|
42
|
-
|
43
22
|
###追記2
|
44
|
-
|
45
23
|
描画結果2
|
46
|
-
|
47
24
|
配列の描画なので`splot 'XXX.dat' matrix`とすれば描画できる。
|
48
|
-
|
49
25
|
![イメージ説明](998dc7155b217d47101061653dd60881.jpeg)
|
50
|
-
|
51
26
|
軸の範囲を0<=x<=2、0<=y<=1にしたいが、描画範囲をそのように指定すると、当然だが範囲が狭まるので正しい表示にはならない。
|
52
|
-
|
53
27
|
軸の範囲が0<=x<=200、0<=y<=100になっているのは配列(行列)サイズがa[100][200]となっているためですが、軸は0<=x<=2、0<=y<=1としなければいけない制約があります。また、格子間隔(離散した間隔)が0.01という制約もあるためa[1/0.01][2/0.01]としております。この配列サイズを維持したまgnuplot上での軸を0<=x<=2、0<=y<=1と表示するにはどうすればよいのでしょうか。
|
54
28
|
|
55
|
-
|
56
|
-
|
57
29
|
### 試したこと
|
58
|
-
|
59
30
|
pm3dを用いてグラフが表示されない原因をいろいろとインターネットで調べたところ、出力されるdatファイルに問題があると思います。
|
60
31
|
|
61
|
-
|
62
|
-
|
63
32
|
[参照サイト](http://takeno.iee.niit.ac.jp/~shige/unix/gnuplot/faq/faq-j.html#SECTION000510000000000000000)
|
64
|
-
|
65
33
|
このサイトの
|
66
|
-
|
67
34
|
> 3.10 pm3d によるデータファイルの splot で何も表示されません
|
68
35
|
|
69
|
-
|
70
|
-
|
71
36
|
によるとdatファイルに2つのつながっている線 (孤立線) を分離する空行がないと描画できないとありましたが、今回私が作成しようとしているプログラムで出力されるdatファイルのどのタイミングで空行を入れるのかわかりません。つきましては、プログラムmain_01.cにてdatファイルを出力している箇所に適切な空行を入れる命令をご提示いただけますでしょうか。
|
72
|
-
|
73
37
|
または、main_01.cのアルゴリズムが間違えていましたら、ご指摘いただければ幸いです。
|
74
38
|
|
75
|
-
|
76
|
-
|
77
39
|
かれこれ4時間以上考えたり、インターネットで調べてみましたが解決できませんでした。よろしくお願いいたします。
|
78
|
-
|
79
40
|
### 該当のソースコード
|
80
41
|
|
81
42
|
|
82
43
|
|
83
|
-
```
|
44
|
+
```gnuplot
|
45
|
+
cd 'C:\Users\%USERNAME%\Desktop\gnuplot'
|
84
46
|
|
85
|
-
//main_01.c
|
86
|
-
|
87
|
-
//G-S法
|
88
|
-
|
89
|
-
#define _CRT_SECURE_NO_WARNINGS
|
90
|
-
|
91
|
-
#include <stdio.h>
|
92
|
-
|
93
|
-
#include <stdlib.h>
|
94
|
-
|
95
|
-
#include <math.h>
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
//#define dt (0.01) //格子間隔
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
#define N (100) // 1/dt
|
104
|
-
|
105
|
-
#define M (200) // 2/dt
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
#define cycle (50000) //サイクル数
|
110
|
-
|
111
|
-
#define eps (pow(10,-12)) //収束判定
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
47
|
+
set pm3d
|
116
|
-
|
117
|
-
{
|
118
|
-
|
119
|
-
//datファイルに書き込む
|
120
|
-
|
121
|
-
FILE* fp1;
|
122
|
-
|
123
|
-
double* file1 = "g-s_result.dat";
|
124
|
-
|
125
|
-
fp1 = fopen(file1, "w");
|
126
|
-
|
127
|
-
if (fp1 == NULL)
|
128
|
-
|
129
|
-
{
|
130
|
-
|
131
|
-
printf("%f file cannot open!\n", file1);
|
132
|
-
|
133
|
-
|
48
|
+
set pm3d map
|
134
|
-
|
49
|
+
set pm3d interpolate 5, 5
|
135
|
-
|
50
|
+
set ticslevel 0
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
51
|
+
#set cbrange[0:1]
|
140
|
-
|
141
|
-
|
52
|
+
#set xrange [0:200]
|
142
|
-
|
143
|
-
fprintf(fp1, "%d\t", M); //一番左上はデータの列数Mを書き込む
|
144
|
-
|
145
|
-
for (int i = 0; i < M; i++)
|
146
|
-
|
147
|
-
{
|
148
|
-
|
149
|
-
fprintf(fp1, "%6.6f\t", num);
|
150
|
-
|
151
|
-
num -= dt;
|
152
|
-
|
153
|
-
}
|
154
|
-
|
155
|
-
fprintf(fp1, "\n");
|
156
|
-
|
157
|
-
num = 0.0; //初期化
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
53
|
+
#set yrange [100:0]
|
162
|
-
|
54
|
+
set autoscale xfix
|
55
|
+
set autoscale yfix
|
163
|
-
|
56
|
+
set yrange [] reverse
|
164
|
-
|
165
|
-
{
|
166
|
-
|
167
|
-
num += dt;
|
168
|
-
|
169
|
-
fprintf(fp1, "%6.6f\t", num); //行頭に行番号を挿入
|
170
|
-
|
171
|
-
for (int j = 0; j < M; j++)
|
172
|
-
|
173
|
-
{
|
174
|
-
|
175
|
-
fprintf(fp1, "%6.6f\t", a[i][j]);
|
176
|
-
|
177
|
-
}
|
178
|
-
|
179
|
-
fprintf(fp1, "\n"); //1行終えたので改行
|
180
|
-
|
181
|
-
}
|
182
|
-
|
183
|
-
|
57
|
+
set autoscale cbfix
|
184
|
-
|
185
|
-
//int tmp_count = 0;
|
186
|
-
|
187
|
-
|
58
|
+
set palette defined(0"#00008b",1"#2ca9e1",2"#38b48b",3.5"#ffff00",5"#eb6101",5.3"#c9171e")
|
188
|
-
|
189
|
-
//double data[3];
|
190
|
-
|
191
|
-
|
59
|
+
splot 'g-s_result.dat' matrix nonuniform
|
192
|
-
|
193
|
-
//{
|
194
|
-
|
195
|
-
// for (int j = 1; j < M - 1; j++)
|
196
|
-
|
197
|
-
// {
|
198
|
-
|
199
|
-
// data[tmp_count] = a[i][j];
|
200
|
-
|
201
|
-
// tmp_count++;
|
202
|
-
|
203
|
-
// if (tmp_count == 3)
|
204
|
-
|
205
|
-
// {
|
206
|
-
|
207
|
-
// // 有効数字の桁数
|
208
|
-
|
209
|
-
// cur = (int)(data[0] * 10);
|
210
|
-
|
211
|
-
// // 前の行の値と異なる場合は改行を出力
|
212
|
-
|
213
|
-
// if (cur != prev) fprintf(fp1, "\n");
|
214
|
-
|
215
|
-
// fprintf(fp1, "%6.6f\t%6.6f\t%6.6f\t\n", data[0], data[1], data[2]);
|
216
|
-
|
217
|
-
// tmp_count = 0;
|
218
|
-
|
219
|
-
// prev = cur;
|
220
|
-
|
221
|
-
// }
|
222
|
-
|
223
|
-
// }
|
224
|
-
|
225
|
-
//}
|
226
|
-
|
227
|
-
//fclose(fp1);
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
free(a);
|
232
|
-
|
233
|
-
free(tmp_a);
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
return 0;
|
238
|
-
|
239
|
-
}
|
240
|
-
|
241
60
|
```
|
242
61
|
|
243
|
-
|
244
|
-
|
245
|
-
```dat
|
246
|
-
|
247
|
-
//文字数overのため省略
|
248
|
-
|
249
|
-
配列列数 0.01 0.02 ・・・
|
250
|
-
|
251
|
-
0.01
|
252
|
-
|
253
|
-
0.02
|
254
|
-
|
255
|
-
・
|
256
|
-
|
257
|
-
・
|
258
|
-
|
259
|
-
・
|
260
|
-
|
261
|
-
```
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
```gnuplot
|
266
|
-
|
267
|
-
cd 'C:\Users\%USERNAME%\Desktop\gnuplot'
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
set pm3d
|
272
|
-
|
273
|
-
set pm3d map
|
274
|
-
|
275
|
-
set pm3d interpolate 5, 5
|
276
|
-
|
277
|
-
set ticslevel 0
|
278
|
-
|
279
|
-
#set cbrange[0:1]
|
280
|
-
|
281
|
-
#set xrange [0:200]
|
282
|
-
|
283
|
-
#set yrange [100:0]
|
284
|
-
|
285
|
-
set autoscale xfix
|
286
|
-
|
287
|
-
set autoscale yfix
|
288
|
-
|
289
|
-
set yrange [] reverse
|
290
|
-
|
291
|
-
set autoscale cbfix
|
292
|
-
|
293
|
-
set palette defined(0"#00008b",1"#2ca9e1",2"#38b48b",3.5"#ffff00",5"#eb6101",5.3"#c9171e")
|
294
|
-
|
295
|
-
splot 'g-s_result.dat' matrix nonuniform
|
296
|
-
|
297
|
-
```
|
298
|
-
|
299
|
-
|
300
|
-
|
301
62
|
###最終結果
|
302
|
-
|
303
63
|
![イメージ説明](057b31044db6c57742507882b21761e2.jpeg)
|
304
64
|
|
305
|
-
|
306
|
-
|
307
65
|
### 補足情報(FW/ツールのバージョンなど)
|
308
|
-
|
309
66
|
以下の環境で実施しております。
|
310
|
-
|
311
67
|
Visual Studio 2019 (C言語の実行環境)
|
312
|
-
|
313
68
|
Visual Studio Code
|
314
|
-
|
315
69
|
gnuplot 5.4(グラフ描画ソフト)
|
8
プログラムの修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -116,254 +116,70 @@
|
|
116
116
|
|
117
117
|
{
|
118
118
|
|
119
|
-
//double型の2次元配列 N行M列の行列
|
120
|
-
|
121
|
-
double** a;
|
122
|
-
|
123
|
-
a = (double**)malloc(sizeof(double*) * N);
|
124
|
-
|
125
|
-
for (int i = 0; i < N; i++) {
|
126
|
-
|
127
|
-
a[i] = (double*)malloc(sizeof(double) * M);
|
128
|
-
|
129
|
-
|
119
|
+
//datファイルに書き込む
|
120
|
+
|
121
|
+
FILE* fp1;
|
122
|
+
|
123
|
+
double* file1 = "g-s_result.dat";
|
124
|
+
|
125
|
+
fp1 = fopen(file1, "w");
|
126
|
+
|
127
|
+
if (fp1 == NULL)
|
128
|
+
|
129
|
+
{
|
130
|
+
|
131
|
+
printf("%f file cannot open!\n", file1);
|
132
|
+
|
133
|
+
return -1;
|
130
134
|
|
131
135
|
}
|
132
136
|
|
137
|
+
|
138
|
+
|
139
|
+
//列番号を挿入
|
140
|
+
|
133
|
-
double
|
141
|
+
double num = 2.0;
|
134
|
-
|
142
|
+
|
135
|
-
|
143
|
+
fprintf(fp1, "%d\t", M); //一番左上はデータの列数Mを書き込む
|
136
|
-
|
144
|
+
|
137
|
-
for (int i = 0; i <
|
145
|
+
for (int i = 0; i < M; i++)
|
146
|
+
|
138
|
-
|
147
|
+
{
|
148
|
+
|
139
|
-
t
|
149
|
+
fprintf(fp1, "%6.6f\t", num);
|
140
|
-
|
150
|
+
|
141
|
-
|
151
|
+
num -= dt;
|
142
152
|
|
143
153
|
}
|
144
154
|
|
145
|
-
|
155
|
+
fprintf(fp1, "\n");
|
156
|
+
|
146
|
-
|
157
|
+
num = 0.0; //初期化
|
158
|
+
|
159
|
+
|
160
|
+
|
147
|
-
//
|
161
|
+
//配列を書き込む
|
148
162
|
|
149
163
|
for (int i = 0; i < N; i++)
|
150
164
|
|
151
165
|
{
|
152
166
|
|
167
|
+
num += dt;
|
168
|
+
|
169
|
+
fprintf(fp1, "%6.6f\t", num); //行頭に行番号を挿入
|
170
|
+
|
153
171
|
for (int j = 0; j < M; j++)
|
154
172
|
|
155
173
|
{
|
156
174
|
|
157
|
-
a[i][j]
|
175
|
+
fprintf(fp1, "%6.6f\t", a[i][j]);
|
158
176
|
|
159
177
|
}
|
160
178
|
|
179
|
+
fprintf(fp1, "\n"); //1行終えたので改行
|
180
|
+
|
161
181
|
}
|
162
182
|
|
163
|
-
|
164
|
-
|
165
|
-
//0行目の要素はすべて1で初期化
|
166
|
-
|
167
|
-
for (int j = 0; j < M; j++)
|
168
|
-
|
169
|
-
{
|
170
|
-
|
171
|
-
a[0][j] = 1.0;
|
172
|
-
|
173
|
-
}
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
//1行目からi-1行目までの0列目の要素は-1で初期化
|
178
|
-
|
179
|
-
for (int i = 1; i < N - 1; i++)
|
180
|
-
|
181
|
-
{
|
182
|
-
|
183
|
-
a[i][0] = -1.0;
|
184
|
-
|
185
|
-
}
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
//1行目からi-1行目までのj列目の要素は-1で初期化
|
190
|
-
|
191
|
-
for (int i = 1; i < N - 1; i++)
|
192
|
-
|
193
|
-
{
|
194
|
-
|
195
|
-
a[i][M - 1] = -1.0;
|
196
|
-
|
197
|
-
}
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
//i行目の要素はすべて-1で初期化
|
202
|
-
|
203
|
-
for (int j = 0; j < M; j++)
|
204
|
-
|
205
|
-
{
|
206
|
-
|
207
|
-
a[N - 1][j] = -1.0;
|
208
|
-
|
209
|
-
}
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
/*G-S法*/
|
216
|
-
|
217
|
-
int count = 0;
|
218
|
-
|
219
|
-
while (count != cycle)
|
220
|
-
|
221
|
-
{
|
222
|
-
|
223
|
-
//aの配列の中身をtmp_a配列にコピー
|
224
|
-
|
225
|
-
for (int i = 0; i < N; i++)
|
226
|
-
|
227
|
-
{
|
228
|
-
|
229
|
-
for (int j = 0; j < M; j++)
|
230
|
-
|
231
|
-
{
|
232
|
-
|
233
|
-
tmp_a[i][j] = a[i][j];
|
234
|
-
|
235
|
-
}
|
236
|
-
|
237
|
-
}
|
238
|
-
|
239
|
-
//G-S法による計算
|
240
|
-
|
241
|
-
for (int i = 1; i < N - 1; i++)
|
242
|
-
|
243
|
-
{
|
244
|
-
|
245
|
-
for (int j = 1; j < M - 1; j++)
|
246
|
-
|
247
|
-
{
|
248
|
-
|
249
|
-
a[i][j] = (a[i - 1][j] + a[i][j + 1] + a[i + 1][j] + a[i][j - 1]) / 4;
|
250
|
-
|
251
|
-
}
|
252
|
-
|
253
|
-
}
|
254
|
-
|
255
|
-
//収束したか否かの判定
|
256
|
-
|
257
|
-
double error = fabs(a[1][1] - tmp_a[1][1]);
|
258
|
-
|
259
|
-
double tmp_error = 0.0;
|
260
|
-
|
261
|
-
double sum_error = 0.0;
|
262
|
-
|
263
|
-
for (int i = 1; i < N - 1; i++) {
|
264
|
-
|
265
|
-
for (int j = 1; j < M - 1; j++) {
|
266
|
-
|
267
|
-
tmp_error = fabs(a[i][j] - tmp_a[i][j]);
|
268
|
-
|
269
|
-
if (tmp_error > error)
|
270
|
-
|
271
|
-
error = tmp_error;
|
272
|
-
|
273
|
-
sum_error += error;
|
274
|
-
|
275
|
-
}
|
276
|
-
|
277
|
-
}
|
278
|
-
|
279
|
-
//errorの合計/N*M<eps
|
280
|
-
|
281
|
-
error = sum_error / (N * M);
|
282
|
-
|
283
|
-
if (error < eps)
|
284
|
-
|
285
|
-
{
|
286
|
-
|
287
|
-
printf("%dサイクル目で収束\n", count);
|
288
|
-
|
289
|
-
break;
|
290
|
-
|
291
|
-
}
|
292
|
-
|
293
|
-
count++;
|
294
|
-
|
295
|
-
}
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
//datファイルに書き込む
|
304
|
-
|
305
|
-
FILE* fp1;
|
306
|
-
|
307
|
-
double* file1 = "g-s_result.dat";
|
308
|
-
|
309
|
-
fp1 = fopen(file1, "w");
|
310
|
-
|
311
|
-
if (fp1 == NULL)
|
312
|
-
|
313
|
-
{
|
314
|
-
|
315
|
-
printf("%f file cannot open!\n", file1);
|
316
|
-
|
317
|
-
return -1;
|
318
|
-
|
319
|
-
}
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
//列番号を挿入
|
324
|
-
|
325
|
-
double num = 2.0;
|
326
|
-
|
327
|
-
fprintf(fp1, "%d\t", M); //一番左上はデータの列数Mを書き込む
|
328
|
-
|
329
|
-
for (int i = 0; i < M; i++)
|
330
|
-
|
331
|
-
{
|
332
|
-
|
333
|
-
fprintf(fp1, "%6.6f\t", num);
|
334
|
-
|
335
|
-
num -= dt;
|
336
|
-
|
337
|
-
}
|
338
|
-
|
339
|
-
fprintf(fp1, "\n");
|
340
|
-
|
341
|
-
num = 0.0; //初期化
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
//配列を書き込む
|
346
|
-
|
347
|
-
for (int i = 0; i < N; i++)
|
348
|
-
|
349
|
-
{
|
350
|
-
|
351
|
-
num += dt;
|
352
|
-
|
353
|
-
fprintf(fp1, "%6.6f\t", num); //行頭に行番号を挿入
|
354
|
-
|
355
|
-
for (int j = 0; j < M; j++)
|
356
|
-
|
357
|
-
{
|
358
|
-
|
359
|
-
fprintf(fp1, "%6.6f\t", a[i][j]);
|
360
|
-
|
361
|
-
}
|
362
|
-
|
363
|
-
fprintf(fp1, "\n"); //1行終えたので改行
|
364
|
-
|
365
|
-
}
|
366
|
-
|
367
183
|
fclose(fp1);
|
368
184
|
|
369
185
|
//int tmp_count = 0;
|
7
誤字の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
###追記1
|
34
34
|
|
35
|
-
描画結果
|
35
|
+
描画結果1
|
36
36
|
|
37
37
|
![イメージ説明](d8bc8fe43f3cd4d5d85acdb27cf1dbd6.jpeg)
|
38
38
|
|
@@ -44,6 +44,8 @@
|
|
44
44
|
|
45
45
|
描画結果2
|
46
46
|
|
47
|
+
配列の描画なので`splot 'XXX.dat' matrix`とすれば描画できる。
|
48
|
+
|
47
49
|
![イメージ説明](998dc7155b217d47101061653dd60881.jpeg)
|
48
50
|
|
49
51
|
軸の範囲を0<=x<=2、0<=y<=1にしたいが、描画範囲をそのように指定すると、当然だが範囲が狭まるので正しい表示にはならない。
|
6
datの追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -424,6 +424,26 @@
|
|
424
424
|
|
425
425
|
|
426
426
|
|
427
|
+
```dat
|
428
|
+
|
429
|
+
//文字数overのため省略
|
430
|
+
|
431
|
+
配列列数 0.01 0.02 ・・・
|
432
|
+
|
433
|
+
0.01
|
434
|
+
|
435
|
+
0.02
|
436
|
+
|
437
|
+
・
|
438
|
+
|
439
|
+
・
|
440
|
+
|
441
|
+
・
|
442
|
+
|
443
|
+
```
|
444
|
+
|
445
|
+
|
446
|
+
|
427
447
|
```gnuplot
|
428
448
|
|
429
449
|
cd 'C:\Users\%USERNAME%\Desktop\gnuplot'
|
5
結果の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -462,7 +462,7 @@
|
|
462
462
|
|
463
463
|
###最終結果
|
464
464
|
|
465
|
-
|
465
|
+
![イメージ説明](057b31044db6c57742507882b21761e2.jpeg)
|
466
466
|
|
467
467
|
|
468
468
|
|
4
ソースコードの変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,17 +4,11 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
|
7
|
-
|
7
|
+
ガウス・ザイデル法を用いて、ある行列の値が収束していくようなプログラムを作成します。(main_01.cを参照)
|
8
|
-
|
9
|
-
|
8
|
+
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
|
10
|
+
|
13
|
-
その数値計算を行った後にその行列
|
11
|
+
その数値計算を行った後にその行列をdat形式(g-s_result.datを参照)で出力し、gnuplotで温度分布のグラフを描画します。(g-s_method.pltを参照)
|
14
|
-
|
15
|
-
![イメージ説明](6e7aa0e7e5007b085589895038aa6d87.jpeg)
|
16
|
-
|
17
|
-
このグラフは見本のグラフです。
|
18
12
|
|
19
13
|
|
20
14
|
|
@@ -324,10 +318,38 @@
|
|
324
318
|
|
325
319
|
|
326
320
|
|
321
|
+
//列番号を挿入
|
322
|
+
|
323
|
+
double num = 2.0;
|
324
|
+
|
325
|
+
fprintf(fp1, "%d\t", M); //一番左上はデータの列数Mを書き込む
|
326
|
+
|
327
|
+
for (int i = 0; i < M; i++)
|
328
|
+
|
329
|
+
{
|
330
|
+
|
331
|
+
fprintf(fp1, "%6.6f\t", num);
|
332
|
+
|
333
|
+
num -= dt;
|
334
|
+
|
335
|
+
}
|
336
|
+
|
337
|
+
fprintf(fp1, "\n");
|
338
|
+
|
339
|
+
num = 0.0; //初期化
|
340
|
+
|
341
|
+
|
342
|
+
|
343
|
+
//配列を書き込む
|
344
|
+
|
327
345
|
for (int i = 0; i < N; i++)
|
328
346
|
|
329
347
|
{
|
330
348
|
|
349
|
+
num += dt;
|
350
|
+
|
351
|
+
fprintf(fp1, "%6.6f\t", num); //行頭に行番号を挿入
|
352
|
+
|
331
353
|
for (int j = 0; j < M; j++)
|
332
354
|
|
333
355
|
{
|
@@ -404,8 +426,6 @@
|
|
404
426
|
|
405
427
|
```gnuplot
|
406
428
|
|
407
|
-
#g-s_method.plt
|
408
|
-
|
409
429
|
cd 'C:\Users\%USERNAME%\Desktop\gnuplot'
|
410
430
|
|
411
431
|
|
@@ -418,24 +438,40 @@
|
|
418
438
|
|
419
439
|
set ticslevel 0
|
420
440
|
|
421
|
-
set cbrange[0:1]
|
441
|
+
#set cbrange[0:1]
|
422
|
-
|
442
|
+
|
423
|
-
set xrange [0:200]
|
443
|
+
#set xrange [0:200]
|
424
|
-
|
444
|
+
|
425
|
-
set yrange [100:0]
|
445
|
+
#set yrange [100:0]
|
446
|
+
|
447
|
+
set autoscale xfix
|
448
|
+
|
449
|
+
set autoscale yfix
|
450
|
+
|
451
|
+
set yrange [] reverse
|
452
|
+
|
453
|
+
set autoscale cbfix
|
426
454
|
|
427
455
|
set palette defined(0"#00008b",1"#2ca9e1",2"#38b48b",3.5"#ffff00",5"#eb6101",5.3"#c9171e")
|
428
456
|
|
429
|
-
splot 'g-s_result.dat' matrix
|
457
|
+
splot 'g-s_result.dat' matrix nonuniform
|
430
458
|
|
431
459
|
```
|
432
460
|
|
433
461
|
|
434
462
|
|
463
|
+
###最終結果
|
464
|
+
|
465
|
+
|
466
|
+
|
467
|
+
|
468
|
+
|
435
469
|
### 補足情報(FW/ツールのバージョンなど)
|
436
470
|
|
437
471
|
以下の環境で実施しております。
|
438
472
|
|
439
473
|
Visual Studio 2019 (C言語の実行環境)
|
440
474
|
|
475
|
+
Visual Studio Code
|
476
|
+
|
441
477
|
gnuplot 5.4(グラフ描画ソフト)
|
3
追記2
test
CHANGED
File without changes
|
test
CHANGED
@@ -54,6 +54,8 @@
|
|
54
54
|
|
55
55
|
軸の範囲を0<=x<=2、0<=y<=1にしたいが、描画範囲をそのように指定すると、当然だが範囲が狭まるので正しい表示にはならない。
|
56
56
|
|
57
|
+
軸の範囲が0<=x<=200、0<=y<=100になっているのは配列(行列)サイズがa[100][200]となっているためですが、軸は0<=x<=2、0<=y<=1としなければいけない制約があります。また、格子間隔(離散した間隔)が0.01という制約もあるためa[1/0.01][2/0.01]としております。この配列サイズを維持したまgnuplot上での軸を0<=x<=2、0<=y<=1と表示するにはどうすればよいのでしょうか。
|
58
|
+
|
57
59
|
|
58
60
|
|
59
61
|
### 試したこと
|
2
描画結果の追加、プログラムの更新
test
CHANGED
File without changes
|
test
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
|
37
37
|
```
|
38
38
|
|
39
|
-
追記
|
39
|
+
###追記1
|
40
40
|
|
41
41
|
描画結果
|
42
42
|
|
@@ -46,6 +46,16 @@
|
|
46
46
|
|
47
47
|
|
48
48
|
|
49
|
+
###追記2
|
50
|
+
|
51
|
+
描画結果2
|
52
|
+
|
53
|
+
![イメージ説明](998dc7155b217d47101061653dd60881.jpeg)
|
54
|
+
|
55
|
+
軸の範囲を0<=x<=2、0<=y<=1にしたいが、描画範囲をそのように指定すると、当然だが範囲が狭まるので正しい表示にはならない。
|
56
|
+
|
57
|
+
|
58
|
+
|
49
59
|
### 試したこと
|
50
60
|
|
51
61
|
pm3dを用いてグラフが表示されない原因をいろいろとインターネットで調べたところ、出力されるdatファイルに問題があると思います。
|
@@ -88,13 +98,13 @@
|
|
88
98
|
|
89
99
|
|
90
100
|
|
91
|
-
//#define dt (0.0
|
101
|
+
//#define dt (0.01) //格子間隔
|
92
|
-
|
93
|
-
|
94
|
-
|
102
|
+
|
103
|
+
|
104
|
+
|
95
|
-
#define N (
|
105
|
+
#define N (100) // 1/dt
|
96
|
-
|
106
|
+
|
97
|
-
#define M (
|
107
|
+
#define M (200) // 2/dt
|
98
108
|
|
99
109
|
|
100
110
|
|
@@ -312,37 +322,67 @@
|
|
312
322
|
|
313
323
|
|
314
324
|
|
315
|
-
int tmp_count = 0;
|
316
|
-
|
317
|
-
for (int i =
|
325
|
+
for (int i = 0; i < N; i++)
|
318
|
-
|
326
|
+
|
319
|
-
{
|
327
|
+
{
|
320
|
-
|
328
|
+
|
321
|
-
for (int j =
|
329
|
+
for (int j = 0; j < M; j++)
|
322
330
|
|
323
331
|
{
|
324
332
|
|
325
|
-
fprintf(fp1,"%6.6f\t", a[i][j]);
|
333
|
+
fprintf(fp1, "%6.6f\t", a[i][j]);
|
326
|
-
|
327
|
-
|
334
|
+
|
328
|
-
|
329
|
-
if (tmp_count == 3)//3つ値を書き込んだら改行
|
330
|
-
|
331
|
-
{
|
332
|
-
|
333
|
-
tmp_count = 0;
|
334
|
-
|
335
|
-
fprintf(fp1,"\n");
|
336
|
-
|
337
|
-
|
335
|
+
}
|
338
|
-
|
336
|
+
|
339
|
-
|
337
|
+
fprintf(fp1, "\n"); //1行終えたので改行
|
340
338
|
|
341
339
|
}
|
342
340
|
|
343
341
|
fclose(fp1);
|
344
342
|
|
345
|
-
|
343
|
+
//int tmp_count = 0;
|
344
|
+
|
345
|
+
//int prev = 0, cur = 0;
|
346
|
+
|
347
|
+
//double data[3];
|
348
|
+
|
349
|
+
//for (int i = 1; i < N - 1; i++)
|
350
|
+
|
351
|
+
//{
|
352
|
+
|
353
|
+
// for (int j = 1; j < M - 1; j++)
|
354
|
+
|
355
|
+
// {
|
356
|
+
|
357
|
+
// data[tmp_count] = a[i][j];
|
358
|
+
|
359
|
+
// tmp_count++;
|
360
|
+
|
361
|
+
// if (tmp_count == 3)
|
362
|
+
|
363
|
+
// {
|
364
|
+
|
365
|
+
// // 有効数字の桁数
|
366
|
+
|
367
|
+
// cur = (int)(data[0] * 10);
|
368
|
+
|
369
|
+
// // 前の行の値と異なる場合は改行を出力
|
370
|
+
|
371
|
+
// if (cur != prev) fprintf(fp1, "\n");
|
372
|
+
|
373
|
+
// fprintf(fp1, "%6.6f\t%6.6f\t%6.6f\t\n", data[0], data[1], data[2]);
|
374
|
+
|
375
|
+
// tmp_count = 0;
|
376
|
+
|
377
|
+
// prev = cur;
|
378
|
+
|
379
|
+
// }
|
380
|
+
|
381
|
+
// }
|
382
|
+
|
383
|
+
//}
|
384
|
+
|
385
|
+
//fclose(fp1);
|
346
386
|
|
347
387
|
|
348
388
|
|
@@ -358,244 +398,38 @@
|
|
358
398
|
|
359
399
|
```
|
360
400
|
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
0
|
378
|
-
|
379
|
-
0
|
380
|
-
|
381
|
-
0
|
382
|
-
|
383
|
-
0
|
384
|
-
|
385
|
-
0
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
0.964570 0.965448 0.966280
|
390
|
-
|
391
|
-
0.967069 0.967818 0.968530
|
392
|
-
|
393
|
-
0.969208 0.969854 0.970469
|
394
|
-
|
395
|
-
0.971057 0.971619 0.972156
|
396
|
-
|
397
|
-
0.972670 0.973163 0.973635
|
398
|
-
|
399
|
-
0.974088 0.974523 0.974940
|
400
|
-
|
401
|
-
0.975342 0.975728 0.976100
|
402
|
-
|
403
|
-
0.976458 0.976803 0.977136
|
404
|
-
|
405
|
-
0.977457 0.977766 0.978065
|
406
|
-
|
407
|
-
0.978354 0.978633 0.978903
|
408
|
-
|
409
|
-
0.979164 0.979417 0.979661
|
410
|
-
|
411
|
-
0.979898 0.980127 0.980349
|
412
|
-
|
413
|
-
0.980565 0.980774 0.980976
|
414
|
-
|
415
|
-
0.981173 0.981364 0.981549
|
416
|
-
|
417
|
-
0.981729 0.981904 0.982073
|
418
|
-
|
419
|
-
0.982238 0.982399 0.982555
|
420
|
-
|
421
|
-
0.982707 0.982854 0.982998
|
422
|
-
|
423
|
-
0.983137 0.983273 0.983406
|
424
|
-
|
425
|
-
0.983535 0.983660 0.983783
|
426
|
-
|
427
|
-
0.983902 0.984018 0.984131
|
428
|
-
|
429
|
-
0.984241 0.984349 0.984453
|
430
|
-
|
431
|
-
0.984556 0.984655 0.984752
|
432
|
-
|
433
|
-
0.984847 0.984940 0.985030
|
434
|
-
|
435
|
-
0.985118 0.985204 0.985288
|
436
|
-
|
437
|
-
0.985369 0.985449 0.985527
|
438
|
-
|
439
|
-
0.985603 0.985678 0.985750
|
440
|
-
|
441
|
-
0.985821 0.985890 0.985957
|
442
|
-
|
443
|
-
0.986023 0.986088 0.986150
|
444
|
-
|
445
|
-
0.986212 0.986272 0.986330
|
446
|
-
|
447
|
-
0.986387 0.986443 0.986498
|
448
|
-
|
449
|
-
0.986551 0.986603 0.986653
|
450
|
-
|
451
|
-
0.986703 0.986751 0.986798
|
452
|
-
|
453
|
-
0.986844 0.986889 0.986933
|
454
|
-
|
455
|
-
0.986976 0.987018 0.987059
|
456
|
-
|
457
|
-
0.987099 0.987137 0.987175
|
458
|
-
|
459
|
-
0.987212 0.987248 0.987283
|
460
|
-
|
461
|
-
0.987318 0.987351 0.987384
|
462
|
-
|
463
|
-
0.987415 0.987446 0.987476
|
464
|
-
|
465
|
-
0.987506 0.987534 0.987562
|
466
|
-
|
467
|
-
0.987589 0.987615 0.987640
|
468
|
-
|
469
|
-
0.987665 0.987689 0.987713
|
470
|
-
|
471
|
-
0.987735 0.987757 0.987779
|
472
|
-
|
473
|
-
0.987799 0.987819 0.987839
|
474
|
-
|
475
|
-
0.987857 0.987875 0.987893
|
476
|
-
|
477
|
-
0.987910 0.987926 0.987942
|
478
|
-
|
479
|
-
0.987957 0.987971 0.987985
|
480
|
-
|
481
|
-
0.987998 0.988011 0.988023
|
482
|
-
|
483
|
-
0.988035 0.988046 0.988056
|
484
|
-
|
485
|
-
0.988066 0.988075 0.988084
|
486
|
-
|
487
|
-
0.988093 0.988100 0.988108
|
488
|
-
|
489
|
-
0.988114 0.988120 0.988126
|
490
|
-
|
491
|
-
0.988131 0.988136 0.988140
|
492
|
-
|
493
|
-
0.988144 0.988147 0.988149
|
494
|
-
|
495
|
-
0.988151 0.988153 0.988154
|
496
|
-
|
497
|
-
0.988154 0.988154 0.988154
|
498
|
-
|
499
|
-
0.988153 0.988151 0.988149
|
500
|
-
|
501
|
-
0.988147 0.988144 0.988140
|
502
|
-
|
503
|
-
0.988136 0.988131 0.988126
|
504
|
-
|
505
|
-
0.988120 0.988114 0.988108
|
506
|
-
|
507
|
-
0.988100 0.988093 0.988084
|
508
|
-
|
509
|
-
0.988075 0.988066 0.988056
|
510
|
-
|
511
|
-
0.988046 0.988035 0.988023
|
512
|
-
|
513
|
-
0.988011 0.987998 0.987985
|
514
|
-
|
515
|
-
0.987971 0.987957 0.987941
|
516
|
-
|
517
|
-
0.987926 0.987910 0.987893
|
518
|
-
|
519
|
-
0.987875 0.987857 0.987839
|
520
|
-
|
521
|
-
0.987819 0.987799 0.987779
|
522
|
-
|
523
|
-
0.987757 0.987735 0.987713
|
524
|
-
|
525
|
-
0.987689 0.987665 0.987640
|
526
|
-
|
527
|
-
0.987615 0.987589 0.987562
|
528
|
-
|
529
|
-
0.987534 0.987506 0.987476
|
530
|
-
|
531
|
-
0.987446 0.987415 0.987384
|
532
|
-
|
533
|
-
0.987351 0.987318 0.987283
|
534
|
-
|
535
|
-
0.987248 0.987212 0.987175
|
536
|
-
|
537
|
-
0.987137 0.987099 0.987059
|
538
|
-
|
539
|
-
0.987018 0.986976 0.986933
|
540
|
-
|
541
|
-
0.986889 0.986844 0.986798
|
542
|
-
|
543
|
-
0.986751 0.986703 0.986653
|
544
|
-
|
545
|
-
0.986603 0.986551 0.986498
|
546
|
-
|
547
|
-
0.986443 0.986387 0.986330
|
548
|
-
|
549
|
-
0.986272 0.986212 0.986150
|
550
|
-
|
551
|
-
0.986088 0.986023 0.985957
|
552
|
-
|
553
|
-
0.985890 0.985821 0.985750
|
554
|
-
|
555
|
-
0.985678 0.985603 0.985527
|
556
|
-
|
557
|
-
0.985449 0.985369 0.985288
|
558
|
-
|
559
|
-
0.985204 0.985118 0.985030
|
560
|
-
|
561
|
-
0.984940 0.984847 0.984752
|
562
|
-
|
563
|
-
0.984655 0.984556 0.984453
|
564
|
-
|
565
|
-
・・・(つづく)
|
401
|
+
|
402
|
+
|
403
|
+
```gnuplot
|
404
|
+
|
405
|
+
#g-s_method.plt
|
406
|
+
|
407
|
+
cd 'C:\Users\%USERNAME%\Desktop\gnuplot'
|
408
|
+
|
409
|
+
|
410
|
+
|
411
|
+
set pm3d
|
412
|
+
|
413
|
+
set pm3d map
|
414
|
+
|
415
|
+
set pm3d interpolate 5, 5
|
416
|
+
|
417
|
+
set ticslevel 0
|
418
|
+
|
419
|
+
set cbrange[0:1]
|
420
|
+
|
421
|
+
set xrange [0:200]
|
422
|
+
|
423
|
+
set yrange [100:0]
|
424
|
+
|
425
|
+
set palette defined(0"#00008b",1"#2ca9e1",2"#38b48b",3.5"#ffff00",5"#eb6101",5.3"#c9171e")
|
426
|
+
|
427
|
+
splot 'g-s_result.dat' matrix
|
566
428
|
|
567
429
|
```
|
568
430
|
|
569
431
|
|
570
432
|
|
571
|
-
```plt
|
572
|
-
|
573
|
-
#g-s_method.plt
|
574
|
-
|
575
|
-
cd 'C:\Users\%USERNAME%\Desktop\gnuplot'
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
set pm3d
|
580
|
-
|
581
|
-
set pm3d map
|
582
|
-
|
583
|
-
set ticslevel 0
|
584
|
-
|
585
|
-
set cbrange[0:1]
|
586
|
-
|
587
|
-
set xrange [-2:2]
|
588
|
-
|
589
|
-
set yrange [-1:1]
|
590
|
-
|
591
|
-
set palette rgbformulae 15, 5, 7
|
592
|
-
|
593
|
-
splot 'g-s_result.dat' with pm3d
|
594
|
-
|
595
|
-
```
|
596
|
-
|
597
|
-
|
598
|
-
|
599
433
|
### 補足情報(FW/ツールのバージョンなど)
|
600
434
|
|
601
435
|
以下の環境で実施しております。
|
1
g-s_metod.pltの更新、描画結果の表示
test
CHANGED
File without changes
|
test
CHANGED
@@ -36,6 +36,14 @@
|
|
36
36
|
|
37
37
|
```
|
38
38
|
|
39
|
+
追記
|
40
|
+
|
41
|
+
描画結果
|
42
|
+
|
43
|
+
![イメージ説明](d8bc8fe43f3cd4d5d85acdb27cf1dbd6.jpeg)
|
44
|
+
|
45
|
+
描画できるようにはなりましたが、直線になってしまいます。
|
46
|
+
|
39
47
|
|
40
48
|
|
41
49
|
### 試したこと
|
@@ -574,17 +582,11 @@
|
|
574
582
|
|
575
583
|
set ticslevel 0
|
576
584
|
|
577
|
-
set cbrange[
|
585
|
+
set cbrange[0:1]
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
586
|
+
|
582
|
-
|
583
|
-
set xrange [
|
587
|
+
set xrange [-2:2]
|
584
|
-
|
588
|
+
|
585
|
-
set yrange [1:
|
589
|
+
set yrange [-1:1]
|
586
|
-
|
587
|
-
|
588
590
|
|
589
591
|
set palette rgbformulae 15, 5, 7
|
590
592
|
|