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

質問編集履歴

9

エラーメッセージの修正

2020/09/07 11:57

投稿

Kinsho
Kinsho

スコア18

title CHANGED
File without changes
body CHANGED
@@ -17,10 +17,7 @@
17
17
  1日考えましたが現在の私の力ではどうにも解決できなさそうなので解決法をご教示いただけますと幸いです.
18
18
  よろしくお願いします.
19
19
 
20
- ### 発生している問題・エラーメッセージ
21
20
 
22
- セグメンテーション違反です.
23
-
24
21
  ### 該当のソースコード
25
22
 
26
23
  ```c++

8

質問タイトルの変更

2020/09/07 11:57

投稿

Kinsho
Kinsho

スコア18

title CHANGED
@@ -1,1 +1,1 @@
1
- C++で2次元の3次スプライン補間.「セグメンテーション違反です」とは?
1
+ C++で2次元の3次スプライン補間.方程式の解が不定の場合の対処法について
body CHANGED
File without changes

7

配列のグローバル宣言.スタックの問題解消

2020/09/07 11:36

投稿

Kinsho
Kinsho

スコア18

title CHANGED
File without changes
body CHANGED
@@ -4,11 +4,12 @@
4
4
  それを2乗3乗した2次元配列を作成しそれを基に16本の連立方程式を作り,それを解くことによって0.01×0.01の各マス内における3次スプライン補間式の係数を導出したいです.
5
5
  添付プログラム序盤のcsvの読み取りはこちら( https://teratail.com/questions/289856 )を,連立方程式の解き方はこちら( https://qiita.com/kubo_programmer/items/c42ec88bdba3c5c0919f )を参考にさせていただきました.
6
6
 
7
+ これで計算したところcan not calc(自分で作成したエラー文です)と返されてしまいます.
7
- ここで2重forループを入れるまでなプログラムは問題な動き,sq[][],cb[][]も無事に数字格納されています.しかしこforループを動かすとセグメンテーション違反とのエラーが出きてしまい,調べてもエラー内容がよくわかりせん
8
+ おそらくcsvの中十分に散らばっていない部分があり連立方程式解が一位に定まらずエラーになってしまうのだと考えられ
9
+ 当然すべてのセルにとりあえず1を足すなどの処理は無意味で根本的な対策が必要みたいです.
8
10
 
9
- PCスペックの問題かと思いましたが,大学研究室の本格的計算機投げても同様のエラーを返されたのでプログラムの方に問題がるようで
11
+ よう場合良い対処法などはりまでしょうか?
10
12
 
11
-
12
13
  結果(2次元配列a~p)はこの後に別のプログラムで使いたいと思っていて,この計算がうまくいったらそれを別のcsvにでも格納して使いたいと思ってるので,最後の部分はこのままでいきたいです.
13
14
 
14
15
 
@@ -70,8 +71,11 @@
70
71
  }
71
72
  return mat;
72
73
  }
74
+ double sq[w][w];
75
+ double cb[w][w];
76
+ double a[w][w], b[w][w], c[w][w], d[w][w], e[w][w], f[w][w], g[w][w], h[w][w];
77
+ double s[w][w], t[w][w], k[w][w], l[w][w], m[w][w], n[w][w], o[w][w], p[w][w];
73
78
 
74
-
75
79
  int main() {
76
80
 
77
81
 
@@ -86,8 +90,7 @@
86
90
  int y=si.size(); // (縦の要素数)364
87
91
  int x= si.at(0).size(); //(横の要素数)184
88
92
 
89
- double sq[w][w];
93
+
90
- double cb[w][w];
91
94
  for(int i=0;i<y;i++) {
92
95
  for (int j = 0; j<x; j++) {
93
96
  sq[i][j] = si[i][j] * si[i][j];
@@ -110,8 +113,7 @@
110
113
  //i+2,13,14,15,16
111
114
 
112
115
  //多分ここからが問題と思われます
113
- double a[w][w], b[w][w], c[w][w], d[w][w], e[w][w], f[w][w], g[w][w], h[w][w];
116
+
114
- double s[w][w], t[w][w], k[w][w], l[w][w], m[w][w], n[w][w], o[w][w], p[w][w];
115
117
  //1つずつ解く
116
118
  for (int i = 2; i <= y - 3; i++) {
117
119
  for (int j = 2; j <= x - 3; j++) {
@@ -136,7 +138,7 @@
136
138
  { cb[0][j - 1],cb[0][j - 1] * si[i + 2][0],cb[0][j - 1] * sq[i + 2][0],cb[0][j - 1] * cb[i + 2][0],sq[0][j - 1], sq[0][j - 1] * si[i + 2][0], sq[0][j - 1] * sq[i + 2][0], sq[0][j - 1] * cb[i + 2][0],si[0][j - 1], si[0][j - 1] * si[i + 2][0], si[0][j - 1] * sq[i + 2][0], si[0][j - 1] * cb[i + 2][0],1, si[i +2][0], sq[i + 2][0], cb[i + 2][0],si[i + 2][j - 1] },//13
137
139
  { cb[0][j],cb[0][j] * si[i + 2][0],cb[0][j] * sq[i + 2][0],cb[0][j] * cb[i + 2][0],sq[0][j], sq[0][j] * si[i + 2][0], sq[0][j] * sq[i + 2][0], sq[0][j] * cb[i + 2][0], si[0][j], si[0][j] * si[i + 2][0], si[0][j] * sq[i + 2][0], si[0][j] * cb[i + 2][0], 1, si[i + 2][0], sq[i + 2][0], cb[i + 2][0], si[i + 2][j] },//14
138
140
  { cb[0][j + 1],cb[0][j + 1] * si[i + 2][0],cb[0][j + 1] * sq[i + 2][0],cb[0][j + 1] * cb[i + 2][0],sq[0][j + 1], sq[0][j + 1] * si[i + 2][0], sq[0][j + 1] * sq[i + 2][0], sq[0][j + 1] * cb[i + 2][0],si[0][j + 1], si[0][j + 1] * si[i + 2][0], si[0][j + 1] * sq[i + 2][0], si[0][j + 1] * cb[i + 2][0],1, si[i + 2][0], sq[i + 2][0], cb[i + 2][0] , si[i + 2][j + 1] },//15
139
- { cb[0][j + 2],cb[0][j + 2] * si[i + 2][0],cb[0][j + 2] * sq[i + 2][0],cb[0][j + 2] * cb[i + 2][0],sq[0][j + 2], sq[0][j + 2] * si[i + 2][0], sq[0][j + 2] * sq[i + 2][0], sq[0][j + 2] * cb[i + 2][0],si[0][j + 2], si[0][j + 2] * si[i + 2][0], si[0][j + 2] * sq[i + 2][0], si[0][j + 2] * cb[i + 2][0], 1, si[i + 2][0], sq[i + 2][0], cb[i + 2][0],si[i + 2][j + 2] },//16
141
+ { cb[0][j + 2],cb[0][j + 2] * si[i + 2][0],cb[0][j + 2] * sq[i + 2][0],cb[0][j + 2] * cb[i + 2][0],sq[0][j + 2], sq[0][j + 2] * si[i + 2][0], sq[0][j + 2] * sq[i + 2][0], sq[0][j + 2] * cb[i + 2][0],si[0][j + 2], si[0][j + 2] * si[i + 2][0], si[0][j + 2] * sq[i + 2][0], si[0][j + 2] * cb[i + 2][0], 1, si[i + 2][0], sq[i + 2][0], cb[i + 2][0],si[i + 2][j + 2] }//16
140
142
  };
141
143
 
142
144
  for (int ii = 0; ii<16; ii++) {
@@ -193,5 +195,4 @@
193
195
 
194
196
 
195
197
 
196
-
197
198
  ```

