ダイオードI-V特性測定器作成:3-3. PC側ソフト設計 – Pythonで最小二乗法の指数関数近似
本記事の主旨
ダイオードI-V特性測定器(カーブトレーサ)作成のPC側ソフト上におけるPythonでの最小二乗法の指数関数近似について記す。
本記事の目的
本記事の目的を以下に記す。
- Pythonでの最小二乗法の指数関数近似のソースについての解説を記すこと
本記事の背景
ダイオードI-V特性測定器(カーブトレーサ)作成の中でPC側ソフトを作成したため、本記事でその部分的な解説をする。
本記事の位置づけ
以下の流れで作業説明と解説を行った。
記事に対応したリンクを添付した。
概要説明:ダイオードI-V特性測定器作成:0. 概要 | 工事中.com
- 取扱説明
- 回路設計
- ダイオードのI-V特性を手作業で確認
- 回路の実装
- 回路の実装(PWM平滑化)
- 回路の実装(PWM平滑化以外)
- PC側ソフト設計
- pySerialでUSBシリアル通信
- Matplotlibでのグラフ表示
- Pythonで最小二乗法の指数関数近似★現在のページ
- openpyxlでグラフ描画と最小二乗法の指数関数近似
- マイコン側ソフト設計
- Arduino Uno Rev3 / R4 Minima
- Raspberry Pi Pico / Pico 2
- 実験
- 1N4148の測定でマイコンとソースの組み合わせを比較
- 種々のダイオードを測定
- 種々の高精度ゲルマニウムダイオードを測定
- まとめと補足
理論
最小二乗法により指数関数近似ができることを示す。
指数関数近似した近似曲線が\(y = ae^{bx}\)であるとする。
これを変形すると、
\[\frac{y}{a} = e^{bx}\]
両辺対数をとると、
\[\log{\frac{y}{a}} = bx\]
両辺を入れ替えると、
\[bx = \log{\frac{y}{a}}\]
\[bx = \log{y} - \log{a}\]
ここで、\(x = X\)、\(\log{y} = Y\)とすると、
\[bX = Y - \log{a}\]
\[Y = bX + \log{a}\]
このとき、\(x\)と\(y\)をそれぞれ\(X\)と\(Y\)に変換して最小二乗法を使うことにより、\(b\)と\(\log{a}\)が求まる。
したがって、\(a\)と\(b\)が求まり、指数関数近似した近似曲線も求まる。
コードの全体
今回解説するコードの全体は、以下にアップロードした。
calc.py
計算用ソースファイル。
data.py
データクラス用ソースファイル。
コードの解説
最小二乗法の指数関数近似
以下のCalcIVExpRegFuncクラス内で実装した。
近似前処理
\(x\)を\(X\)に変換するのはそのままでよいが、\(y\)と\(Y\)に変換するためにNumpyのnumpy.log()関数で対数をとる。
tmp_xとtmp_yは、後述するscikit-learnのsklearn.linear_model.LinearRegression().fit()関数で使える形にする。
tmp_y = np.log(tmp_y) # 対数をとる
tmp_x = [[num] for num in tmp_x]
tmp_y = [[num] for num in tmp_y]
最小二乗法での近似
scikit-learnのsklearn.linear_model.LinearRegression().fit()関数で、最小二乗法を使用して線形近似する。
reg = LinearRegression().fit(tmp_x, tmp_y) # 最小二乗法による線形近似、対数をとった観測値で行い、指数関数に戻す。
近似後処理
自作のIVExpRegGraphData()オブジェクトに入れて使いやすくする。
以下がIVExpRegGraphDataクラスである。
reg_result = IVExpRegGraphData(math.exp(reg.intercept_), reg.coef_[0][0], reg.score(tmp_x, tmp_y)) # 使いやすいように、近似結果のデータを一つにまとめる。
前回(3-2. PC側ソフト設計 - Matplotlibでのグラフ表示)
次回(3-4. PC側ソフト設計 - openpyxlでグラフ描画と最小二乗法の指数関数近似)
他の回
「ダイオードI-V特性測定器作成 連載記事」でタグ付けを行っている。
広告
最小二乗法Tシャツ。















ディスカッション
コメント一覧
まだ、コメントがありません