質問編集履歴

4

解決案1のコードを載せました

2021/05/03 07:54

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -88,15 +88,109 @@
88
88
 
89
89
  解決案として、
90
90
 
91
- - 測定値を線形補間して2点間の直線の式を求め、数値計算のx座標の値を代入->残差を計算する
91
+ 1. 測定値を線形補間して2点間の直線の式を求め、数値計算のx座標の値を代入->残差を計算する
92
-
92
+
93
- - 数値計算の値を何らかの多変数関数として表現し、その関数を用いてパラメータフィッティングを行う
93
+ 2. 数値計算の値を何らかの多変数関数として表現し、その関数を用いてパラメータフィッティングを行う
94
+
94
-
95
+ ~~
95
-
96
-
96
+
97
- といったことを考えているのですが、このような方針がそもそも適切なのか、どのように実装するのが良いのか方針が立っておりません。
97
+ といったことを考えているのですが、このような方針がそもそも適切なのか、どのように実装するのが良いのか方針が立っておりません。~~
98
+
98
-
99
+ 1で示した方法についてコードを書いてみましたが、もう少しうまいやり方があるような気がするのでアドバイスを頂けると幸いです。
100
+
101
+
102
+
99
-
103
+ ```python
104
+
105
+ # 直線の式y = a * x + bのa, bを計算してparamsとして出力
106
+
107
+ def calc_param(result):
108
+
109
+ dx = 1 / len(result)
110
+
111
+ result_distance = np.linspace(0,1,len(result),endpoint=True) # x座標を0-1に規格化している
112
+
113
+ params = np.zeros([len(result)-1, 2])
114
+
115
+ for j in range(len(result)-1):
116
+
117
+ a = (result[j+1] - result[j]) / dx
118
+
119
+ b = result[j] - j * dx
120
+
121
+ params[j] = [a,b]
122
+
123
+ return params, result_x
124
+
125
+
126
+
127
+ def main():
128
+
129
+ df_result = pd.read_csv("result.csv", index_col=0).values
130
+
131
+
132
+
133
+ data_value = [37, 24, 59,..., 43]
134
+
135
+ data_x = [0, 0.74, 1.08,..., 19.39]
136
+
137
+
138
+
139
+ # x座標の規格化
140
+
141
+ data_x = data_x / max(data_x)
142
+
143
+
144
+
145
+ # 計算
146
+
147
+ list_reses = []
148
+
149
+ for i in range(len(df_result)):
150
+
151
+ result = df_result[i]
152
+
153
+ params, result_x = calc_param(result)
154
+
155
+ reses = 0
156
+
157
+ #print(len(result_x))
158
+
159
+ # 数値計算のx座標を順番に入力
160
+
161
+ for m in range(len(result_x)-1):
162
+
163
+ # 分析値のx座標を順番に入力
164
+
165
+ for n in range(len(data_x)):
166
+
167
+ # もし範囲内にあれば内挿して残差二乗を計算
168
+
169
+ # 末尾は規格化して1なのでresult_x[m+1]==data_x[n]
170
+
171
+ if ( result_x[m] <= data_x[n] < result_x[m+1] ) \
172
+
173
+ or (result_x[m+1] == data_x[n]):
174
+
175
+ f = params[m,0] * data_x[n] + params[m,1]
176
+
177
+ res = (f - data_value[n]) ** 2
178
+
179
+ reses += res
180
+
181
+ else:
182
+
183
+ pass
184
+
185
+ list_reses.append(reses)
186
+
187
+ print(list_reses.index(min(list_reses)))
188
+
189
+ if __name__ == '__main__':
190
+
191
+ main()
192
+
193
+ ```
100
194
 
101
195
 
102
196
 

3

前提の説明を補いました

2021/05/03 07:53

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  研究用途として、数値計算のプログラムを作成しています。
4
4
 
5
- 数値計算の結果として、下の表のようにt=0, 1, 2,..., iごとの計算結果yのリストが格納された`result.csv`ファイルが出力されています。
5
+ 解析的には解くことができない偏微分方程式の数値計算の結果として、下の表のように時間ステップt=0, 1, 2,..., iごとの計算結果yのリストが格納された`result.csv`ファイルが出力されています。
6
6
 
7
7
 
8
8
 

2

解決案について修正

2021/05/03 06:05

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -86,9 +86,15 @@
86
86
 
87
87
 
88
88
 
89
- 解決案として、測定値を線形補間して2点間の直線の式を求め、数値計算のx座標の値を代入->残差を計算する
89
+ 解決案として、
90
90
 
91
+ - 測定値を線形補間して2点間の直線の式を求め、数値計算のx座標の値を代入->残差を計算する
92
+
93
+ - 数値計算の値を何らかの多変数関数として表現し、その関数を用いてパラメータフィッティングを行う
94
+
95
+
96
+
91
- といことができないか考えているのですが、このような方針がそもそも適切なのか、どのように実装するのが良いのか方針が立っておりません。
97
+ といったこと考えているのですが、このような方針がそもそも適切なのか、どのように実装するのが良いのか方針が立っておりません。
92
98
 
93
99
 
94
100
 

1

リンクを追加しました

2021/05/03 03:31

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -78,9 +78,15 @@
78
78
 
79
79
  ### 試したこと
80
80
 
81
- 「パラメータフィッティング python」等で検索しましたが、フィッティングする関数が予め与えられている場合が紹介されており、数値計算の結果のような離散値をどのように扱うべきか分かりせんでした。
81
+ 「パラメータフィッティング python」等で検索しましたが、フィッティングする関数が予め与えられている場合がヒットしました。
82
82
 
83
+ [補間やカーブフィッティングなどの最適化](https://qiita.com/maskot1977/items/256481012dcbbd41a49f)
84
+
85
+ しかし、数値計算の結果のような離散値をどのように扱うべきか分かりませんでした。
86
+
87
+
88
+
83
- 測定値を線形補間して2点間の直線の式を求め、数値計算のx座標の値を代入->残差を計算する
89
+ 解決案として、測定値を線形補間して2点間の直線の式を求め、数値計算のx座標の値を代入->残差を計算する
84
90
 
85
91
  ということができないか考えているのですが、このような方針がそもそも適切なのか、どのように実装するのが良いのか方針が立っておりません。
86
92