6

コードの修正.文字の設定ミス

2020/09/07 11:32

投稿

Kinsho
Kinsho

スコア18

title CHANGED
File without changes
body CHANGED
@@ -158,7 +158,7 @@
158
158
  }
159
159
  }
160
160
  for (int ii = 15; ii >= 0; ii--) {
161
- for (int jj = ii + 1; jj<16; j++)z[ii][16] -= z[jj][16] * z[ii][jj];
161
+ for (int jj = ii + 1; jj<16; jj++)z[ii][16] -= z[jj][16] * z[ii][jj];
162
162
  }
163
163
  a[i][j] = z[0][16];
164
164
  b[i][j] = z[1][16];
@@ -194,5 +194,4 @@
194
194
 
195
195
 
196
196
 
197
-
198
197
  ```

5

コードの修正.文字の設定ミス

2020/09/07 10:55

投稿

Kinsho
Kinsho

スコア18

title CHANGED
File without changes
body CHANGED
@@ -152,7 +152,7 @@
152
152
 
153
153
  for (int jj = ii; jj <= 16; jj++)z[ii][jj] /= beginNum;
154
154
 
155
- for (int jj = ii + 1; jj<16; j++) {
155
+ for (int jj = ii + 1; jj<16; jj++) {
156
156
  double beginDelete = z[jj][ii];
157
157
  for (int k = ii; k <= 16; k++)z[jj][k] -= beginDelete*z[ii][k];
158
158
  }
@@ -194,4 +194,5 @@
194
194
 
195
195
 
196
196
 
197
+
197
198
  ```

