組み込み開発のためのPython · レッスン 126 / 238
SciPy Tutorial:科学技術計算を始める
SciPyは最適化、統計、信号処理などの科学技術計算を提供します。問題の単位や仮定を明示し、戻り値と収束状態を確認して結果を解釈します。
SciPyは最適化、統計、信号処理などの科学技術計算を提供します。問題の単位や仮定を明示し、戻り値と収束状態を確認して結果を解釈します。 仕組みだけでなく、検証方法と運用上の注意も具体例で確認します。
SciPyの位置付け
SciPyはNumPy配列を基盤として、最適化、積分、統計、信号処理、疎行列などの科学技術計算を提供するライブラリーです。目的に合う関数を使うことで、数値計算法を最初から実装する負担を減らせます。ただし、関数を呼べば科学的に妥当な結果が自動で得られるわけではありません。入力の単位、前提条件、許容誤差、収束状態を確認し、結果の意味を説明してください。導入時はNumPyとの対応版を含めて仮想環境へ固定し、別の環境で同じコードを実行できるよう依存関係を記録します。
配列、単位、次元を整える
SciPyの関数は多くの場合NumPy配列を受け取ります。入力が一次元か二次元か、値の並びが時間順か、単位が何かを先に明らかにしてください。例えば時間をミリ秒で渡すのか秒で渡すのかによって積分結果や周波数が変わります。単位を持たない数値として処理すると、誤った単位の組合せも計算できてしまいます。shape、dtype、有限値かどうかを検査する関数を用意すると、データの不備を数値計算の途中でなく入口で発見できます。例の入力だけでなく、空配列、極端な値、単位換算後の値でも確認しましょう。
数値積分で面積を求める
scipy.integrate.quadは一変数関数を指定範囲で数値積分し、積分値と誤差の推定値を返します。解析的な答えを求めにくい関数や、測定曲線から累積量を見積もる用途に使えます。返される誤差は指定条件下の推定であり、測定誤差やモデルの妥当性まで保証するものではありません。関数が積分範囲で連続か、特異点や急変部がないかを確認してください。既知の積分結果を持つ簡単な関数で実装を検証し、範囲と許容誤差を変えたときの結果も比較します。入力の単位と積分後に得られる単位を説明できるようにしましょう。
最適化関数の成功状態を確認する
scipy.optimizeには最小値を探す関数や方程式の根を求める関数があります。初期値、境界条件、目的関数の連続性によって結果が変わり、最適化が局所解へ到達する場合もあります。戻り値に含まれるsuccess、message、反復回数、目的関数値を確認し、成功フラグだけでなく解が制約を満たすか検証してください。単位の異なる変数を同時に最適化すると、尺度の差で探索が不安定になることがあります。初期値を変えた複数回の実行や、既知の簡単な問題で結果を比べます。目的関数の定義と停止条件を記録して再現性を確保します。
統計分布と推定を扱う
scipy.statsは確率分布、標本統計量、検定、乱数生成などを扱う機能を提供します。データがどの分布や仮定に従うと考えるのか、標本をどのように集めたのかを確認してください。p値だけを結果として報告すると、効果の大きさや不確実性が伝わりません。標本数、信頼区間、効果量、比較条件を併せて考える必要があります。検定を繰り返すと偶然の有意差が増えるため、多重比較や事前に定めた仮説の扱いも検討します。統計関数の引数が標本か母集団か、片側か両側かを確認してから解釈しましょう。
補間で欠けた値を推定する
補間は既知の点の間にある値を関数で推定します。scipy.interpolateには一次、スプラインなどの方法があり、滑らかさや端点の扱いが異なります。補間は観測していない値を実測値へ変えるものではなく、選んだモデルに基づく推定です。既知点の間だけを補間するのか、外側へ外挿するのかを区別し、外挿を無制限に行わないでください。時刻が重複していないか、入力が昇順か、欠測区間が過度に大きくないか確認します。推定値には補間方法と元データの範囲を添え、結果を別の検証点と比較します。
信号処理とフィルター
scipy.signalはフィルター設計、畳み込み、ピーク検出、スペクトル解析などを提供します。サンプリング周波数、ナイキスト周波数、信号の単位を誤ると、フィルターの遮断周波数や周波数軸が意味を失います。フィルターは位相や過渡応答を変化させることがあるため、処理前後の波形を比較してください。端点での処理、欠損区間、飽和値、ノイズの特性も結果に影響します。実信号へ適用する前に既知の正弦波や合成データで挙動を確かめ、パラメーターとバージョンを記録しましょう。フィルター後の値を元の観測と混同しない表示も重要です。
疎行列で大規模問題を扱う
疎行列はほとんどの要素がゼロである行列を、非ゼロ要素中心に保存する構造です。巨大な行列を通常の密な配列で保持すると、メモリーが不足する場合があります。scipy.sparseには演算に適した複数の形式があり、行方向・列方向のアクセス、要素の追加、行列積など用途によって効率が異なります。疎形式のままサポートされない操作では、意図せず密行列へ変換しないよう注意してください。非ゼロ要素数、shape、メモリー量を測り、密な形式との結果一致も小さい問題で検証します。入力行列が本当に疎かどうかも確認しましょう。
線形代数と条件の悪い問題
scipy.linalgは行列分解、固有値、連立方程式などを扱います。行列のshapeだけでなく、対称性、正則性、条件数などの性質が計算方法の選択に関係します。逆行列を明示的に計算して解を求めるより、専用の連立方程式ソルバーを使う方が数値的にも効率的にも適する場合があります。入力が特異またはほぼ特異なら、小さな測定誤差が解を大きく変える可能性があります。警告や例外を無視せず、残差を計算して解の品質を調べてください。単位やスケーリングをそろえることが安定性改善につながるか評価します。
許容誤差と浮動小数点
数値計算には有限精度の浮動小数点が使われます。許容誤差を厳しくしすぎると計算が収束しなかったり、不要に時間がかかったりする一方、緩すぎると目的に足りない精度を成功と扱うことがあります。アプリケーションに必要な精度を単位や安全余裕から決め、結果の有効桁を説明してください。絶対誤差と相対誤差は、値の大きさが異なる問題で適切さが違います。SciPyの関数が返す警告や誤差推定を含めて、結果が要求範囲に入るか判定します。許容誤差を変えた試験を行い、計算結果と実行時間の関係を記録しましょう。
再現性、依存関係、テスト
SciPyの数値結果を共有する場合、Python、NumPy、SciPyの版、OS、入力データ、パラメーターを記録します。乱数を使う処理では生成器とseedを制御し、同じ環境で結果が再現することをテストしてください。関数の出力を丸めた文字列だけで比較すると、小さな差や異常を見逃すことがあります。既知の解に対する数値許容差、境界ケース、入力検査、警告の発生を確認します。CI環境でも依存関係を固定し、開発PCだけで成功する状態を避けます。公開APIの変更は公式リリースノートを確認し、コード更新時に互換性を試験しましょう。
練習課題:測定データを分析する
電圧の時系列データを用意し、サンプリング間隔と単位を明記した上で、台形則による積分とフィルター処理を比較してください。合成信号を作って既知の周波数成分を加え、処理後にどの成分が残るかを確認します。次に測定点の間を補間し、実際に観測した点と推定点を図で区別します。無効値、重複時刻、サンプリング間隔の不均一、空の入力を試験対象に含めます。各関数の戻り値だけでなく、誤差推定や警告、パラメーターの根拠を報告し、科学的な結論を出す前に専門家や分野の公式資料と照合してください。
コード例
手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。
from scipy import integrate
area, error = integrate.quad(lambda x: x**2, 0.0, 1.0)
print(f"積分値={area:.6f}, 推定誤差={error:.2g}")手を動かす課題
既知の積分値を持つ関数を選び、数値積分の結果と誤差推定を解析解と比較してください。