質問編集履歴
9
エラーメッセージの修正
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
質問タイトルの変更
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
C++で2次元の3次スプライン補間.
|
1
|
+
C++で2次元の3次スプライン補間.方程式の解が不定の場合の対処法について
|
body
CHANGED
File without changes
|
7
配列のグローバル宣言.スタックの問題解消
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
|
-
|
8
|
+
おそらくcsvの中に値が十分に散らばっていない部分があり連立方程式の解が一位に定まらずエラーになってしまうのだと考えられます.
|
9
|
+
当然すべてのセルにとりあえず1を足すなどの処理は無意味で根本的な対策が必要みたいです.
|
8
10
|
|
9
|
-
|
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
|
-
|
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
|
-
|
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] }
|
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
コードの修正.文字の設定ミス
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;
|
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
コードの修正.文字の設定ミス
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;
|
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
コードの修正.文字の設定ミス
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
|
144
|
+
for (int jj = ii; jj<16; jj++) if (abs(z[maxLine][ii])<abs(z[jj][ii])) maxLine = jj;
|
145
|
-
for (int
|
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
|
153
|
+
for (int jj = ii; jj <= 16; jj++)z[ii][jj] /= beginNum;
|
154
154
|
|
155
|
-
for (int
|
155
|
+
for (int jj = ii + 1; jj<16; j++) {
|
156
|
-
double beginDelete = z[
|
156
|
+
double beginDelete = z[jj][ii];
|
157
|
-
for (int k = ii; k <= 16; k++)z[
|
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
|
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
コードの修正.文字の設定ミス
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
|
142
|
+
for (int ii = 0; ii<16; ii++) {
|
143
|
-
int maxLine =
|
143
|
+
int maxLine = ii;
|
144
|
-
for (int j =
|
144
|
+
for (int j = ii; j<16; j++) if (abs(z[maxLine][ii])<abs(z[j][ii])) maxLine = j;
|
145
|
-
for (int j =
|
145
|
+
for (int j = ii; j <= 16; j++) swap(z[ii][j], z[maxLine][j]);
|
146
146
|
|
147
|
-
double beginNum = z[
|
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 =
|
153
|
+
for (int j = ii; j <= 16; j++)z[ii][j] /= beginNum;
|
154
154
|
|
155
|
-
for (int j =
|
155
|
+
for (int j = ii + 1; j<16; j++) {
|
156
|
-
double beginDelete = z[j][
|
156
|
+
double beginDelete = z[j][ii];
|
157
|
-
for (int k =
|
157
|
+
for (int k = ii; k <= 16; k++)z[j][k] -= beginDelete*z[ii][k];
|
158
158
|
}
|
159
159
|
}
|
160
|
-
for (int
|
160
|
+
for (int ii = 15; ii >= 0; ii--) {
|
161
|
-
for (int 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
リンクの編集
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
書式の更新
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|