118 lines
3.3 KiB
Python
118 lines
3.3 KiB
Python
from core.orthonormal_basis import generate_laguerre_basis
|
|
from core.sk_iter import generate_starting_poles
|
|
import numpy as np
|
|
import skrf as rf
|
|
import matplotlib.pyplot as plt
|
|
import sympy as sp
|
|
from scipy.linalg import null_space
|
|
|
|
|
|
network = rf.Network("/tmp/paramer/simulation/4000/4000.s2p")
|
|
freqs = network.f
|
|
s = freqs * 2j * np.pi
|
|
vf = rf.VectorFitting(network)
|
|
vf.vector_fit(n_poles_real=2, n_poles_cmplx=1,parameter_type="y")
|
|
|
|
poles = vf.poles
|
|
residues = vf.residues
|
|
y = vf.network.y
|
|
|
|
fig, ax = plt.subplots(2, 2)
|
|
fig.set_size_inches(12, 8)
|
|
vf.plot("mag",0,0,freqs,ax=ax[0][0],parameter="y")
|
|
rms_error11 = vf.get_rms_error(0,0,"y")
|
|
print("rms_error11",rms_error11)
|
|
vf.plot("mag",1,0,freqs,ax=ax[1][0],parameter="y")
|
|
rms_error21 = vf.get_rms_error(1,0,"y")
|
|
print("rms_error21",rms_error21)
|
|
vf.plot("mag",0,1,freqs,ax=ax[0][1],parameter="y")
|
|
rms_error12 = vf.get_rms_error(0,1,"y")
|
|
print("rms_error12",rms_error12)
|
|
vf.plot("mag",1,1,freqs,ax=ax[1][1],parameter="y")
|
|
rms_error22 = vf.get_rms_error(1,1,"y")
|
|
print("rms_error22",rms_error22)
|
|
fig.tight_layout()
|
|
plt.show()
|
|
plt.savefig(f"img.png")
|
|
|
|
diag_values = [y[i][0][0] for i in range(len(y))]
|
|
H = np.diag(diag_values)
|
|
P = 4
|
|
start_poles = generate_starting_poles(P,beta_min=1e8,beta_max=freqs[-1])
|
|
basis = generate_laguerre_basis(start_poles,s).T
|
|
print("start_poles",start_poles)
|
|
print("basis",basis)
|
|
|
|
# first step iteration
|
|
# A*x = b
|
|
|
|
A11 = np.real(basis)
|
|
print("A11 shape:",A11.shape)
|
|
A12 = np.real(- H @ basis[:,1:])
|
|
print("A12 shape:",A12.shape)
|
|
# print("A11",A11)
|
|
A21 = np.imag(basis)
|
|
print("A21 shape:",A21.shape)
|
|
A22 = np.imag(- H @ basis[:,1:])
|
|
print("A22 shape:",A22.shape)
|
|
A1 = np.hstack([A11,A12])
|
|
A2 = np.hstack([A21,A22])
|
|
A = np.vstack([A1,A2])
|
|
print ("A shape:",A.shape)
|
|
|
|
b1 = np.real(H @ basis[:,0])
|
|
b2 = np.imag(H @ basis[:,0])
|
|
b = np.hstack([b1,b2])
|
|
Q, R = np.linalg.qr(A, mode='reduced')
|
|
print("Q :",Q)
|
|
print("R :",R)
|
|
print("b shape:",b.shape)
|
|
# x = np.linalg.solve(R, Q.T @ b)
|
|
x_star, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
|
|
|
|
# print("x_qr",x_star)
|
|
print("residuals",residuals)
|
|
# print("rank",rank)
|
|
# print("s",s)
|
|
|
|
x_ne = np.linalg.inv(A.T @ A) @ A.T @ b
|
|
print("x_ne",x_ne)
|
|
|
|
# sk iteration
|
|
target_vec = np.array([1+0j] + list(x_ne[len(x_ne)//2+1:]))
|
|
D_t = basis @ target_vec
|
|
print("D_t",D_t)
|
|
K = 25
|
|
|
|
for i in range(K):
|
|
print(f"Iteration {i+1}/{K}")
|
|
A11 = np.real(basis / D_t[:, np.newaxis])
|
|
A12 = np.real(- H @ basis[:,1:] / D_t[:, np.newaxis])
|
|
A21 = np.imag(basis / D_t[:, np.newaxis])
|
|
A22 = np.imag(- H @ basis[:,1:] / D_t[:, np.newaxis])
|
|
A1 = np.hstack([A11,A12])
|
|
A2 = np.hstack([A21,A22])
|
|
A = np.vstack([A1,A2])
|
|
b1 = np.real(H @ basis[:,0])
|
|
b2 = np.imag(H @ basis[:,0])
|
|
b = np.hstack([b1,b2])
|
|
x_star, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
|
|
# print("x_lstsq",x_star)
|
|
# print("residuals",residuals)
|
|
# print("rank",rank)
|
|
# print("s",s)
|
|
x_ne = np.linalg.inv(A.T @ A) @ A.T @ b
|
|
# print("x_ne",x_ne)
|
|
target_vec = np.array([1+0j] + list(x_ne[len(x_ne)//2+1:]))
|
|
D_t_pre = D_t
|
|
D_t = basis @ target_vec
|
|
print("D_t/D_t_pre",np.linalg.norm(D_t)/np.linalg.norm(D_t_pre))
|
|
# print("D_t",D_t)
|
|
n_target_vec = np.array(list(x_ne[:len(x_ne)//2+1]))
|
|
N_t = basis @ n_target_vec
|
|
# print("H = N_t / D_t",np.linalg.norm(H - N_t / D_t)/np.linalg.norm(H))
|
|
|
|
|
|
|
|
|