4

コードの修正.文字の設定ミス

2020/09/07 10:55

投稿

Kinsho
Kinsho

スコア18

title CHANGED
File without changes
body CHANGED
@@ -141,8 +141,8 @@
141
141
 
142
142
  for (int ii = 0; ii<16; ii++) {
143
143
  int maxLine = ii;
144
- for (int j = ii; j<16; j++) if (abs(z[maxLine][ii])<abs(z[j][ii])) maxLine = j;
144
+ for (int jj = ii; jj<16; jj++) if (abs(z[maxLine][ii])<abs(z[jj][ii])) maxLine = jj;
145
- for (int j = ii; j <= 16; j++) swap(z[ii][j], z[maxLine][j]);
145
+ for (int jj = ii; jj<= 16; jj++) swap(z[ii][jj], z[maxLine][jj]);
146
146
 
147
147
  double beginNum = z[ii][ii];
148
148
  if (!beginNum) {
@@ -150,15 +150,15 @@
150
150
  return 0;
151
151
  }
152
152
 
153
- for (int j = ii; j <= 16; j++)z[ii][j] /= beginNum;
153
+ for (int jj = ii; jj <= 16; jj++)z[ii][jj] /= beginNum;
154
154
 
155
- for (int j = ii + 1; j<16; j++) {
155
+ for (int jj = ii + 1; jj<16; j++) {
156
- double beginDelete = z[j][ii];
156
+ double beginDelete = z[jj][ii];
157
- for (int k = ii; k <= 16; k++)z[j][k] -= beginDelete*z[ii][k];
157
+ for (int k = ii; k <= 16; k++)z[jj][k] -= beginDelete*z[ii][k];
158
158
  }
159
159
  }
160
160
  for (int ii = 15; ii >= 0; ii--) {
161
- for (int j = ii + 1; j<16; j++)z[ii][16] -= z[j][16] * z[ii][j];
161
+ for (int jj = ii + 1; jj<16; j++)z[ii][16] -= z[jj][16] * z[ii][jj];
162
162
  }
163
163
  a[i][j] = z[0][16];
164
164
  b[i][j] = z[1][16];
@@ -193,4 +193,5 @@
193
193
 
194
194
 
195
195
 
196
+
196
197
  ```

3

コードの修正.文字の設定ミス

2020/09/07 10:45

投稿

Kinsho
Kinsho

スコア18

title CHANGED
File without changes
body CHANGED
@@ -137,28 +137,28 @@
137
137
  { cb[0][j],cb[0][j] * si[i + 2][0],cb[0][j] * sq[i + 2][0],cb[0][j] * cb[i + 2][0],sq[0][j], sq[0][j] * si[i + 2][0], sq[0][j] * sq[i + 2][0], sq[0][j] * cb[i + 2][0], si[0][j], si[0][j] * si[i + 2][0], si[0][j] * sq[i + 2][0], si[0][j] * cb[i + 2][0], 1, si[i + 2][0], sq[i + 2][0], cb[i + 2][0], si[i + 2][j] },//14
138
138
  { cb[0][j + 1],cb[0][j + 1] * si[i + 2][0],cb[0][j + 1] * sq[i + 2][0],cb[0][j + 1] * cb[i + 2][0],sq[0][j + 1], sq[0][j + 1] * si[i + 2][0], sq[0][j + 1] * sq[i + 2][0], sq[0][j + 1] * cb[i + 2][0],si[0][j + 1], si[0][j + 1] * si[i + 2][0], si[0][j + 1] * sq[i + 2][0], si[0][j + 1] * cb[i + 2][0],1, si[i + 2][0], sq[i + 2][0], cb[i + 2][0] , si[i + 2][j + 1] },//15
139
139
  { cb[0][j + 2],cb[0][j + 2] * si[i + 2][0],cb[0][j + 2] * sq[i + 2][0],cb[0][j + 2] * cb[i + 2][0],sq[0][j + 2], sq[0][j + 2] * si[i + 2][0], sq[0][j + 2] * sq[i + 2][0], sq[0][j + 2] * cb[i + 2][0],si[0][j + 2], si[0][j + 2] * si[i + 2][0], si[0][j + 2] * sq[i + 2][0], si[0][j + 2] * cb[i + 2][0], 1, si[i + 2][0], sq[i + 2][0], cb[i + 2][0],si[i + 2][j + 2] },//16
140
- };//この部分の係数の入力ミスは大丈夫そうです
140
+ };
141
141
 
142
- for (int i = 0; i<16; i++) {
142
+ for (int ii = 0; ii<16; ii++) {
143
- int maxLine = i;
143
+ int maxLine = ii;
144
- for (int j = i; j<16; j++) if (abs(z[maxLine][i])<abs(z[j][i])) maxLine = j;
144
+ for (int j = ii; j<16; j++) if (abs(z[maxLine][ii])<abs(z[j][ii])) maxLine = j;
145
- for (int j = i; j <= 16; j++) swap(z[i][j], z[maxLine][j]);
145
+ for (int j = ii; j <= 16; j++) swap(z[ii][j], z[maxLine][j]);
146
146
 
147
- double beginNum = z[i][i];
147
+ double beginNum = z[ii][ii];
148
148
  if (!beginNum) {
149
149
  cout << "can not calc" << endl;
150
150
  return 0;
151
151
  }
152
152
 
153
- for (int j = i; j <= 16; j++)z[i][j] /= beginNum;
153
+ for (int j = ii; j <= 16; j++)z[ii][j] /= beginNum;
154
154
 
155
- for (int j = i + 1; j<16; j++) {
155
+ for (int j = ii + 1; j<16; j++) {
156
- double beginDelete = z[j][i];
156
+ double beginDelete = z[j][ii];
157
- for (int k = i; k <= 16; k++)z[j][k] -= beginDelete*z[i][k];
157
+ for (int k = ii; k <= 16; k++)z[j][k] -= beginDelete*z[ii][k];
158
158
  }
159
159
  }
160
- for (int i = 15; i >= 0; i--) {
160
+ for (int ii = 15; ii >= 0; ii--) {
161
- for (int j = i + 1; j<16; j++)z[i][16] -= z[j][16] * z[i][j];
161
+ for (int j = ii + 1; j<16; j++)z[ii][16] -= z[j][16] * z[ii][j];
162
162
  }
163
163
  a[i][j] = z[0][16];
164
164
  b[i][j] = z[1][16];
@@ -191,4 +191,6 @@
191
191
  }
192
192
 
193
193
 
194
+
195
+
194
196
  ```

2

リンクの編集

2020/09/07 10:42

投稿

Kinsho
Kinsho

スコア18

title CHANGED
File without changes
body CHANGED
@@ -1,8 +1,8 @@
1
1
  C++で2次元の3次スプライン補間を行おうと考えています.
2
- 元々のcsvはこのBx.csv(https://drive.google.com/file/d/1vcpLAAZIc6EL4QZ8YTfYthSwZu7UqGWR/view?usp=sharing)というファイルを使用します.
2
+ 元々のcsvはこのBx.csv( https://drive.google.com/file/d/1vcpLAAZIc6EL4QZ8YTfYthSwZu7UqGWR/view?usp=sharing )というファイルを使用します.
3
3
  このファイルの1行目がx座標,1列目がy座標を表しています.
4
4
  それを2乗3乗した2次元配列を作成しそれを基に16本の連立方程式を作り,それを解くことによって0.01×0.01の各マス内における3次スプライン補間式の係数を導出したいです.
5
- 添付プログラム序盤のcsvの読み取りはこちら(https://teratail.com/questions/289856)を,連立方程式の解き方はこちら(https://qiita.com/kubo_programmer/items/c42ec88bdba3c5c0919f)を参考にさせていただきました.
5
+ 添付プログラム序盤のcsvの読み取りはこちら( https://teratail.com/questions/289856 )を,連立方程式の解き方はこちら( https://qiita.com/kubo_programmer/items/c42ec88bdba3c5c0919f )を参考にさせていただきました.
6
6
 
7
7
  ここで2重forループを入れるまでならプログラムは問題なく動き,sq[][],cb[][]にも無事に数字が格納されています.しかしこのforループを動かすとセグメンテーション違反とのエラーが出てきてしまい,調べてもエラー内容がよくわかりません.
8
8
 

1

書式の更新

2020/09/07 10:17

投稿

Kinsho
Kinsho

スコア18

title CHANGED
File without changes
body CHANGED
File without changes