import numpy as np
def P2Rd(ab, angles):
  return ab * exp(1j*np.rad2deg(angles))
def R2Pd(z):
  return np.abs(z), np.angle(z, deg=True)
def P2R(ab, angles):
  return ab * exp(1j*angles)
def R2P(z):
  return np.abs(z), np.angle(z, deg=False)
def P2str(z):
  return '({0[0]:.3g}, {0[1]:.3g})'.format(z)


"""
Explanation: Pythonで複素数を扱う方法
まずは変換関数を定義しておく。
* P2R: 極形式(ラジアン)→直角座標形式
* R2P: 直角座標形式→極形式(ラジアン)
* P2Rd: 極形式(degree)→直角座標形式
* R2Pd: 直角座標形式→極形式(degree)
* P2str: 極形式を有効桁3桁のテキスト(string)に
注意点としてはどっちの角度表記かは自分の頭で管理する必要がある
End of explanation
"""


print(5j)
print(j5)

"""
Explanation: Pythonでの複素数
jを使う。「数字j」のように表現する"j数字"はエラーというか，"j数字"という変数と見做される。
End of explanation
"""


Z1 = 2*np.sqrt(3)+2j
Z2 = 3-3j*np.sqrt(3)
print('Z1+Z2=' , Z1+Z2, ',極形式(大きさ，偏角(degree))', R2Pd(Z1+Z2))
print('Z1-Z2=' , Z1-Z2, ',極形式(大きさ，偏角(degree))', R2Pd(Z1-Z2))
print('Z1*Z2=' , Z1*Z2, ',極形式(大きさ，偏角(degree))', R2Pd(Z1*Z2))
print('Z1/Z2=' , Z1/Z2, ',極形式(大きさ，偏角(degree))', R2Pd(Z1/Z2))
# formatを使うと桁数を少なくできる
# tupleを使っているので極形式はP2strでstringに変換して表示
print('Z1+Z2={:.3g}'.format(Z1+Z2))
print('Z1+Z2={:.3g}'.format(Z1+Z2), '極形式(大きさ，偏角(degree))=', P2str(R2Pd(Z1+Z2)))



"""
Explanation: 教科書の問題
$$ \dot{Z}_1=2\sqrt{3}+j2, \dot{Z}_2 = 3-j3\sqrt{3} $$のとき加減乗除を求めよ
End of explanation
"""


R=500
f=1e3
L=100e-3
C=50e-6
omega = 2*np.pi*f
Z = R + 1j * ( omega * L - 1/(omega * C))
print('Z={:.3g}'.format(Z))
print('極形式(大きさ，偏角(degree))=', P2str(R2Pd(Z)))

"""
Explanation: インピーダンスの計算
$$ \dot{Z}=R+j\left( \omega L - \frac{1}{\omega C} \right) $$
について，$R=500\Omega, f=1kHz, L=100mH, C=50\mu F$のとき$\dot{Z}$を求めよ。
End of explanation
"""


import numpy as np
A = [[10+20j, 20j], [20j, -10j]]
B = [100, 100j]

"""
Explanation: $ Ax=B $ を解く方法
$$
\left[\begin{array}{cc}
10+20j & 20j \
20j & -10j
\end{array} \right] \left[ \begin{array}{c}
x_1 \
x_2
\end{array} \right] = \left[ \begin{array}{c}
100\
100j
\end{array} \right]
$$
を$Ax=B$として考え，以下のようにA, Bを作る。
End of explanation
"""


delta = np.linalg.det(A)
print('Δ={:.3g}'.format(delta))

"""
Explanation: 行列式

行列式はnp.linalg.det(A)
End of explanation
"""


x = np.linalg.solve(A, B)
print('[A, B] = [{0[0]:.3g}, {0[1]:.3g}]'.format(x))
print('[A, B] =[', P2str(R2Pd(x[0])), ',', P2str(R2Pd(x[1])), ']')
#単にprint(x)としても答えは表示できる
print(x)

"""
Explanation: 解くときはsolve(A, B)
End of explanation
"""


