質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

1210閲覧

数値計算の結果から測定値にフィットするパラメータを探索したい

退会済みユーザー

退会済みユーザー

総合スコア0

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

2クリップ

投稿2021/05/03 03:09

編集2021/05/03 07:54

前提・実現したいこと

研究用途として、数値計算のプログラムを作成しています。
解析的には解くことができない偏微分方程式の数値計算の結果として、下の表のように時間ステップt=0, 1, 2,..., iごとの計算結果yのリストが格納されたresult.csvファイルが出力されています。

t\x01...20
0y[0,0]y[0,1]...y[0,20]
1y[1,0]y[1,1]...y[1,20]
2y[2,0]y[2,1]...y[2,20]
...
iy[i,0]y[i,1]...y[i,20]

一方、実データdata.csvは下記のような形式になっています。

x0.000.741.08...19.39
y372459...43

この結果から、実データを最も適切に説明する時間tを探索する方法を実装しようとしています。

発生している問題

例えば以下のようにして、時間ステップごとの測定値-数値計算の結果の残差二乗和を計算し、その最小値をmin()で探せば良いと考えました。

python

1import numpy as np 2import pandas as pd 3 4df_result = pd.read_csv("result.csv", index_col=0).values 5df_data = pd.read_csv("data.csv", index_col=0).iloc[0].values 6list_rsds = [] 7for i in range(df_result.shape[0]): 8 rsd_sum = 0 9 for j in range(len(df_data)): 10 rsd_sq = (df_data[j] - df_result[i, j])**2 11 rsd_sum += rsd_sq 12 list_rsds.append(rsd_sum) 13print(list_rsds.index(min(list_rsds)))

しかし、実データのx座標の値が等間隔ではないため、数値計算の結果と実データのx座標が異なり(定数倍ですらない)、直接残差を計算することができません。

試したこと

「パラメータフィッティング python」等で検索しましたが、フィッティングする関数が予め与えられている場合がヒットしました。
補間やカーブフィッティングなどの最適化
しかし、数値計算の結果のような離散値をどのように扱うべきか分かりませんでした。

解決案として、

  1. 測定値を線形補間して2点間の直線の式を求め、数値計算のx座標の値を代入->残差を計算する
  2. 数値計算の値を何らかの多変数関数として表現し、その関数を用いてパラメータフィッティングを行う

~~
といったことを考えているのですが、このような方針がそもそも適切なのか、どのように実装するのが良いのか方針が立っておりません。~~
1で示した方法についてコードを書いてみましたが、もう少しうまいやり方があるような気がするのでアドバイスを頂けると幸いです。

python

1# 直線の式y = a * x + bのa, bを計算してparamsとして出力 2def calc_param(result): 3 dx = 1 / len(result) 4 result_distance = np.linspace(0,1,len(result),endpoint=True) # x座標を0-1に規格化している 5 params = np.zeros([len(result)-1, 2]) 6 for j in range(len(result)-1): 7 a = (result[j+1] - result[j]) / dx 8 b = result[j] - j * dx 9 params[j] = [a,b] 10 return params, result_x 11 12def main(): 13 df_result = pd.read_csv("result.csv", index_col=0).values 14 15 data_value = [37, 24, 59,..., 43] 16 data_x = [0, 0.74, 1.08,..., 19.39] 17 18 # x座標の規格化 19 data_x = data_x / max(data_x) 20 21 # 計算 22 list_reses = [] 23 for i in range(len(df_result)): 24 result = df_result[i] 25 params, result_x = calc_param(result) 26 reses = 0 27 #print(len(result_x)) 28 # 数値計算のx座標を順番に入力 29 for m in range(len(result_x)-1): 30 # 分析値のx座標を順番に入力 31 for n in range(len(data_x)): 32 # もし範囲内にあれば内挿して残差二乗を計算 33 # 末尾は規格化して1なのでresult_x[m+1]==data_x[n] 34 if ( result_x[m] <= data_x[n] < result_x[m+1] ) \ 35 or (result_x[m+1] == data_x[n]): 36 f = params[m,0] * data_x[n] + params[m,1] 37 res = (f - data_value[n]) ** 2 38 reses += res 39 else: 40 pass 41 list_reses.append(reses) 42 print(list_reses.index(min(list_reses))) 43if __name__ == '__main__': 44 main()

補足情報(FW/ツールのバージョンなど)

  • OS: Windows 10 Home
  • Python 3.8.5

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

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

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

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

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

hayataka2049

2021/05/03 03:42

