1

複素数のデータ セットがあり、そのデータに最適なパラメーターを見つけたいと考えています。Python で scipy によって実装されているように、leastsq を使用してデータを複素数に適合させることはできますか?

たとえば、私のコードは次のようなものです。

 import cmath
 from scipy.optimize import leastsq
 def residuals(p,y,x):
      L,Rs,R1,C=p
      denominator=1+(x**2)*(C**2)*(R1**2)
      sim=complex(Rs+R1/denominator,x*L-(R1**2)*x*C/denominator)
      return(y-sim)

 z=<read in data, store as complex number>
 x0=np.array[1, 2, 3, 4]
 res = leastsq(residuals,x0, args=(z,x))

ただし、residuals複素数を操作するのが好きではないため、次のエラーが表示されます。

File "/tmp/tmp8_rHYR/___code___.py", line 63, in residuals
    sim=complex(Rs+R1/denominator,x*L-(R1**_sage_const_2 )*x*C/denominator)
  File "expression.pyx", line 1071, in sage.symbolic.expression.Expression.__complex__ (sage/symbolic/expression.cpp:7112)
TypeError: unable to simplify to complex approximation

複素数ではなく、float/double のみを使用する必要があると思います。その場合、実数部と複素数部を別々に評価し、それらを 1 つのエラー メトリックにまとめてresiduals返すにはどうすればよいでしょうか?

4

1 に答える 1

2

scipy の最小二乗関数は、複素数値を比較するのが難しいため、実際の残差を返したいと考えています (たとえば、1+2j は 2+1j より大きいか小さいか?)。残差は本質的に、渡された一連のパラメーターの品質の尺度であることを思い出してください。それは、真の適合にどれだけ近いかを leastsq に伝えます。

あなたができることは、残差関数で「sim」を計算した後にこれらの行を追加して、直交に誤差(y-sim)を追加することです:

a = y-sim
return a.real**2 + a.imag**2

y と sim が両方とも複合体の np.array である限り、これは機能し、比較的効率的です。

于 2013-01-14T22:35:38.393 に答える