Pythonのscipy.optimize.least_squares()で複素数のデータを非線形の複素関数に最小二乗法でフィッティングする。
複素数のデータ、例えばSパラメータを入力にしたとき、あるパラメータを持つ出力関数(これも複素数、かつ普通は非線形)にフィッティングしたいことは良くある。が、scipyの最小二乗法でどうやるのかあまり書いてあるものをみたことがない。
とりあえずあまりスマートじゃないができるようになったので記録として残す。
ポイントは、複素数はoptimize.least_squaresで最小化できないので、いったん実数のラッパーを作ること。
こんな感じ。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import least_squares
# z2 = a (z1 - b)^2 + c という複素関数とする。
def fit_func(a, b, c, z1):
return a * (z1 - b)**2 + c
def res_func(a, b, c, z1, z2):
return fit_func(a, b, c, z1) - z2
#複素数を使うには実数のラッパーが必要
def res_func_wrap(param, x1, x2):
fwrap = res_func(param[0] + 1j*param[1], param[2] + 1j*param[3], param[4] + 1j*param[5],
x1[:,0]+1j*x1[:,1], x2[:,0]+1j*x2[:,1])
return fwrap.real ** 2 + fwrap.imag ** 2
#推定するa, b, c
a = 1 + 2j
b = -1 + 3j
c = -2 - 1j
#データはn点
n=1000
#z1 と z2を計算(乱数でばらつかせる)
z1 = np.zeros(n, dtype = complex)
z2 = np.zeros(n, dtype = complex)
for i in range(n):
z1[i] = (2 * np.random.rand() - 1) + 1j*(2 * np.random.rand() - 1)
z2[i] = fit_func(a, b, c, z1[i]) + 0.1*( (2 * np.random.rand() - 1) + 1j*(2 * np.random.rand() - 1) )
#実数のアレイに直す。
x1 = np.zeros((n,2))
x2 = np.zeros((n,2))
for i in range(n):
x1[i, 0] = z1[i].real
x1[i, 1] = z1[i].imag
x2[i, 0] = z2[i].real
x2[i, 1] = z2[i].imag
#初期値
initial_values = [0, 0, 0, 0, 0, 0]
res = least_squares(res_func_wrap, initial_values, args = (x1, x2))
print(res.x)
実行すると
[ 1.00113061 2.00065746 -1.00031483 2.9985901 -1.99946214 -1.00700744]
となった。実際は
[1,2,-1,3,-2,-1]
なのでちゃんとパラメータ推定できていそう。ただなんかもっさりしているので、もっといいやり方を誰か知っていたら教えてほしいなあ。
« NKODICE(んこダイス)というのを見て、キヨシ関数みたいだな、、、と思ったのでカシオの高精度計算サイトkeisan.casio.jpに”NKODICE(んこダイス)もどき”を作ってみた。5つがある配列になると??? Scratchでもやってみた。 | トップページ | 待ちに待ったアンデッドガール・マーダーファルス3を読んだ。期待通りめちゃくちゃ面白かった!人外・怪異・物の怪総出演のキャラものでもあり、超燃えるバトルものでもあり、何より青崎有吾さんらしい論理ミステリでトリック(と動機)に驚く! »
「日記・コラム・つぶやき」カテゴリの記事
- 高周波・RFニュース 2026年3月11日 STMicroelectronicsが新UWBチップ発表、Ericssonが主導のVICTOR6G発足、Silicon LabsのBluetooth SoCがBANFのタイヤモニタリングシステムに採用、京セラが新しい差動クロック水晶発振器を発表など(2026.03.11)
- 高周波・RFニュース 2026年3月10日 IEEE Microwave MagazineはHF-VHF-UHF特集、Pythonの高周波ライブラリscikit-rfがv1.11.0に、Samsung Galaxy S26 Ultra分解動画、フジクラが4000心SWR/WTC製品化、Perasoの60GHzモジュールが軍用ドローン識別に採用など(2026.03.10)
- RF Weekly Digest (Gemini 3.1 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ)2026/3/1-3/8(2026.03.08)
- MATLAB OnlineでAntenna ToolboxのantennaDesigner機能を使って様々なアンテナ(ホーン、フラクタル(スノーフレーク)パッチ、Vivaldi、誘電体共振器)のSパラメータ、指向性を計算する。(2026.03.11)
- MATLAB OnlineでAntenna ToolboxのantennaArrayDesigner機能を使って一行もスクリプトを書かずにパッチアンテナアレイを設計してSパラメータ、指向性などを計算する。1素子とちがって計算にはかなり時間がかかるのでとりあえず2素子のアレイで。(2026.03.09)
« NKODICE(んこダイス)というのを見て、キヨシ関数みたいだな、、、と思ったのでカシオの高精度計算サイトkeisan.casio.jpに”NKODICE(んこダイス)もどき”を作ってみた。5つがある配列になると??? Scratchでもやってみた。 | トップページ | 待ちに待ったアンデッドガール・マーダーファルス3を読んだ。期待通りめちゃくちゃ面白かった!人外・怪異・物の怪総出演のキャラものでもあり、超燃えるバトルものでもあり、何より青崎有吾さんらしい論理ミステリでトリック(と動機)に驚く! »



コメント