研究ですと、数値計算側で測定データのxに合わせてデータを吐くか、数値計算のxに合わせて測定するかが一番無難では? 論文の書きやすさで言えば。
退会済みユーザー

退会済みユーザー

2021/05/03 03:52 編集

天然物を扱っているため、測定点を等間隔に取るのが難しく、このような形になっています。数値計算の際の⊿xを測定点に合わせて可変にすることも検討いたしましたが、計算量が多くなってしまうためフィッティングの方法を工夫する方向でできないか考えています。
guest

回答3

0

とりあえず,「差」をy値の差だけで見て良い話なのだとすれば,
実データのx値に

偏微分方程式の数値計算の結果

のx値を合わせればよいだけに思えます.
そうしない理由が全くわかりません.


「何故かxが実データと合わされていない数値計算の結果」 から 
「実データの各x値におけるy値」をどうにかして用意してやる,のだとして,

そのための方法が
スプライン補間なのか多項式当てはめ等になるのか,その他なのか…?
どんな方法が「適切」のかは扱っている関数の意味や形状に依存するでしょうけども,
いずれにせよ,
そのようにして適当に値を補間(?)してやること自体の正当性に関して十分な説得力が必要に思います.

投稿2021/05/04 08:28

fana

総合スコア11658

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

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

fana

2021/05/04 08:34

xが1刻みというのが,十分に「細かい」データなのであって, x=1 と x=0.74 や x=1.08 との差というのが十分に「微小」と言えるスケール感(?)なのかな…?
退会済みユーザー

退会済みユーザー

2021/05/04 08:44 編集

回答ありがとうございます。コメントの認識の通りです。 前者のアプローチを取れないのは実データのx値が等間隔には引けないためです。 後者に関しては線形補完が適切だろうと考えています。
fana

2021/05/04 08:52

これ以上細かく数値計算すること と 補間すること との間にはもはや意味のある差はない,と言える状態なら,補間しても良いのかも.
fana

2021/05/04 08:58

(ここでは「数値計算」自体の精度には問題が無いのだとして) もう少し刻み幅を小さくして(1/2とか1/4とか?)やってみたやつと,現状の1刻みの値から補間した値との差くらいは見ておいた方がよいかもしれません.念のため.
退会済みユーザー

退会済みユーザー

2021/05/04 09:07

アドバイスありがとうございます。詳細はここに書けないのですが、少なく見積もって1σ=0.5以上は誤差がつくので測定値も計算値も十分に細いだろうとラボ内では考えています。より細かくした場合については時間ステップとの兼ね合いもありますが検討したいと思います。
guest

0

scipyなどを使えば離散値のカーブフィッティング自体はなんとでも出来そうですが、フィッティングすること自体の意味については、研究内容によると思うので、同じ研究室の方などと相談される方がいいと思います。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html
https://qiita.com/maskot1977/items/e4f5f71200180865986e

投稿2021/05/03 05:38

hide5stm

総合スコア426

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

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

退会済みユーザー

退会済みユーザー

2021/05/03 06:02 編集

回答ありがとうございます。(質問内容がうまく伝わっていないか私の知識不足でScipyを誤解しているかもしれないので確認したいのですが)「試したこと」の項で上げた2つの解決策のうち、前者(測定値を線形補間)はあまり現実的ではないということでしょうか?ドキュメントを読む限りでは、何らかの関数を用意する必要があるように思われるので。数値計算の内容は解析的には解けない偏微分方程式になっていて、関数の形で表すことはできません。※わかりにくい文章になっていたため追記しました。すみません
hide5stm

2021/05/03 06:08

フィッティング自体は、線形でも非線形でも、scipyなどを駆使すればいくらでも出来ると思います。 データが何関数でフィッティングされるべきかは、研究内容がわかる人しかわからないですし、 プログラミングの領域からも外れていきます。
退会済みユーザー

退会済みユーザー

2021/05/03 08:05

ありがとうございます。Scipyは使ったことがないので、ドキュメントをもう少し読んで考えてみます。もしフィッティングをする場合は、どのような関数を使うべきかに関してはこちらでしっかりと判断したいと思います。 ※整理がついておらず、質問がピンぼけになっていました。線形補間による一応の案を追記いたしました(当初の質問内容からかなり外れてしまったので、お忙しければスルーしていただいて結構です)
guest

0

ベストアンサー

追記したコードで「1. 線形補間した上で残差を計算」は達成できるので自己解決とさせていただきます

投稿2021/05/05 12:11

編集2021/05/05 12:11
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問