feat: OVF formula 67
This commit is contained in:
128
main.py
128
main.py
@@ -1,15 +1,117 @@
|
||||
from models.capa import Capa
|
||||
W = []
|
||||
L = []
|
||||
i = 15.52
|
||||
|
||||
while i <= 100:
|
||||
W.append(i)
|
||||
L.append(i)
|
||||
i = int(i*1.05*100 +0.5) / 100.0
|
||||
|
||||
capa = Capa()
|
||||
capa.sweep(W,L)
|
||||
print(capa.network(result_dir=capa.results[0].result_dir,id=capa.results[0].id))
|
||||
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))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user