chore: 分离了sweep和vf部分,vf部分准备写为包
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -5,4 +5,5 @@ __pycache__/
|
||||
__pypackages__/
|
||||
env/
|
||||
.venv/
|
||||
.vscode/
|
||||
.vscode/
|
||||
outputs/
|
||||
12170
capa_results.json
12170
capa_results.json
File diff suppressed because it is too large
Load Diff
@@ -1,626 +0,0 @@
|
||||
import numpy as np
|
||||
from core.sk_iter import generate_starting_poles
|
||||
from scipy.linalg import block_diag
|
||||
import skrf as rf
|
||||
from skrf import VectorFitting
|
||||
from core.freqency import auto_select_multple_ports
|
||||
import matplotlib.pyplot as plt
|
||||
import random as rnd
|
||||
|
||||
def cond_row_inf(A, use_pinv=True):
|
||||
"""行条件数 κ∞(A) = ||A||∞ * ||A^{-1}||∞;矩形阵用广义逆。"""
|
||||
A = np.asarray(A)
|
||||
Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A)
|
||||
return np.linalg.norm(A, ord=np.inf) * np.linalg.norm(Ainv, ord=np.inf)
|
||||
|
||||
def cond_col_one(A, use_pinv=True):
|
||||
"""列条件数 κ1(A) = ||A||1 * ||A^{-1}||1;矩形阵用广义逆。"""
|
||||
A = np.asarray(A)
|
||||
Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A)
|
||||
return np.linalg.norm(A, ord=1) * np.linalg.norm(Ainv, ord=1)
|
||||
|
||||
class MultiPortOrthonormalBasis:
|
||||
def __init__(self,H,freqs,poles,weights=None,passivity=True,dc_enforce=True,fit_constant=True,fit_proportional=False):
|
||||
self.least_squares_condition = None
|
||||
self.least_squares_row_condition = None
|
||||
self.least_squares_col_condition = None
|
||||
self.least_squares_rms_error = None
|
||||
self.eigenval_condition = None
|
||||
self.eigenval_row_condition = None
|
||||
self.eigenval_col_condition = None
|
||||
self.eigenval_rms_error = None
|
||||
self.Cr = None
|
||||
|
||||
self.dc_tol = 1e-18
|
||||
|
||||
self.dc_enforce = dc_enforce
|
||||
self.fit_constant = fit_constant
|
||||
self.fit_proportional = fit_proportional
|
||||
|
||||
self.freqs = freqs
|
||||
self.H = H
|
||||
self.ports = H.shape[1]
|
||||
self.s = self.freqs * 2j * np.pi
|
||||
self.P = len(poles)
|
||||
self.poles = poles
|
||||
|
||||
self.Phi = self.generate_basis(self.s, self.poles)
|
||||
self.A = self.matrix_A(self.poles)
|
||||
self.B = self.vector_B(self.poles)
|
||||
self.C,self.w0,self.e = self.fit_denominator(self.H, weights=weights)
|
||||
self.D = self.w0
|
||||
|
||||
self.residuals = self.C / np.sqrt(2 * np.real(-np.array(self.poles)))
|
||||
|
||||
z = np.linalg.eigvals(self.A - self.B @ self.C)
|
||||
|
||||
if passivity:
|
||||
self.next_poles = self.passivity_enforce(z)
|
||||
else:
|
||||
self.next_poles = z
|
||||
|
||||
self.eigenval_condition,\
|
||||
self.eigenval_row_condition,\
|
||||
self.eigenval_col_condition,\
|
||||
self.eigenval_rms_error = self.eigen_metric()
|
||||
|
||||
self.Dt = self.eval_Dt_state_space()
|
||||
self.Dt_Dt_1 = np.linalg.norm(self.Dt) / np.linalg.norm(weights) if weights is not None else np.linalg.norm(self.Dt)
|
||||
pass
|
||||
|
||||
def eigen_metric(self):
|
||||
|
||||
"""Return condition number and RMS error of eigenvalues of A-BC."""
|
||||
z = np.linalg.eigvals(self.A - self.B @ self.C)
|
||||
cond = np.linalg.cond(self.A - self.B @ self.C)
|
||||
rms = np.sqrt(np.mean(np.abs(np.real(z) - np.real(self.poles))**2 + np.abs(np.imag(z) - np.imag(self.poles))**2))
|
||||
|
||||
row_cond = cond_row_inf(self.A - self.B @ self.C)
|
||||
col_cond = cond_col_one(self.A - self.B @ self.C)
|
||||
|
||||
return cond,row_cond,col_cond,rms
|
||||
|
||||
def least_squares_metric(self,A,b):
|
||||
"""Return condition number and RMS error of least-squares matrix A and rhs b."""
|
||||
cond = np.linalg.cond(A)
|
||||
rms = np.sqrt(np.mean((A @ np.linalg.pinv(A) @ b - b)**2))
|
||||
|
||||
row_cond = cond_row_inf(A)
|
||||
col_cond = cond_col_one(A)
|
||||
|
||||
return cond,row_cond,col_cond,rms
|
||||
|
||||
|
||||
def passivity_enforce(self,poles):
|
||||
"""enforce poles' real parts to be negative"""
|
||||
enforced_poles = []
|
||||
for pole in poles:
|
||||
if pole.real > 0:
|
||||
pole = -np.conj(pole)
|
||||
enforced_poles.append(pole)
|
||||
return enforced_poles
|
||||
|
||||
def eval_Dt_state_space(self):
|
||||
"""Return D(s_k)=C(s_k I - A)^(-1)B + D for all k (complex 1D array)."""
|
||||
s = 1j * 2*np.pi * np.asarray(self.freqs, float).ravel()
|
||||
A = np.asarray(self.A, float); n = A.shape[0]
|
||||
B = np.asarray(self.B, float).reshape(n, 1)
|
||||
C = np.asarray(self.C, float).reshape(1, n)
|
||||
D = self.D
|
||||
I = np.eye(n, dtype=float)
|
||||
out = np.empty_like(s, dtype=float)
|
||||
for k, sk in enumerate(s):
|
||||
DS = D + (C @ np.linalg.inv(sk*I - A) @ B)
|
||||
out[k] = DS[0, 0]
|
||||
return out
|
||||
|
||||
|
||||
def generate_basis(self,s, poles):
|
||||
"""Real basis of (15)-(16); returns Φ(s) and a layout for packing C."""
|
||||
def all_pass(s,ap_list):
|
||||
res = 1.0 +0.0j
|
||||
for ap in ap_list:
|
||||
res *= (s - np.conj(ap)) / (s + ap)
|
||||
return res
|
||||
|
||||
cols = []
|
||||
ap_list = []
|
||||
i = 0
|
||||
while i < len(poles):
|
||||
ap = -poles[i]
|
||||
if ap.real < 0:
|
||||
raise ValueError("poles must be in the LHP")
|
||||
if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(-ap)):
|
||||
ap1 = - poles[i+1]
|
||||
phi1 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s - np.abs(ap))/((s + ap)*(s + ap1)))
|
||||
phi2 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s + np.abs(ap))/((s + ap)*(s + ap1)))
|
||||
cols += [phi1, phi2]
|
||||
i += 2
|
||||
ap_list.append(ap)
|
||||
ap_list.append(ap1)
|
||||
else:
|
||||
basis = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * (1/(s + ap))
|
||||
cols.append(basis)
|
||||
i += 1
|
||||
ap_list.append(ap)
|
||||
Phi = np.column_stack(cols).astype(np.complex128)
|
||||
return Phi
|
||||
|
||||
def matrix_A(self, poles):
|
||||
def A_col(p:np.complex128,index:int):
|
||||
ap = -p
|
||||
if abs(ap.imag) < 1e-14:
|
||||
col = []
|
||||
for i in range(index):
|
||||
col.append(0.0)
|
||||
col.append(-ap.real)
|
||||
for i in range(len(poles)-index-1):
|
||||
col.append(2*(-ap).real)
|
||||
return np.array([col], float)
|
||||
else:
|
||||
col1 = []
|
||||
col2 = []
|
||||
for i in range(index):
|
||||
col1.append(0.0)
|
||||
col2.append(0.0)
|
||||
col1.append(-ap.real); col2.append(-ap.real - np.abs(ap))
|
||||
col1.append(-ap.real + np.abs(ap)); col2.append(-ap.real)
|
||||
for i in range(len(poles)-index-2):
|
||||
col1.append(2*(-ap).real)
|
||||
col2.append(2*(-ap).real)
|
||||
return np.array([col1, col2], float)
|
||||
|
||||
i = 0
|
||||
cols = []
|
||||
while i < len(poles):
|
||||
p = poles[i]
|
||||
cols.extend(A_col(p,i))
|
||||
if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(p)): i += 2
|
||||
else: i += 1
|
||||
A = np.column_stack(cols).astype(float)
|
||||
return A
|
||||
|
||||
def vector_B(self, poles):
|
||||
return np.ones((len(poles), 1), float)
|
||||
|
||||
def fit_denominator(self, H, weights=None, d0 = 1.0):
|
||||
"""
|
||||
Solve formula (70) on the real basis Φ to obtain:
|
||||
- d (real) → packs into C for this state's block structure
|
||||
- gamma (complex)
|
||||
Optional 'weights' (K,) apply row scaling: SK weighting if 1/|D_prev|.
|
||||
"""
|
||||
K, N = self.Phi.shape
|
||||
one = np.ones((K, 1), np.complex128)
|
||||
Phi = self.Phi
|
||||
dc_tol = 1e-18
|
||||
has_dc = self.dc_enforce and self.freqs[0] < dc_tol
|
||||
keep = np.ones(K, dtype=bool)
|
||||
|
||||
# SK weighting (applied only to the (73) rows we keep in LS)
|
||||
|
||||
if has_dc:
|
||||
# Enforce DC response exactly:
|
||||
k0 = int(np.argmin(np.abs(self.freqs)))
|
||||
keep[k0] = False
|
||||
|
||||
if self.fit_constant:
|
||||
Phi_w = np.hstack([one, Phi])
|
||||
index = 0
|
||||
M_kp = None
|
||||
for i in range(self.ports):
|
||||
for j in range(self.ports):
|
||||
M0 = np.zeros((K,N*self.ports**2),dtype=complex)
|
||||
M0[:,index*N:(index+1)*N] = Phi
|
||||
M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi_w)]).reshape((K, -1))[keep,:] # (K, 2N), complex
|
||||
index+=1
|
||||
M_kp = M0 if M_kp is None else np.vstack([M_kp, M0])
|
||||
assert M_kp is not None
|
||||
else:
|
||||
index = 0
|
||||
M_kp = None
|
||||
for i in range(self.ports):
|
||||
for j in range(self.ports):
|
||||
M0 = np.zeros((K,N*self.ports**2),dtype=complex)
|
||||
M0[:,index*N:(index+1)*N] = Phi
|
||||
M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi)]).reshape((K, -1))[keep,:] # (K, 2N), complex
|
||||
index+=1
|
||||
M_kp = M0 if M_kp is None else np.vstack([M_kp, M0])
|
||||
assert M_kp is not None
|
||||
|
||||
if weights is None:
|
||||
weights_kp = np.diag(np.ones(len(self.freqs[keep]) * self.ports**2, np.complex128))
|
||||
else:
|
||||
weights_kp0 = weights[keep]
|
||||
weights0 = []
|
||||
for i in range(self.ports **2 ):
|
||||
for res in weights_kp0:
|
||||
weights0.append(1/res)
|
||||
weights_kp = np.diag(np.array(weights0))
|
||||
|
||||
|
||||
if has_dc:
|
||||
M_w_kp = weights_kp @ M_kp
|
||||
A_re = np.real(M_w_kp)
|
||||
A_im = np.imag(M_w_kp)
|
||||
mask = np.ones(K, dtype=bool); mask[k0] = False
|
||||
# exact (unweighted) DC rows:
|
||||
# A_dc_re = np.real(M_kp).reshape(1, -1)
|
||||
# A_dc_im = np.imag(M_kp).reshape(1, -1)
|
||||
else:
|
||||
M_w_kp = weights_kp @ M_kp
|
||||
A_re = np.real(M_w_kp)
|
||||
A_im = np.imag(M_w_kp)
|
||||
# A_dc_re = A_dc_im = None
|
||||
|
||||
A_blocks = [A_re, A_im]
|
||||
|
||||
if self.fit_constant:
|
||||
Hk_sum = []
|
||||
for i in range(self.ports):
|
||||
Hk_sum.append([])
|
||||
for j in range(self.ports):
|
||||
Hk_kp0 = H[:,i,j][keep]
|
||||
Hk_sum[i].append(np.sum(np.abs(Hk_kp0)**2))
|
||||
# Hk_kp = Hk_kp0 if Hk_kp is None else np.hstack([Hk_kp, Hk_kp0])
|
||||
K_keep = int(np.count_nonzero(keep))
|
||||
A_w0 = []
|
||||
b_w0 = []
|
||||
# Hk_sum = np.sum(np.abs(Hk_kp)**2)
|
||||
for i in range(self.ports):
|
||||
for j in range(self.ports):
|
||||
beta_ij = float(np.sqrt(Hk_sum[i][j]))
|
||||
mean_row = (beta_ij / K_keep) * np.sum(Phi_w[keep, :], axis=0)
|
||||
A_w0.append(np.concatenate([np.zeros(N*self.ports**2, float),
|
||||
np.real(mean_row).astype(float)]
|
||||
).reshape(1, -1))
|
||||
b_w0.append(np.array([beta_ij], float))
|
||||
b_w0 = np.asarray(b_w0).ravel()
|
||||
|
||||
A_blocks += A_w0
|
||||
m = A_re.shape[0] + A_im.shape[0]
|
||||
b = np.zeros(m, float)
|
||||
b = np.concatenate([b, b_w0])
|
||||
else:
|
||||
H_kp = None
|
||||
for i in range(self.ports):
|
||||
for j in range(self.ports):
|
||||
H_0 = H[:,i,j][keep]
|
||||
H_kp = H_0 if H_kp is None else np.hstack([H_kp, H_0])
|
||||
assert H_kp is not None
|
||||
H_kp = weights_kp @ H_kp.reshape(-1,1)
|
||||
|
||||
b_re = np.real(d0 * H_kp)
|
||||
b_im = np.imag(d0 * H_kp)
|
||||
b = np.concatenate([b_re.ravel(), b_im.ravel()]).astype(float)
|
||||
|
||||
# ---- build final stacked-real system ----
|
||||
|
||||
|
||||
# if A_dc_re is not None:
|
||||
# A_blocks += [A_dc_re, A_dc_im]
|
||||
# b = np.concatenate([b, np.zeros(2, float)]) # DC rows → 0
|
||||
|
||||
# ---- QR solve for x = [c_H (N); c_w (N+1)] ----
|
||||
A = np.vstack(A_blocks).astype(float)
|
||||
Q, R = np.linalg.qr(A, mode="reduced")
|
||||
|
||||
if self.fit_constant:
|
||||
Q2 = Q[:,Phi.shape[1] * self.ports**2:]
|
||||
R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:]
|
||||
else:
|
||||
Q2 = Q[:,Phi.shape[1] * self.ports**2:]
|
||||
R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:]
|
||||
|
||||
x = np.linalg.solve(R22, Q2.T @ b)
|
||||
|
||||
# diagnostics
|
||||
resid = Q2 @ R22 @ x - b
|
||||
# self.least_squares_rms_error = float(np.sqrt(np.mean(resid**2)))
|
||||
# self.least_squares_condition = float(np.linalg.cond(R))
|
||||
self.least_squares_condition,\
|
||||
self.least_squares_row_condition,\
|
||||
self.least_squares_col_condition,\
|
||||
self.least_squares_rms_error = self.least_squares_metric(A, b)
|
||||
|
||||
return self.extract_C_d_e(x,N,d0)
|
||||
|
||||
def extract_C_d_e(self,C,N,d0=1.0):
|
||||
a = np.sqrt(2 * np.real(-np.array(self.poles)))
|
||||
if self.fit_proportional and self.fit_constant:
|
||||
d = C[1]
|
||||
e = C[0]
|
||||
C = a * C[2:]
|
||||
return C.reshape(1, -1), d, e
|
||||
elif self.fit_proportional and not self.fit_constant:
|
||||
d = 0.0
|
||||
e = C[0]
|
||||
C = a * C[1:]
|
||||
return C.reshape(1, -1), d, e
|
||||
elif not self.fit_proportional and self.fit_constant:
|
||||
d = C[0]
|
||||
e = 0.0
|
||||
C = a * C[1:]
|
||||
return C.reshape(1, -1), d, e
|
||||
else:
|
||||
C = a * C
|
||||
return C.reshape(1, -1), d0, 0.0
|
||||
|
||||
|
||||
def non_bias_Cr(self,w0):
|
||||
A = np.asarray(self.Phi)
|
||||
den = np.diag((w0 + self.Phi @ self.residuals.T).ravel())
|
||||
Cr = []
|
||||
for i in range(self.ports):
|
||||
Cr.append([])
|
||||
for j in range(self.ports):
|
||||
b = np.asarray(den) @ self.H[:,i,j].reshape(-1,1)
|
||||
Cr_ij, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
|
||||
Cr[i].append(Cr_ij)
|
||||
return Cr
|
||||
|
||||
def get_model_responses(self,freqs):
|
||||
H = np.zeros((len(freqs),self.ports,self.ports),dtype=complex)
|
||||
s = 1j * 2*np.pi * np.asarray(freqs, float).ravel()
|
||||
phi = self.generate_basis(s, self.poles)
|
||||
den = self.w0 + phi @ self.residuals.T
|
||||
if self.Cr is None:
|
||||
self.Cr = self.non_bias_Cr(w0=self.w0)
|
||||
for i in range(self.ports):
|
||||
for j in range(self.ports):
|
||||
num = phi @ self.Cr[i][j]
|
||||
H[:,i,j] = (num / den).reshape(1,-1)
|
||||
return H
|
||||
|
||||
class VFUtils():
|
||||
def __init__(self,npoles_cplx,freqs,H,model=MultiPortOrthonormalBasis,iterations:int=5):
|
||||
poles = generate_starting_poles(npoles_cplx,beta_min=1e4,beta_max=freqs[-1]*1.1)
|
||||
self.model=model(H=H,freqs=freqs,poles=poles)
|
||||
self.freqs=freqs
|
||||
self.H=H
|
||||
self.iterations=iterations
|
||||
|
||||
self.nports = H.shape[1]
|
||||
|
||||
self.least_squares_condition = []
|
||||
self.least_squares_row_condition = []
|
||||
self.least_squares_col_condition = []
|
||||
self.least_squares_rms_error = []
|
||||
self.eigenval_condition = []
|
||||
self.eigenval_row_condition = []
|
||||
self.eigenval_col_condition = []
|
||||
self.eigenval_rms_error = []
|
||||
|
||||
self.model_responses_freqs = None
|
||||
self.model_responses_H = None
|
||||
|
||||
def fit(self):
|
||||
for i in range(self.iterations):
|
||||
print(f"Iteration {i+1}/{self.iterations}")
|
||||
poles = self.model.next_poles
|
||||
weights = self.model.Dt
|
||||
self.model = self.model.__class__(H=self.H,freqs=self.freqs,poles=poles,weights=weights)
|
||||
print("A:",self.model.A)
|
||||
print("B:",self.model.B)
|
||||
print("C:",self.model.C)
|
||||
print("D:",self.model.D)
|
||||
print("next_pozles:",self.model.next_poles)
|
||||
print("Dt:",self.model.Dt)
|
||||
print("Dt/Dt_1:",np.linalg.norm(self.model.Dt_Dt_1))
|
||||
self.least_squares_condition.append(self.model.least_squares_condition)
|
||||
self.least_squares_row_condition.append(self.model.least_squares_row_condition)
|
||||
self.least_squares_col_condition.append(self.model.least_squares_col_condition)
|
||||
self.least_squares_rms_error.append(self.model.least_squares_rms_error)
|
||||
self.eigenval_condition.append(self.model.eigenval_condition)
|
||||
self.eigenval_row_condition.append(self.model.eigenval_row_condition)
|
||||
self.eigenval_col_condition.append(self.model.eigenval_col_condition)
|
||||
self.eigenval_rms_error.append(self.model.eigenval_rms_error)
|
||||
return self.model
|
||||
|
||||
def plot_metrics(self):
|
||||
plt.figure(figsize=(16, 12))
|
||||
plt.subplot(4, 2, 1)
|
||||
plt.plot(self.least_squares_condition, label='Least Squares Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 2)
|
||||
plt.plot(self.least_squares_row_condition, label='Least Squares Row Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 3)
|
||||
plt.plot(self.least_squares_col_condition, label='Least Squares Col Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 4)
|
||||
plt.plot(self.least_squares_rms_error, label='Least Squares RMS Error')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 5)
|
||||
plt.plot(self.eigenval_condition, label='Eigenvalue Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 6)
|
||||
plt.plot(self.eigenval_row_condition, label='Eigenvalue Row Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 7)
|
||||
plt.plot(self.eigenval_col_condition, label='Eigenvalue Col Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 8)
|
||||
plt.plot(self.eigenval_rms_error, label='Eigenvalue RMS Error')
|
||||
plt.legend()
|
||||
plt.savefig("fit_metrics.png")
|
||||
|
||||
def plot_model_responses(self):
|
||||
assert self.model_responses_freqs is not None and self.model_responses_H is not None, "Please run get_model_responses() first."
|
||||
for i in range(self.nports):
|
||||
for j in range(self.nports):
|
||||
plt.figure(figsize=(12, 6))
|
||||
plt.subplot(2, 2, 1)
|
||||
plt.plot(self.freqs, np.abs(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
|
||||
plt.plot(self.model_responses_freqs, np.abs(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
plt.title(f"Response i={i+1}, j={j+1}")
|
||||
plt.ylabel("Magnitude")
|
||||
plt.legend(loc="best")
|
||||
plt.subplot(2, 2, 2)
|
||||
plt.plot(self.freqs, np.angle(self.H[:,i,j],deg=True), 'o', ms=4, color='red', label='Input Samples')
|
||||
plt.plot(self.model_responses_freqs, np.angle(self.model_responses_H[:,i,j],deg=True), '-', lw=2, color='k', label='Fit')
|
||||
plt.title(f"Response i={i+1}, j={j+1}")
|
||||
plt.ylabel("Phase (deg)")
|
||||
plt.legend(loc="best")
|
||||
plt.tight_layout()
|
||||
plt.subplot(2, 2, 3)
|
||||
plt.plot(self.freqs, np.real(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
|
||||
plt.plot(self.model_responses_freqs, np.real(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
plt.title(f"Response i={i+1}, j={j+1}")
|
||||
plt.ylabel("Real Part")
|
||||
plt.legend(loc="best")
|
||||
plt.subplot(2, 2, 4)
|
||||
plt.plot(self.freqs, np.imag(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
|
||||
plt.plot(self.model_responses_freqs, np.imag(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
plt.title(f"Response i={i+1}, j={j+1}")
|
||||
plt.ylabel("Imag Part")
|
||||
plt.legend(loc="best")
|
||||
plt.tight_layout()
|
||||
plt.savefig(f"model_response_{i+1}{j+1}.png")
|
||||
print(f"Saved model_response_{i+1}{j+1}.png")
|
||||
|
||||
def get_model_responses(self,freqs):
|
||||
self.model_responses_freqs = freqs
|
||||
self.model_responses_H = self.model.get_model_responses(freqs)
|
||||
return self.model_responses_H
|
||||
|
||||
|
||||
def noise(n:complex,coeff:float=0.05):
|
||||
noise_r = rnd.gauss(-coeff * n.real, coeff * n.real)
|
||||
noise_i = rnd.gauss(-coeff * n.imag, coeff * n.imag)
|
||||
return complex(n.real + noise_r, n.imag + noise_i)
|
||||
|
||||
if __name__ == "__main__":
|
||||
start_point = 0
|
||||
id = 3000
|
||||
network = rf.Network(f"/tmp/paramer/simulation/{id}/{id}.s2p")
|
||||
# network = rf.data.ring_slot
|
||||
ports = network.nports
|
||||
K = 100
|
||||
|
||||
full_freqences = network.f[start_point:]
|
||||
noised_sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports)
|
||||
sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports)
|
||||
|
||||
# noised_sampled_points = network.y[start_point:,0,0].reshape(-1,1,1)
|
||||
# sampled_points = network.y[start_point:,0,0].reshape(-1,1,1)
|
||||
|
||||
H,freqs = auto_select_multple_ports(noised_sampled_points,full_freqences,max_points=20)
|
||||
poles = generate_starting_poles(2,beta_min=1e4,beta_max=freqs[-1]*1.1)
|
||||
|
||||
vf = VFUtils(npoles_cplx=2,freqs=freqs,H=H,model=MultiPortOrthonormalBasis,iterations=K)
|
||||
model = vf.fit()
|
||||
vf.plot_metrics()
|
||||
model_responses = vf.get_model_responses(full_freqences)
|
||||
vf.plot_model_responses()
|
||||
|
||||
# # Original plot functions
|
||||
|
||||
# Dt_1 = np.ones((len(freqs),1),np.complex128)
|
||||
# # Levi step (no weighting):
|
||||
# basis = MultiPortOrthonormalBasis(H,freqs,poles=poles)
|
||||
# Dt = basis.Dt
|
||||
# poles = basis.next_poles
|
||||
|
||||
# print("Levi step (no weighting):")
|
||||
# print("A:",basis.A)
|
||||
# print("B:",basis.B)
|
||||
# print("C:",basis.C)
|
||||
# print("D:",basis.D)
|
||||
# print("next_pozles:",basis.next_poles)
|
||||
# print("Dt:",Dt, "norm:",np.linalg.norm(Dt))
|
||||
|
||||
# # SK weighting (optional, after first pass):
|
||||
# least_squares_condition = []
|
||||
# least_squares_rms_error = []
|
||||
# eigenval_condition = []
|
||||
# eigenval_rms_error = []
|
||||
# for i in range(K):
|
||||
# basis = MultiPortOrthonormalBasis(H,freqs,poles=poles,weights=Dt)
|
||||
# Dt_1 = Dt
|
||||
# Dt = basis.Dt
|
||||
# poles = basis.next_poles
|
||||
# print(f"SK Iteration {i+1}/{K}")
|
||||
# print("A:",basis.A)
|
||||
# print("B:",basis.B)
|
||||
# print("C:",basis.C)
|
||||
# print("D:",basis.D)
|
||||
# print("z:",basis.next_poles)
|
||||
# print("Dt:",Dt)
|
||||
# print("Dt/Dt-1",np.linalg.norm(Dt) / np.linalg.norm(Dt_1))
|
||||
# least_squares_condition.append(basis.least_squares_condition)
|
||||
# least_squares_rms_error.append(basis.least_squares_rms_error)
|
||||
# eigenval_condition.append(basis.eigenval_condition)
|
||||
# eigenval_rms_error.append(basis.eigenval_rms_error)
|
||||
|
||||
# # H11_evaluated = basis.evaluate_pole_residue(network.f[1:],poles,basis.C[0])
|
||||
# H_evaluated = basis.get_model_responses(full_freqences)
|
||||
# fitted_points = H_evaluated
|
||||
# sliced_freqences = freqs
|
||||
|
||||
# input_points = H
|
||||
# for i in range(ports):
|
||||
# for j in range(ports):
|
||||
# fig, axes = plt.subplots(3, 2, figsize=(15, 16), sharex=False)
|
||||
# ax00 = axes[0][0]
|
||||
# ax00.plot(full_freqences, np.abs(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
|
||||
# ax00.plot(full_freqences, np.abs(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
# ax00.plot(sliced_freqences, np.abs(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
|
||||
# ax00.set_title(f"Response i={i+1}, j={j+1}")
|
||||
# ax00.set_ylabel("Magnitude")
|
||||
# ax00.legend(loc="best")
|
||||
|
||||
# ax01 = axes[0][1]
|
||||
# ax01.set_title(f"Response i={i+1}, j={j+1}")
|
||||
# ax01.set_ylabel("Phase (deg)")
|
||||
# ax01.plot(full_freqences, np.angle(sampled_points[:,i,j],deg=True), 'o', ms=4, color='red', label='Samples')
|
||||
# ax01.plot(full_freqences, np.angle(fitted_points[:,i,j],deg=True), '-', lw=2, color='k', label='Fit')
|
||||
# ax01.plot(sliced_freqences, np.angle(input_points[:,i,j],deg=True), 'x', ms=4, color='blue', label='Input Samples')
|
||||
# ax01.legend(loc="best")
|
||||
|
||||
# # ax00 = axes[0][0]
|
||||
# # ax00.plot(full_freqences, np.real(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
|
||||
# # ax00.plot(full_freqences, np.real(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
# # ax00.plot(sliced_freqences, np.real(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
|
||||
# # ax00.set_title(f"Response i={i+1}, j={j+1}")
|
||||
# # ax00.set_ylabel("Real Part")
|
||||
# # ax00.legend(loc="best")
|
||||
|
||||
# # ax01 = axes[0][1]
|
||||
# # ax01.set_title(f"Response i={i+1}, j={j+1}")
|
||||
# # ax01.set_ylabel("Imag Part")
|
||||
# # ax01.plot(full_freqences, np.imag(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
|
||||
# # ax01.plot(full_freqences, np.imag(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
# # ax01.plot(sliced_freqences, np.imag(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
|
||||
# # ax01.legend(loc="best")
|
||||
|
||||
# ax10 = axes[1][0]
|
||||
# ax10.plot(least_squares_condition, label='Least Squares Condition')
|
||||
# ax10.set_title("least_squares_condition")
|
||||
# ax10.set_ylabel("Magnitude")
|
||||
# ax10.legend(loc="best")
|
||||
|
||||
# ax11 = axes[1][1]
|
||||
# ax11.plot(least_squares_rms_error, label='Least Squares RMS Error')
|
||||
# ax11.set_title("least_squares_rms_error")
|
||||
# ax11.set_ylabel("Magnitude")
|
||||
# ax11.legend(loc="best")
|
||||
|
||||
# ax20 = axes[2][0]
|
||||
# ax20.plot(eigenval_condition, label='Eigenvalue Condition')
|
||||
# ax20.set_title("eigenval_condition")
|
||||
# ax20.set_ylabel("Magnitude")
|
||||
# ax20.legend(loc="best")
|
||||
|
||||
# ax21 = axes[2][1]
|
||||
# ax21.plot(eigenval_rms_error, label='Eigenvalue RMS Error')
|
||||
# ax21.set_title("eigenval_rms_error")
|
||||
# ax21.set_ylabel("Magnitude")
|
||||
# ax21.legend(loc="best")
|
||||
# fig.tight_layout()
|
||||
# plt.savefig(f"MultiplePortQR_port_{i+1}{j+1}.png")
|
||||
# print(f"Saved MultiplePortQR_port_{i+1}{j+1}.png")
|
||||
|
||||
|
||||
|
||||
|
||||
176
core/VFManager.py
Normal file
176
core/VFManager.py
Normal file
@@ -0,0 +1,176 @@
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
from .basis.MultiPortOrthonormalBasis import MultiPortOrthonormalBasis
|
||||
from .utils import generate_starting_poles
|
||||
|
||||
class VFManager():
|
||||
def __init__(
|
||||
self,
|
||||
npoles_cplx,
|
||||
freqs,
|
||||
H,
|
||||
model=MultiPortOrthonormalBasis,
|
||||
iterations:int=5,
|
||||
fit_constant:bool=True,
|
||||
fit_proportional:bool=False,
|
||||
dc_enforce:bool=False,
|
||||
passivity_enforce:bool=True,
|
||||
verbose:bool=True
|
||||
):
|
||||
|
||||
|
||||
self.freqs=freqs
|
||||
self.H=H
|
||||
self.iterations=iterations
|
||||
self.fit_constant=fit_constant
|
||||
self.fit_proportional=fit_proportional
|
||||
self.dc_enforce=dc_enforce
|
||||
self.passivity_enforce=passivity_enforce
|
||||
self.verbose=verbose
|
||||
|
||||
self.nports = H.shape[1]
|
||||
self.npoles_cplx = npoles_cplx
|
||||
|
||||
self.least_squares_condition = []
|
||||
self.least_squares_row_condition = []
|
||||
self.least_squares_col_condition = []
|
||||
self.least_squares_rms_error = []
|
||||
self.eigenval_condition = []
|
||||
self.eigenval_row_condition = []
|
||||
self.eigenval_col_condition = []
|
||||
self.eigenval_rms_error = []
|
||||
|
||||
self.model_instance = None
|
||||
self.model_responses_freqs = None
|
||||
self.model_responses_H = None
|
||||
|
||||
self.model=model
|
||||
|
||||
def fit(self):
|
||||
self.levi()
|
||||
self.model_instance = self.sk_iteration()
|
||||
return self.model
|
||||
|
||||
def levi(self):
|
||||
self.poles = generate_starting_poles(self.npoles_cplx,beta_min=1e4,beta_max=self.freqs[-1]*1.1)
|
||||
self.model_instance=self.model(
|
||||
H=self.H,
|
||||
freqs=self.freqs,
|
||||
poles=self.poles,
|
||||
fit_constant=self.fit_constant,
|
||||
fit_proportional=self.fit_proportional,
|
||||
dc_enforce=self.dc_enforce,
|
||||
passivity_enforce=self.passivity_enforce
|
||||
)
|
||||
return self.model_instance
|
||||
|
||||
def sk_iteration(self):
|
||||
for i in range(self.iterations):
|
||||
assert self.model_instance is not None ,"Please run levi() first."
|
||||
self.poles = self.model_instance.next_poles
|
||||
self.weights = self.model_instance.Dt
|
||||
self.model_instance = self.model(
|
||||
H=self.H,
|
||||
freqs=self.freqs,
|
||||
poles=self.poles,
|
||||
weights=self.weights,
|
||||
fit_constant=self.fit_constant,
|
||||
fit_proportional=self.fit_proportional,
|
||||
dc_enforce=self.dc_enforce,
|
||||
passivity_enforce=self.passivity_enforce
|
||||
)
|
||||
if self.verbose:
|
||||
print(f"Iteration {i+1}/{self.iterations}")
|
||||
print("A:",self.model_instance.A)
|
||||
print("B:",self.model_instance.B)
|
||||
print("C:",self.model_instance.C)
|
||||
print("D:",self.model_instance.D)
|
||||
print("next_pozles:",self.model_instance.next_poles)
|
||||
print("Dt:",self.model_instance.Dt)
|
||||
print("Dt/Dt_1:",np.linalg.norm(self.model_instance.Dt_Dt_1))
|
||||
self.least_squares_condition.append(self.model_instance.least_squares_condition)
|
||||
self.least_squares_row_condition.append(self.model_instance.least_squares_row_condition)
|
||||
self.least_squares_col_condition.append(self.model_instance.least_squares_col_condition)
|
||||
self.least_squares_rms_error.append(self.model_instance.least_squares_rms_error)
|
||||
self.eigenval_condition.append(self.model_instance.eigenval_condition)
|
||||
self.eigenval_row_condition.append(self.model_instance.eigenval_row_condition)
|
||||
self.eigenval_col_condition.append(self.model_instance.eigenval_col_condition)
|
||||
self.eigenval_rms_error.append(self.model_instance.eigenval_rms_error)
|
||||
return self.model_instance
|
||||
|
||||
def plot_metrics(self,show:bool=True,save_path=None):
|
||||
plt.figure(figsize=(16, 12))
|
||||
plt.subplot(4, 2, 1)
|
||||
plt.plot(self.least_squares_condition, label='Least Squares Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 2)
|
||||
plt.plot(self.least_squares_row_condition, label='Least Squares Row Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 3)
|
||||
plt.plot(self.least_squares_col_condition, label='Least Squares Col Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 4)
|
||||
plt.plot(self.least_squares_rms_error, label='Least Squares RMS Error')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 5)
|
||||
plt.plot(self.eigenval_condition, label='Eigenvalue Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 6)
|
||||
plt.plot(self.eigenval_row_condition, label='Eigenvalue Row Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 7)
|
||||
plt.plot(self.eigenval_col_condition, label='Eigenvalue Col Condition')
|
||||
plt.legend()
|
||||
plt.subplot(4, 2, 8)
|
||||
plt.plot(self.eigenval_rms_error, label='Eigenvalue RMS Error')
|
||||
plt.legend()
|
||||
if show:
|
||||
plt.show()
|
||||
if save_path is not None:
|
||||
if self.verbose:
|
||||
print(f"Saving metrics plot to {save_path}/fitting_metrics.png")
|
||||
plt.savefig(f"{save_path}/fitting_metrics.png")
|
||||
|
||||
def plot_model_responses(self,show:bool=True,save_path=None):
|
||||
assert self.model_responses_freqs is not None and self.model_responses_H is not None, "Please run get_model_responses() first."
|
||||
for i in range(self.nports):
|
||||
for j in range(self.nports):
|
||||
plt.figure(figsize=(12, 6))
|
||||
plt.subplot(2, 2, 1)
|
||||
plt.plot(self.freqs, np.abs(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
|
||||
plt.plot(self.model_responses_freqs, np.abs(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
plt.title(f"Response i={i+1}, j={j+1}")
|
||||
plt.ylabel("Magnitude")
|
||||
plt.legend(loc="best")
|
||||
plt.subplot(2, 2, 2)
|
||||
plt.plot(self.freqs, np.angle(self.H[:,i,j],deg=True), 'o', ms=4, color='red', label='Input Samples')
|
||||
plt.plot(self.model_responses_freqs, np.angle(self.model_responses_H[:,i,j],deg=True), '-', lw=2, color='k', label='Fit')
|
||||
plt.title(f"Response i={i+1}, j={j+1}")
|
||||
plt.ylabel("Phase (deg)")
|
||||
plt.legend(loc="best")
|
||||
plt.tight_layout()
|
||||
plt.subplot(2, 2, 3)
|
||||
plt.plot(self.freqs, np.real(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
|
||||
plt.plot(self.model_responses_freqs, np.real(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
plt.title(f"Response i={i+1}, j={j+1}")
|
||||
plt.ylabel("Real Part")
|
||||
plt.legend(loc="best")
|
||||
plt.subplot(2, 2, 4)
|
||||
plt.plot(self.freqs, np.imag(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples')
|
||||
plt.plot(self.model_responses_freqs, np.imag(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
plt.title(f"Response i={i+1}, j={j+1}")
|
||||
plt.ylabel("Imag Part")
|
||||
plt.legend(loc="best")
|
||||
plt.tight_layout()
|
||||
if show:
|
||||
plt.show()
|
||||
if save_path is not None:
|
||||
if self.verbose:
|
||||
print(f"Saving response plot for port {i+1},{j+1} to {save_path}/response_{i+1}_{j+1}.png")
|
||||
plt.savefig(f"{save_path}/response_{i+1}_{j+1}.png")
|
||||
|
||||
def get_model_responses(self,freqs):
|
||||
assert self.model_instance is not None ,"Please run levi() and sk_iteration() first."
|
||||
self.model_responses_freqs = freqs
|
||||
self.model_responses_H = self.model_instance.get_model_responses(freqs)
|
||||
return self.model_responses_H
|
||||
362
core/basis/MultiPortOrthonormalBasis.py
Normal file
362
core/basis/MultiPortOrthonormalBasis.py
Normal file
@@ -0,0 +1,362 @@
|
||||
import numpy as np
|
||||
import skrf as rf
|
||||
from ..utils import cond_row_inf, cond_col_one, generate_starting_poles
|
||||
|
||||
|
||||
class MultiPortOrthonormalBasis:
|
||||
def __init__(self,H,freqs,poles,weights=None,passivity_enforce=True,dc_enforce=True,fit_constant=True,fit_proportional=False):
|
||||
self.least_squares_condition = None
|
||||
self.least_squares_row_condition = None
|
||||
self.least_squares_col_condition = None
|
||||
self.least_squares_rms_error = None
|
||||
self.eigenval_condition = None
|
||||
self.eigenval_row_condition = None
|
||||
self.eigenval_col_condition = None
|
||||
self.eigenval_rms_error = None
|
||||
self.Cr = None
|
||||
|
||||
self.dc_tol = 1e-18
|
||||
|
||||
self.dc_enforce = dc_enforce
|
||||
self.fit_constant = fit_constant
|
||||
self.fit_proportional = fit_proportional
|
||||
|
||||
self.freqs = freqs
|
||||
self.H = H
|
||||
self.ports = H.shape[1]
|
||||
self.s = self.freqs * 2j * np.pi
|
||||
self.P = len(poles)
|
||||
self.poles = poles
|
||||
|
||||
self.Phi = self.generate_basis(self.s, self.poles)
|
||||
self.A = self.matrix_A(self.poles)
|
||||
self.B = self.vector_B(self.poles)
|
||||
self.C,self.w0,self.e = self.fit_denominator(self.H, weights=weights)
|
||||
self.D = self.w0
|
||||
|
||||
self.residuals = self.C / np.sqrt(2 * np.real(-np.array(self.poles)))
|
||||
|
||||
z = np.linalg.eigvals(self.A - self.B @ self.C)
|
||||
|
||||
if passivity_enforce:
|
||||
self.next_poles = self.passivity_enforce(z)
|
||||
else:
|
||||
self.next_poles = z
|
||||
|
||||
self.eigenval_condition,\
|
||||
self.eigenval_row_condition,\
|
||||
self.eigenval_col_condition,\
|
||||
self.eigenval_rms_error = self.eigen_metric()
|
||||
|
||||
self.Dt = self.eval_Dt_state_space()
|
||||
self.Dt_Dt_1 = np.linalg.norm(self.Dt) / np.linalg.norm(weights) if weights is not None else np.linalg.norm(self.Dt)
|
||||
pass
|
||||
|
||||
def eigen_metric(self):
|
||||
|
||||
"""Return condition number and RMS error of eigenvalues of A-BC."""
|
||||
z = np.linalg.eigvals(self.A - self.B @ self.C)
|
||||
cond = np.linalg.cond(self.A - self.B @ self.C)
|
||||
rms = np.sqrt(np.mean(np.abs(np.real(z) - np.real(self.poles))**2 + np.abs(np.imag(z) - np.imag(self.poles))**2))
|
||||
|
||||
row_cond = cond_row_inf(self.A - self.B @ self.C)
|
||||
col_cond = cond_col_one(self.A - self.B @ self.C)
|
||||
|
||||
return cond,row_cond,col_cond,rms
|
||||
|
||||
def least_squares_metric(self,A,b):
|
||||
"""Return condition number and RMS error of least-squares matrix A and rhs b."""
|
||||
cond = np.linalg.cond(A)
|
||||
rms = np.sqrt(np.mean((A @ np.linalg.pinv(A) @ b - b)**2))
|
||||
|
||||
row_cond = cond_row_inf(A)
|
||||
col_cond = cond_col_one(A)
|
||||
|
||||
return cond,row_cond,col_cond,rms
|
||||
|
||||
|
||||
def passivity_enforce(self,poles):
|
||||
"""enforce poles' real parts to be negative"""
|
||||
enforced_poles = []
|
||||
for pole in poles:
|
||||
if pole.real > 0:
|
||||
pole = -np.conj(pole)
|
||||
enforced_poles.append(pole)
|
||||
return enforced_poles
|
||||
|
||||
def eval_Dt_state_space(self):
|
||||
"""Return D(s_k)=C(s_k I - A)^(-1)B + D for all k (complex 1D array)."""
|
||||
s = 1j * 2*np.pi * np.asarray(self.freqs, float).ravel()
|
||||
A = np.asarray(self.A, float); n = A.shape[0]
|
||||
B = np.asarray(self.B, float).reshape(n, 1)
|
||||
C = np.asarray(self.C, float).reshape(1, n)
|
||||
D = self.D
|
||||
I = np.eye(n, dtype=float)
|
||||
out = np.empty_like(s, dtype=np.complex128)
|
||||
for k, sk in enumerate(s):
|
||||
DS = D + (C @ np.linalg.inv(sk*I - A) @ B)
|
||||
out[k] = DS[0, 0]
|
||||
return out
|
||||
|
||||
|
||||
def generate_basis(self,s, poles):
|
||||
"""Real basis of (15)-(16); returns Φ(s) and a layout for packing C."""
|
||||
def all_pass(s,ap_list):
|
||||
res = 1.0 +0.0j
|
||||
for ap in ap_list:
|
||||
res *= (s - np.conj(ap)) / (s + ap)
|
||||
return res
|
||||
|
||||
cols = []
|
||||
ap_list = []
|
||||
i = 0
|
||||
while i < len(poles):
|
||||
ap = -poles[i]
|
||||
if ap.real < 0:
|
||||
raise ValueError("poles must be in the LHP")
|
||||
if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(-ap)):
|
||||
ap1 = - poles[i+1]
|
||||
phi1 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s - np.abs(ap))/((s + ap)*(s + ap1)))
|
||||
phi2 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s + np.abs(ap))/((s + ap)*(s + ap1)))
|
||||
cols += [phi1, phi2]
|
||||
i += 2
|
||||
ap_list.append(ap)
|
||||
ap_list.append(ap1)
|
||||
else:
|
||||
basis = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * (1/(s + ap))
|
||||
cols.append(basis)
|
||||
i += 1
|
||||
ap_list.append(ap)
|
||||
Phi = np.column_stack(cols).astype(np.complex128)
|
||||
return Phi
|
||||
|
||||
def matrix_A(self, poles):
|
||||
def A_col(p:np.complex128,index:int):
|
||||
ap = -p
|
||||
if abs(ap.imag) < 1e-14:
|
||||
col = []
|
||||
for i in range(index):
|
||||
col.append(0.0)
|
||||
col.append(-ap.real)
|
||||
for i in range(len(poles)-index-1):
|
||||
col.append(2*(-ap).real)
|
||||
return np.array([col], float)
|
||||
else:
|
||||
col1 = []
|
||||
col2 = []
|
||||
for i in range(index):
|
||||
col1.append(0.0)
|
||||
col2.append(0.0)
|
||||
col1.append(-ap.real); col2.append(-ap.real - np.abs(ap))
|
||||
col1.append(-ap.real + np.abs(ap)); col2.append(-ap.real)
|
||||
for i in range(len(poles)-index-2):
|
||||
col1.append(2*(-ap).real)
|
||||
col2.append(2*(-ap).real)
|
||||
return np.array([col1, col2], float)
|
||||
|
||||
i = 0
|
||||
cols = []
|
||||
while i < len(poles):
|
||||
p = poles[i]
|
||||
cols.extend(A_col(p,i))
|
||||
if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(p)): i += 2
|
||||
else: i += 1
|
||||
A = np.column_stack(cols).astype(float)
|
||||
return A
|
||||
|
||||
def vector_B(self, poles):
|
||||
return np.ones((len(poles), 1), float)
|
||||
|
||||
def fit_denominator(self, H, weights=None, d0 = 1.0):
|
||||
"""
|
||||
Solve formula (70) on the real basis Φ to obtain:
|
||||
- d (real) → packs into C for this state's block structure
|
||||
- gamma (complex)
|
||||
Optional 'weights' (K,) apply row scaling: SK weighting if 1/|D_prev|.
|
||||
"""
|
||||
K, N = self.Phi.shape
|
||||
one = np.ones((K, 1), np.complex128)
|
||||
Phi = self.Phi
|
||||
dc_tol = 1e-18
|
||||
has_dc = self.dc_enforce and self.freqs[0] < dc_tol
|
||||
keep = np.ones(K, dtype=bool)
|
||||
|
||||
# SK weighting (applied only to the (73) rows we keep in LS)
|
||||
|
||||
if has_dc:
|
||||
# Enforce DC response exactly:
|
||||
k0 = int(np.argmin(np.abs(self.freqs)))
|
||||
keep[k0] = False
|
||||
|
||||
if self.fit_constant:
|
||||
Phi_w = np.hstack([one, Phi])
|
||||
index = 0
|
||||
M_kp = None
|
||||
for i in range(self.ports):
|
||||
for j in range(self.ports):
|
||||
M0 = np.zeros((K,N*self.ports**2),dtype=complex)
|
||||
M0[:,index*N:(index+1)*N] = Phi
|
||||
M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi_w)]).reshape((K, -1))[keep,:] # (K, 2N), complex
|
||||
index+=1
|
||||
M_kp = M0 if M_kp is None else np.vstack([M_kp, M0])
|
||||
assert M_kp is not None
|
||||
else:
|
||||
index = 0
|
||||
M_kp = None
|
||||
for i in range(self.ports):
|
||||
for j in range(self.ports):
|
||||
M0 = np.zeros((K,N*self.ports**2),dtype=complex)
|
||||
M0[:,index*N:(index+1)*N] = Phi
|
||||
M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi)]).reshape((K, -1))[keep,:] # (K, 2N), complex
|
||||
index+=1
|
||||
M_kp = M0 if M_kp is None else np.vstack([M_kp, M0])
|
||||
assert M_kp is not None
|
||||
|
||||
if weights is None:
|
||||
weights_kp = np.diag(np.ones(len(self.freqs[keep]) * self.ports**2, np.complex128))
|
||||
else:
|
||||
weights_kp = np.diag(np.ones(len(self.freqs[keep]) * self.ports**2, np.complex128))
|
||||
# weights_kp0 = weights[keep]
|
||||
# weights0 = []
|
||||
# for i in range(self.ports **2 ):
|
||||
# for res in weights_kp0:
|
||||
# weights0.append(1/res)
|
||||
# weights_kp = np.diag(np.array(weights0))
|
||||
|
||||
|
||||
if has_dc:
|
||||
M_w_kp = weights_kp @ M_kp
|
||||
A_re = np.real(M_w_kp)
|
||||
A_im = np.imag(M_w_kp)
|
||||
mask = np.ones(K, dtype=bool); mask[k0] = False
|
||||
# exact (unweighted) DC rows:
|
||||
# A_dc_re = np.real(M_kp).reshape(1, -1)
|
||||
# A_dc_im = np.imag(M_kp).reshape(1, -1)
|
||||
else:
|
||||
M_w_kp = weights_kp @ M_kp
|
||||
A_re = np.real(M_w_kp)
|
||||
A_im = np.imag(M_w_kp)
|
||||
# A_dc_re = A_dc_im = None
|
||||
|
||||
A_blocks = [A_re, A_im]
|
||||
|
||||
if self.fit_constant:
|
||||
Hk_sum = []
|
||||
for i in range(self.ports):
|
||||
Hk_sum.append([])
|
||||
for j in range(self.ports):
|
||||
Hk_kp0 = H[:,i,j][keep]
|
||||
Hk_sum[i].append(np.sum(np.abs(Hk_kp0)**2))
|
||||
# Hk_kp = Hk_kp0 if Hk_kp is None else np.hstack([Hk_kp, Hk_kp0])
|
||||
K_keep = int(np.count_nonzero(keep))
|
||||
A_w0 = []
|
||||
b_w0 = []
|
||||
# Hk_sum = np.sum(np.abs(Hk_kp)**2)
|
||||
for i in range(self.ports):
|
||||
for j in range(self.ports):
|
||||
beta_ij = float(np.sqrt(Hk_sum[i][j]))
|
||||
mean_row = (beta_ij / K_keep) * np.sum(Phi_w[keep, :], axis=0)
|
||||
A_w0.append(np.concatenate([np.zeros(N*self.ports**2, float),
|
||||
np.real(mean_row).astype(float)]
|
||||
).reshape(1, -1))
|
||||
b_w0.append(np.array([beta_ij], float))
|
||||
b_w0 = np.asarray(b_w0).ravel()
|
||||
|
||||
A_blocks += A_w0
|
||||
m = A_re.shape[0] + A_im.shape[0]
|
||||
b = np.zeros(m, float)
|
||||
b = np.concatenate([b, b_w0])
|
||||
else:
|
||||
H_kp = None
|
||||
for i in range(self.ports):
|
||||
for j in range(self.ports):
|
||||
H_0 = H[:,i,j][keep]
|
||||
H_kp = H_0 if H_kp is None else np.hstack([H_kp, H_0])
|
||||
assert H_kp is not None
|
||||
H_kp = weights_kp @ H_kp.reshape(-1,1)
|
||||
|
||||
b_re = np.real(d0 * H_kp)
|
||||
b_im = np.imag(d0 * H_kp)
|
||||
b = np.concatenate([b_re.ravel(), b_im.ravel()]).astype(float)
|
||||
|
||||
# ---- build final stacked-real system ----
|
||||
|
||||
|
||||
# if A_dc_re is not None:
|
||||
# A_blocks += [A_dc_re, A_dc_im]
|
||||
# b = np.concatenate([b, np.zeros(2, float)]) # DC rows → 0
|
||||
|
||||
# ---- QR solve for x = [c_H (N); c_w (N+1)] ----
|
||||
A = np.vstack(A_blocks).astype(float)
|
||||
Q, R = np.linalg.qr(A, mode="reduced")
|
||||
|
||||
if self.fit_constant:
|
||||
Q2 = Q[:,Phi.shape[1] * self.ports**2:]
|
||||
R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:]
|
||||
else:
|
||||
Q2 = Q[:,Phi.shape[1] * self.ports**2:]
|
||||
R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:]
|
||||
|
||||
x = np.linalg.solve(R22, Q2.T @ b)
|
||||
|
||||
# diagnostics
|
||||
resid = Q2 @ R22 @ x - b
|
||||
# self.least_squares_rms_error = float(np.sqrt(np.mean(resid**2)))
|
||||
# self.least_squares_condition = float(np.linalg.cond(R))
|
||||
self.least_squares_condition,\
|
||||
self.least_squares_row_condition,\
|
||||
self.least_squares_col_condition,\
|
||||
self.least_squares_rms_error = self.least_squares_metric(A, b)
|
||||
|
||||
return self.extract_C_d_e(x,N,d0)
|
||||
|
||||
def extract_C_d_e(self,C,N,d0=1.0):
|
||||
a = np.sqrt(2 * np.real(-np.array(self.poles)))
|
||||
if self.fit_proportional and self.fit_constant:
|
||||
d = C[1]
|
||||
e = C[0]
|
||||
C = a * C[2:]
|
||||
return C.reshape(1, -1), d, e
|
||||
elif self.fit_proportional and not self.fit_constant:
|
||||
d = 0.0
|
||||
e = C[0]
|
||||
C = a * C[1:]
|
||||
return C.reshape(1, -1), d, e
|
||||
elif not self.fit_proportional and self.fit_constant:
|
||||
d = C[0]
|
||||
e = 0.0
|
||||
C = a * C[1:]
|
||||
return C.reshape(1, -1), d, e
|
||||
else:
|
||||
C = a * C
|
||||
return C.reshape(1, -1), d0, 0.0
|
||||
|
||||
|
||||
def non_bias_Cr(self,w0):
|
||||
A = np.asarray(self.Phi)
|
||||
den = np.diag((w0 + self.Phi @ self.residuals.T).ravel())
|
||||
Cr = []
|
||||
for i in range(self.ports):
|
||||
Cr.append([])
|
||||
for j in range(self.ports):
|
||||
b = np.asarray(den) @ self.H[:,i,j].reshape(-1,1)
|
||||
Cr_ij, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
|
||||
Cr[i].append(Cr_ij)
|
||||
return Cr
|
||||
|
||||
def get_model_responses(self,freqs):
|
||||
H = np.zeros((len(freqs),self.ports,self.ports),dtype=complex)
|
||||
s = 1j * 2*np.pi * np.asarray(freqs, float).ravel()
|
||||
phi = self.generate_basis(s, self.poles)
|
||||
den = self.w0 + phi @ self.residuals.T
|
||||
if self.Cr is None:
|
||||
self.Cr = self.non_bias_Cr(w0=self.w0)
|
||||
for i in range(self.ports):
|
||||
for j in range(self.ports):
|
||||
num = phi @ self.Cr[i][j]
|
||||
H[:,i,j] = (num / den).reshape(1,-1)
|
||||
return H
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import numpy as np
|
||||
from core.sk_iter import generate_starting_poles
|
||||
from core.utils import generate_starting_poles
|
||||
from scipy.linalg import block_diag
|
||||
import skrf as rf
|
||||
from skrf import VectorFitting
|
||||
from core.freqency import auto_select_multple_ports
|
||||
from core.sample import auto_select_multple_ports
|
||||
import matplotlib.pyplot as plt
|
||||
import random as rnd
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import numpy as np
|
||||
from core.sk_iter import generate_starting_poles
|
||||
from core.utils import generate_starting_poles
|
||||
from scipy.linalg import block_diag
|
||||
import skrf as rf
|
||||
from skrf import VectorFitting
|
||||
from core.freqency import auto_select
|
||||
from core.sample import auto_select
|
||||
|
||||
class BasicBasis:
|
||||
def __init__(self,H,freqs,poles,weights=None):
|
||||
@@ -1,9 +1,9 @@
|
||||
import numpy as np
|
||||
from core.sk_iter import generate_starting_poles
|
||||
from core.utils import generate_starting_poles
|
||||
from scipy.linalg import block_diag
|
||||
import skrf as rf
|
||||
from skrf import VectorFitting
|
||||
from core.freqency import auto_select
|
||||
from core.sample import auto_select
|
||||
|
||||
class BasicBasisQR:
|
||||
def __init__(self,H,freqs,poles,weights=None):
|
||||
@@ -1,9 +1,9 @@
|
||||
import numpy as np
|
||||
from core.sk_iter import generate_starting_poles
|
||||
from core.utils import generate_starting_poles
|
||||
from scipy.linalg import block_diag
|
||||
import skrf as rf
|
||||
from skrf import VectorFitting
|
||||
from core.freqency import auto_select
|
||||
from core.sample import auto_select
|
||||
import random as rnd
|
||||
|
||||
class RelaxedBasicBasisQR:
|
||||
909
core/util.py
909
core/util.py
@@ -1,909 +0,0 @@
|
||||
"""
|
||||
|
||||
.. currentmodule:: skrf.util
|
||||
========================================
|
||||
util (:mod:`skrf.util`)
|
||||
========================================
|
||||
|
||||
Holds utilities that are general conveniences.
|
||||
|
||||
|
||||
Time-related utilities
|
||||
----------------------
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
now_string
|
||||
now_string_2_dt
|
||||
|
||||
ProgressBar
|
||||
|
||||
Array-related functions
|
||||
-----------------------
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
find_nearest
|
||||
find_nearest_index
|
||||
has_duplicate_value
|
||||
smooth
|
||||
|
||||
File-related functions
|
||||
----------------------
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
get_fid
|
||||
get_extn
|
||||
basename_noext
|
||||
git_version
|
||||
unique_name
|
||||
findReplace
|
||||
dict_2_recarray
|
||||
|
||||
General Purpose Objects
|
||||
-----------------------
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
HomoList
|
||||
HomoDict
|
||||
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import collections
|
||||
import contextlib
|
||||
import fnmatch
|
||||
import os
|
||||
import pprint
|
||||
import re
|
||||
import sys
|
||||
import warnings
|
||||
from datetime import datetime
|
||||
from functools import wraps
|
||||
from pathlib import Path
|
||||
from subprocess import PIPE, Popen
|
||||
from typing import Any, Callable, Iterable, TypeVar
|
||||
|
||||
import numpy as np
|
||||
|
||||
from skrf.constants import Number
|
||||
|
||||
try:
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.axes import Axes
|
||||
from matplotlib.figure import Figure
|
||||
except ImportError:
|
||||
Figure = TypeVar("Figure")
|
||||
Axes = TypeVar("Axes")
|
||||
pass
|
||||
|
||||
def plotting_available() -> bool:
|
||||
return "matplotlib" in sys.modules
|
||||
|
||||
def partial_with_docs(func, *args1, **kwargs1):
|
||||
@wraps(func)
|
||||
def method(self, *args2, **kwargs2):
|
||||
return func(self, *args1, *args2, **kwargs1, **kwargs2)
|
||||
return method
|
||||
|
||||
def axes_kwarg(func):
|
||||
"""
|
||||
This decorator checks if a :class:`matplotlib.axes.Axes` object is passed,
|
||||
if not the current axis will be gathered through :func:`plt.gca`.
|
||||
|
||||
Raises
|
||||
------
|
||||
RuntimeError
|
||||
When trying to run the decorated function without matplotlib
|
||||
"""
|
||||
|
||||
@wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
ax = kwargs.pop('ax', None)
|
||||
try:
|
||||
if ax is None:
|
||||
ax = plt.gca()
|
||||
except NameError as err:
|
||||
raise RuntimeError("Plotting is not available") from err
|
||||
func(*args, ax=ax, **kwargs)
|
||||
|
||||
return wrapper
|
||||
|
||||
def copy_doc(copy_func: Callable) -> Callable:
|
||||
"""Use Example: copy_doc(self.copy_func)(self.func) or used as deco"""
|
||||
def wrapper(func: Callable) -> Callable:
|
||||
func.__doc__ = copy_func.__doc__
|
||||
return func
|
||||
return wrapper
|
||||
|
||||
def figure(*args, **kwargs) -> Figure:
|
||||
"""
|
||||
Wraps the matplotlib figure call and raises if not available.
|
||||
|
||||
Raises
|
||||
------
|
||||
RuntimeError
|
||||
When trying to get subplots without matplotlib installed.
|
||||
"""
|
||||
|
||||
try:
|
||||
return plt.figure(*args, **kwargs)
|
||||
except NameError as err:
|
||||
raise RuntimeError("Plotting is not available") from err
|
||||
|
||||
def subplots(*args, **kwargs) -> tuple[Figure, np.ndarray]:
|
||||
"""
|
||||
Wraps the matplotlib subplots call and raises if not available.
|
||||
|
||||
Raises
|
||||
------
|
||||
RuntimeError
|
||||
When trying to get subplots without matplotlib installed.
|
||||
"""
|
||||
|
||||
try:
|
||||
return plt.subplots(*args, **kwargs)
|
||||
except NameError as err:
|
||||
raise RuntimeError("Plotting is not available") from err
|
||||
|
||||
def now_string() -> str:
|
||||
"""
|
||||
Return a unique sortable string, representing the current time.
|
||||
|
||||
Nice for generating date-time stamps to be used in file-names,
|
||||
the companion function :func:`now_string_2_dt` can be used
|
||||
to read these string back into datetime objects.
|
||||
|
||||
Returns
|
||||
-------
|
||||
now : string
|
||||
curent date-time stamps.
|
||||
|
||||
See Also
|
||||
--------
|
||||
now_string_2_dt
|
||||
|
||||
"""
|
||||
return datetime.now().__str__().replace('-','.').replace(':','.').replace(' ','.')
|
||||
|
||||
|
||||
def now_string_2_dt(s: str) -> datetime:
|
||||
"""
|
||||
Converts the output of :func:`now_string` to a datetime object.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
s : str
|
||||
date-time stamps string as generated by :func:`now_string`
|
||||
|
||||
Returns
|
||||
-------
|
||||
dt : datetime
|
||||
date-time stamps
|
||||
|
||||
See Also
|
||||
--------
|
||||
now_string
|
||||
|
||||
"""
|
||||
return datetime(*[int(k) for k in s.split('.')])
|
||||
|
||||
|
||||
def find_nearest(array: np.ndarray, value: Number) -> Number:
|
||||
"""
|
||||
Find the nearest value in array.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
array : np.ndarray
|
||||
array we are searching for a value in
|
||||
value : element of the array
|
||||
value to search for
|
||||
|
||||
Returns
|
||||
--------
|
||||
found_value : an element of the array
|
||||
the value that is numerically closest to `value`
|
||||
|
||||
"""
|
||||
idx = find_nearest_index(array, value)
|
||||
return array[idx]
|
||||
|
||||
|
||||
def find_nearest_index(array: np.ndarray, value: Number) -> int:
|
||||
"""
|
||||
Find the nearest index for a value in array.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
array : np.ndarray
|
||||
array we are searching for a value in
|
||||
value : element of the array
|
||||
value to search for
|
||||
|
||||
Returns
|
||||
--------
|
||||
found_index : int
|
||||
the index at which the numerically closest element to `value`
|
||||
was found at
|
||||
|
||||
References
|
||||
----------
|
||||
taken from http://stackoverflow.com/questions/2566412/find-nearest-value-in-numpy-array
|
||||
|
||||
"""
|
||||
return (np.abs(array-value)).argmin()
|
||||
|
||||
|
||||
def slice_domain(x: np.ndarray, domain: tuple):
|
||||
"""
|
||||
Returns a slice object closest to the `domain` of `x`
|
||||
|
||||
domain = x[slice_domain(x, (start, stop))]
|
||||
|
||||
Parameters
|
||||
----------
|
||||
vector : np.ndarray
|
||||
an array of values
|
||||
domain : tuple
|
||||
tuple of (start,stop) values defining the domain over
|
||||
which to slice
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> x = linspace(0,10,101)
|
||||
>>> idx = slice_domain(x, (2,6))
|
||||
>>> x[idx]
|
||||
|
||||
"""
|
||||
start = find_nearest_index(x, domain[0])
|
||||
stop = find_nearest_index(x, domain[1])
|
||||
return slice(start, stop+1)
|
||||
|
||||
# file IO
|
||||
|
||||
|
||||
def get_fid(file, *args, **kwargs):
|
||||
r"""
|
||||
Return a file object, given a filename or file object.
|
||||
|
||||
Useful when you want to allow the arguments of a function to
|
||||
be either files or filenames
|
||||
|
||||
Parameters
|
||||
----------
|
||||
file : str/unicode, Path, or file-object
|
||||
file to open
|
||||
\*args, \*\*kwargs : arguments and keyword arguments to `open()`
|
||||
|
||||
Returns
|
||||
-------
|
||||
fid : file object
|
||||
|
||||
"""
|
||||
if isinstance(file, (str, Path)):
|
||||
return open(file, *args, **kwargs)
|
||||
else:
|
||||
return file
|
||||
|
||||
|
||||
def get_extn(filename: str | Path) -> str:
|
||||
"""
|
||||
Get the extension from a filename.
|
||||
|
||||
The extension is defined as everything passed the last '.'.
|
||||
Returns None if it ain't got one
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : string or Path
|
||||
the filename
|
||||
|
||||
Returns
|
||||
-------
|
||||
ext : string, None
|
||||
either the extension (not including '.') or None if there
|
||||
isn't one
|
||||
|
||||
"""
|
||||
|
||||
if isinstance(filename, Path):
|
||||
return filename.suffix.strip('.') or None
|
||||
|
||||
ext = os.path.splitext(filename)[-1]
|
||||
if len(ext) == 0:
|
||||
return None
|
||||
else:
|
||||
return ext[1:]
|
||||
|
||||
|
||||
def basename_noext(filename: str) -> str:
|
||||
"""
|
||||
Get the basename and strips extension.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : string
|
||||
the filename
|
||||
|
||||
Returns
|
||||
-------
|
||||
basename : str
|
||||
file basename (ie. without extension)
|
||||
|
||||
"""
|
||||
return os.path.splitext(os.path.basename(filename))[0]
|
||||
|
||||
|
||||
# git
|
||||
def git_version(modname: str) -> str:
|
||||
"""
|
||||
Return output 'git describe', executed in a module's root directory.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
modname : str
|
||||
module name
|
||||
|
||||
Returns
|
||||
-------
|
||||
out : str
|
||||
output of 'git describe'
|
||||
|
||||
"""
|
||||
mod = __import__(modname)
|
||||
mod_dir = os.path.split(mod.__file__)[0]
|
||||
p = Popen(['git', 'describe'], stdout=PIPE, stderr=PIPE, cwd=mod_dir)
|
||||
|
||||
try:
|
||||
out, er = p.communicate()
|
||||
except(OSError):
|
||||
return None
|
||||
|
||||
out = out.strip('\n')
|
||||
if out == '':
|
||||
return None
|
||||
return out
|
||||
|
||||
|
||||
def dict_2_recarray(d: dict, delim: str, dtype: list[tuple]) -> np.ndarray:
|
||||
"""
|
||||
Turn a dictionary of structured keys to a record array of objects.
|
||||
|
||||
This is useful if you save data-base like meta-data in the form
|
||||
or file-naming conventions, aka 'the poor-mans database'
|
||||
|
||||
Parameters
|
||||
----------
|
||||
d : dict
|
||||
dictionnary of structured keys
|
||||
delim : str
|
||||
delimiter string
|
||||
dtype : list of tuple
|
||||
list of type, where a type is tuple like ('type_name', type)
|
||||
|
||||
Returns
|
||||
-------
|
||||
ra : numpy.array
|
||||
|
||||
Examples
|
||||
--------
|
||||
Given a directory of networks like:
|
||||
|
||||
>>> ls
|
||||
a1,0.0,0.0.s1p a1,3.0,3.0.s1p a2,3.0,-3.0.s1p b1,-3.0,3.0.s1p
|
||||
...
|
||||
|
||||
you can sort based on the values or each field, after defining their
|
||||
type with `dtype`. The `values` field accesses the objects.
|
||||
|
||||
>>> d = rf.read_all_networks('/tmp/')
|
||||
>>> delim = ','
|
||||
>>> dtype = [('name', object), ('voltage', float), ('current', float)]
|
||||
>>> ra = dict_2_recarray(d=rf.ran(dir), delim=delim, dtype =dtype)
|
||||
|
||||
then you can sift like you do with numpy arrays
|
||||
|
||||
>>> ra[ra['voltage'] < 3]['values']
|
||||
array([1-Port Network: 'a2,0.0,-3.0', 450-800 GHz, 101 pts, z0=[ 50.+0.j],
|
||||
1-Port Network: 'b1,0.0,3.0', 450-800 GHz, 101 pts, z0=[ 50.+0.j],
|
||||
1-Port Network: 'a1,0.0,-3.0', 450-800 GHz, 101 pts, z0=[ 50.+0.j],
|
||||
"""
|
||||
|
||||
split_keys = [tuple(k.split(delim)+[d[k]]) for k in d.keys()]
|
||||
x = np.array(split_keys, dtype=dtype+[('values',object)])
|
||||
return x
|
||||
|
||||
|
||||
def findReplace(directory: str, find: str, replace: str, file_pattern: str):
|
||||
r"""
|
||||
Find/replace some txt in all files in a directory, recursively.
|
||||
|
||||
This was found in [1]_ .
|
||||
|
||||
Parameters
|
||||
----------
|
||||
directory : str
|
||||
path of a directory
|
||||
find : str
|
||||
pattern to search for
|
||||
replace : str
|
||||
string to replace with
|
||||
file_pattern : str
|
||||
file pattern for filtering. Ex: '\*.txt'.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> rf.findReplace('some_dir', 'find this', 'replace with this', '*.txt')
|
||||
|
||||
References
|
||||
----------
|
||||
.. [1] http://stackoverflow.com/questions/4205854/python-way-to-recursively-find-and-replace-string-in-text-files
|
||||
"""
|
||||
for path, _dirs, files in os.walk(os.path.abspath(directory)):
|
||||
for filename in fnmatch.filter(files, file_pattern):
|
||||
filepath = os.path.join(path, filename)
|
||||
with open(filepath) as f:
|
||||
s = f.read()
|
||||
s = s.replace(find, replace)
|
||||
with open(filepath, "w") as f:
|
||||
f.write(s)
|
||||
|
||||
|
||||
# general purpose objects
|
||||
|
||||
class HomoList(collections.abc.Sequence):
|
||||
"""
|
||||
A Homogeneous Sequence.
|
||||
|
||||
Provides a class for a list-like object which contains
|
||||
homogeneous values. Attributes of the values can be accessed through
|
||||
the attributes of HomoList. Searching is done like numpy arrays.
|
||||
|
||||
Initialized from a list of all the same type
|
||||
|
||||
>>> h = HomoDict([Foo(...), Foo(...)])
|
||||
|
||||
The individual values of `h` can be access in identical fashion to
|
||||
Lists.
|
||||
|
||||
>>> h[0]
|
||||
|
||||
Assuming that `Foo` has property `prop` and function `func` ...
|
||||
|
||||
Access elements' properties:
|
||||
|
||||
>>> h.prop
|
||||
|
||||
Access elements' functions:
|
||||
|
||||
>>> h.func()
|
||||
|
||||
Searching:
|
||||
|
||||
>>> h[h.prop == value]
|
||||
>>> h[h.prop < value]
|
||||
|
||||
Multiple search:
|
||||
|
||||
>>> h[set(h.prop==value1) & set( h.prop2==value2)]
|
||||
|
||||
Combos:
|
||||
|
||||
>>> h[h.prop==value].func()
|
||||
"""
|
||||
|
||||
|
||||
def __init__(self, list_):
|
||||
self.store = list(list_)
|
||||
|
||||
def __eq__(self, value):
|
||||
return [k for k in range(len(self)) if self.store[k] == value ]
|
||||
|
||||
def __ne__(self, value):
|
||||
return [k for k in range(len(self)) if self.store[k] != value ]
|
||||
|
||||
def __gt__(self, value):
|
||||
return [k for k in range(len(self)) if self.store[k] > value ]
|
||||
|
||||
def __ge__(self, value):
|
||||
return [k for k in range(len(self)) if self.store[k] >= value ]
|
||||
|
||||
def __lt__(self, value):
|
||||
return [k for k in range(len(self)) if self.store[k] < value ]
|
||||
|
||||
def __le__(self, value):
|
||||
return [k for k in range(len(self)) if self.store[k] <= value ]
|
||||
|
||||
def __getattr__(self, name):
|
||||
return self.__class__(
|
||||
[k.__getattribute__(name) for k in self.store])
|
||||
|
||||
def __getitem__(self, idx):
|
||||
try:
|
||||
return self.store[idx]
|
||||
except(TypeError):
|
||||
return self.__class__([self.store[k] for k in idx])
|
||||
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
return self.__class__(
|
||||
[k(*args,**kwargs) for k in self.store])
|
||||
|
||||
def __setitem__(self, idx, value):
|
||||
self.store[idx] = value
|
||||
|
||||
def __delitem__(self, idx):
|
||||
del self.store[idx]
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.store)
|
||||
|
||||
def __len__(self):
|
||||
return len(self.store)
|
||||
|
||||
def __str__(self):
|
||||
return pprint.pformat(self.store)
|
||||
|
||||
def __repr__(self):
|
||||
return pprint.pformat(self.store)
|
||||
|
||||
|
||||
class HomoDict(collections.abc.MutableMapping):
|
||||
"""
|
||||
A Homogeneous Mutable Mapping.
|
||||
|
||||
Provides a class for a dictionary-like object which contains
|
||||
homogeneous values. Attributes of the values can be accessed through
|
||||
the attributes of HomoDict. Searching is done like numpy arrays.
|
||||
|
||||
Initialized from a dictionary containing values of all the same type
|
||||
|
||||
>>> h = HomoDict({'a':Foo(...),'b': Foo(...), 'c':Foo(..)})
|
||||
|
||||
The individual values of `h` can be access in identical fashion to
|
||||
Dictionaries.
|
||||
|
||||
>>> h['key']
|
||||
|
||||
Assuming that `Foo` has property `prop` and function `func` ...
|
||||
|
||||
Access elements' properties:
|
||||
|
||||
>>> h.prop
|
||||
|
||||
Access elements' functions:
|
||||
|
||||
>>> h.func()
|
||||
|
||||
Searching:
|
||||
|
||||
>>> h[h.prop == value]
|
||||
>>> h[h.prop < value]
|
||||
|
||||
Multiple search:
|
||||
|
||||
>>> h[set(h.prop==value1) & set( h.prop2==value2)]
|
||||
|
||||
Combos:
|
||||
|
||||
>>> h[h.prop==value].func()
|
||||
"""
|
||||
def __init__(self, dict_):
|
||||
self.store = dict(dict_)
|
||||
|
||||
def __eq__(self, value):
|
||||
return [k for k in self.store if self.store[k] == value ]
|
||||
|
||||
def __ne__(self, value):
|
||||
return [k for k in self.store if self.store[k] != value ]
|
||||
|
||||
def __gt__(self, value):
|
||||
return [k for k in self.store if self.store[k] > value ]
|
||||
|
||||
def __ge__(self, value):
|
||||
return [k for k in self.store if self.store[k] >= value ]
|
||||
|
||||
def __lt__(self, value):
|
||||
return [k for k in self.store if self.store[k] < value ]
|
||||
|
||||
def __le__(self, value):
|
||||
return [k for k in self.store if self.store[k] <= value ]
|
||||
|
||||
def __getattr__(self, name):
|
||||
return self.__class__(
|
||||
{k: getattr(self.store[k],name) for k in self.store})
|
||||
|
||||
def __getitem__(self, key):
|
||||
if isinstance(key, str):
|
||||
return self.store[key]
|
||||
else:
|
||||
c = self.__class__({k:self.store[k] for k in key})
|
||||
return c
|
||||
#if len(c) == 1:
|
||||
# return c.store.values()[0]
|
||||
#else:
|
||||
# return c
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
return self.__class__(
|
||||
{k: self.store[k](*args, **kwargs) for k in self.store})
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
self.store[key] = value
|
||||
|
||||
def __delitem__(self, key):
|
||||
del self.store[key]
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.store)
|
||||
|
||||
def __len__(self):
|
||||
return len(self.store)
|
||||
|
||||
def __str__(self):
|
||||
return pprint.pformat(self.store)
|
||||
|
||||
def __repr__(self):
|
||||
return pprint.pformat(self.store)
|
||||
|
||||
|
||||
def copy(self):
|
||||
return HomoDict(self.store)
|
||||
|
||||
|
||||
def filter_nones(self):
|
||||
self.store = {k:self.store[k] for k in self.store \
|
||||
if self.store[k] is not None}
|
||||
|
||||
def filter(self, **kwargs):
|
||||
"""
|
||||
Filter self based on kwargs
|
||||
|
||||
This is equivalent to:
|
||||
|
||||
>>> h = HomoDict(...)
|
||||
>>> for k in kwargs:
|
||||
>>> h = h[k ==kwargs[k]]
|
||||
>>> return h
|
||||
|
||||
prefixing the kwarg value with a '!' causes a not equal test (!=)
|
||||
|
||||
Examples
|
||||
----------
|
||||
>>> h = HomoDict(...)
|
||||
>>> h.filter(name='jean', age = '18', gender ='!female')
|
||||
|
||||
"""
|
||||
a = self
|
||||
for k in kwargs:
|
||||
if kwargs[k][0] == '!':
|
||||
a = a[a.__getattr__(k) != kwargs[k][1:]]
|
||||
else:
|
||||
a = a[a.__getattr__(k) == kwargs[k]]
|
||||
return a
|
||||
|
||||
|
||||
def has_duplicate_value(value: Any, values: Iterable, index: int) -> bool | int:
|
||||
"""
|
||||
Check if there is another value of the current index in the list.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
value : Any
|
||||
any value in a list
|
||||
values : Iterable
|
||||
the iterable containing the values
|
||||
index : int
|
||||
the index of the current item we are checking for.
|
||||
|
||||
Returns
|
||||
-------
|
||||
index : bool or int
|
||||
returns None if no duplicate found, or the index of the first found duplicate
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> rf.has_duplicate_value(0, [1, 2, 0, 3, 0], -1) # -> 2
|
||||
>>> rf.has_duplicate_value(0, [1, 2, 0, 3, 0], 2) # -> 4
|
||||
>>> rf.has_duplicate_value(3, [1, 2, 0, 3, 0], 0) # -> 3
|
||||
>>> rf.has_duplicate_value(3, [1, 2, 0, 3, 0], 3) # -> False
|
||||
"""
|
||||
|
||||
for i, val in enumerate(values):
|
||||
if i == index:
|
||||
continue
|
||||
if value == val:
|
||||
return i
|
||||
return False
|
||||
|
||||
|
||||
def unique_name(name: str, names: list, exclude: int = -1) -> str:
|
||||
"""
|
||||
Pass in a name and a list of names, and increment with _## as necessary to ensure a unique name.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
name : str
|
||||
the chosen name, to be modified if necessary
|
||||
names : list
|
||||
list of names (str)
|
||||
exclude : int, optional
|
||||
the index of an item to be excluded from the search. Default is -1.
|
||||
|
||||
Returns
|
||||
-------
|
||||
unique_name : str
|
||||
|
||||
"""
|
||||
if not has_duplicate_value(name, names, exclude):
|
||||
return name
|
||||
else:
|
||||
if re.match(r"_\d\d", name[-3:]):
|
||||
name_base = name[:-3]
|
||||
suffix = int(name[-2:])
|
||||
else:
|
||||
name_base = name
|
||||
suffix = 1
|
||||
|
||||
for num in range(suffix, 100, 1):
|
||||
name = f"{name_base:s}_{num:02d}"
|
||||
if not has_duplicate_value(name, names, exclude):
|
||||
break
|
||||
return name
|
||||
|
||||
|
||||
def smooth(x: np.ndarray, window_len: int = 11, window: str = 'flat') -> np.ndarray:
|
||||
"""
|
||||
Smooth the data using a window with requested size.
|
||||
|
||||
Based on the function from the scipy cookbook [#]_
|
||||
|
||||
This method is based on the convolution of a scaled window with the signal.
|
||||
The signal is prepared by introducing reflected copies of the signal
|
||||
(with the window size) in both ends so that transient parts are minimized
|
||||
in the beginning and end part of the output signal.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
x : numpy.array
|
||||
the input signal
|
||||
window_len : int, optional
|
||||
the dimension of the smoothing window; should be an odd integer.
|
||||
Default is 11.
|
||||
window : str, optional
|
||||
the type of window from 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'
|
||||
flat window will produce a moving average smoothing. Default is 'flat'
|
||||
|
||||
Returns
|
||||
-------
|
||||
y : numpy.array
|
||||
The smoothed signal
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> t = linspace(-2, 2, 0.1)
|
||||
>>> x = sin(t) + randn(len(t))*0.1
|
||||
>>> y = smooth(x)
|
||||
|
||||
See Also
|
||||
--------
|
||||
numpy.hanning, numpy.hamming, numpy.bartlett, numpy.blackman, numpy.convolve
|
||||
scipy.signal.lfilter
|
||||
|
||||
Note
|
||||
----
|
||||
`length(output) != length(input)`.
|
||||
To correct this: `return y[(window_len/2-1):-(window_len/2)]` instead of just `y`.
|
||||
|
||||
References
|
||||
----------
|
||||
.. [#] http://scipy-cookbook.readthedocs.io/items/SignalSmooth.html
|
||||
|
||||
"""
|
||||
|
||||
if x.ndim != 1:
|
||||
raise ValueError("smooth only accepts 1 dimension arrays.")
|
||||
|
||||
if x.size < window_len:
|
||||
raise ValueError("Input vector needs to be bigger than window size.")
|
||||
|
||||
if window_len < 3:
|
||||
return x
|
||||
|
||||
if window not in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']:
|
||||
raise ValueError("Window is one of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'")
|
||||
|
||||
s = np.r_[x[window_len - 1:0:-1], x, x[-2:-window_len - 1:-1]]
|
||||
if window == 'flat': # moving average
|
||||
w = np.ones(window_len, 'd')
|
||||
else:
|
||||
w = eval('np.' + window + '(window_len)')
|
||||
y = np.convolve(w / w.sum(), s, mode='same')
|
||||
return y[window_len-1:-(window_len-1)]
|
||||
|
||||
|
||||
class ProgressBar:
|
||||
"""
|
||||
A progress bar based off of the notebook/ipython progress bar from PyMC.
|
||||
|
||||
Useful when waiting for long operations such as taking a large number
|
||||
of VNA measurements that may take a few minutes.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from time import sleep
|
||||
>>> pb = rf.ProgressBar(10)
|
||||
>>> for idx in range(10):
|
||||
>>> sleep(1)
|
||||
>>> pb.animate(idx)
|
||||
|
||||
"""
|
||||
def __init__(self, iterations: int, label: str = "iterations"):
|
||||
"""
|
||||
Progress bar constructor.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
iterations : int
|
||||
Number of expected iterations
|
||||
label : str, optional
|
||||
Progress bar label, by default "iterations"
|
||||
"""
|
||||
self.iterations = iterations
|
||||
self.label = label
|
||||
self.prog_bar = '[]'
|
||||
self.fill_char = '*'
|
||||
self.width = 50
|
||||
self.__update_amount(0)
|
||||
|
||||
def animate(self, iteration: int):
|
||||
"""
|
||||
Animate the progress bar.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
iteration : int
|
||||
current iteration
|
||||
"""
|
||||
print('\r', self, end='')
|
||||
sys.stdout.flush()
|
||||
self.update_iteration(iteration + 1)
|
||||
|
||||
def update_iteration(self, elapsed_iter: int):
|
||||
self.__update_amount((elapsed_iter / float(self.iterations)) * 100.0)
|
||||
self.prog_bar += ' %d of %s %s complete' % (elapsed_iter, self.iterations, self.label)
|
||||
|
||||
def __update_amount(self, new_amount: int):
|
||||
percent_done = int(round((new_amount / 100.0) * 100.0))
|
||||
all_full = self.width - 2
|
||||
num_hashes = int(round((percent_done / 100.0) * all_full))
|
||||
self.prog_bar = '[' + self.fill_char * num_hashes + ' ' * (all_full - num_hashes) + ']'
|
||||
pct_place = (len(self.prog_bar) // 2) - len(str(percent_done))
|
||||
pct_string = '%d%%' % percent_done
|
||||
self.prog_bar = self.prog_bar[0:pct_place] + \
|
||||
(pct_string + self.prog_bar[pct_place + len(pct_string):])
|
||||
|
||||
def __str__(self):
|
||||
return str(self.prog_bar)
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def suppress_numpy_warnings(**kw):
|
||||
olderr = np.seterr(**kw)
|
||||
yield
|
||||
np.seterr(**olderr)
|
||||
|
||||
|
||||
def suppress_warning_decorator(msg):
|
||||
def suppress_warnings_decorated(func):
|
||||
@wraps(func)
|
||||
def suppressed_func(*k, **kw):
|
||||
with warnings.catch_warnings():
|
||||
warnings.filterwarnings("ignore", message=f"{msg}.*")
|
||||
res = func(*k, **kw)
|
||||
return res
|
||||
return suppressed_func
|
||||
return suppress_warnings_decorated
|
||||
@@ -2,6 +2,18 @@ import numpy as np
|
||||
from dataclasses import dataclass
|
||||
from typing import List, Dict, Tuple
|
||||
|
||||
def cond_row_inf(A, use_pinv=True):
|
||||
"""行条件数 κ∞(A) = ||A||∞ * ||A^{-1}||∞;矩形阵用广义逆。"""
|
||||
A = np.asarray(A)
|
||||
Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A)
|
||||
return np.linalg.norm(A, ord=np.inf) * np.linalg.norm(Ainv, ord=np.inf)
|
||||
|
||||
def cond_col_one(A, use_pinv=True):
|
||||
"""列条件数 κ1(A) = ||A||1 * ||A^{-1}||1;矩形阵用广义逆。"""
|
||||
A = np.asarray(A)
|
||||
Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A)
|
||||
return np.linalg.norm(A, ord=1) * np.linalg.norm(Ainv, ord=1)
|
||||
|
||||
def generate_starting_poles(n_pairs: int, beta_min: float, beta_max: float, alpha_scale: float = 0.01):
|
||||
"""
|
||||
仅生成复共轭对: p = -alpha + j beta, p*。
|
||||
File diff suppressed because it is too large
Load Diff
558
main.py
558
main.py
@@ -1,446 +1,136 @@
|
||||
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
|
||||
from plotly.subplots import make_subplots
|
||||
import plotly.graph_objs
|
||||
from core.freqency import auto_select
|
||||
from scipy.linalg import block_diag
|
||||
from core.VFManager import VFManager
|
||||
from core.utils import generate_starting_poles
|
||||
from core.sample import auto_select_multple_ports
|
||||
from core.basis.MultiPortOrthonormalBasis import MultiPortOrthonormalBasis
|
||||
|
||||
|
||||
network = rf.Network("/tmp/paramer/simulation/3500/3500.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")
|
||||
|
||||
def formula_67(s,y):
|
||||
diag_values = [y[i][0][0] for i in range(len(y))]
|
||||
H = np.diag(diag_values)
|
||||
P = 2
|
||||
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("Dt", D_t)
|
||||
# print("D_t/D_t_pre",D_t/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.abs(N_t / D_t))
|
||||
|
||||
class formula_70_psi:
|
||||
"""
|
||||
VF-(70) with final pole-residue model.
|
||||
After fit():
|
||||
self.poles : (P,) complex
|
||||
self.res : (P, M) complex # residues per response (columns)
|
||||
self.h : (M,) complex # optional constants
|
||||
self.g : (M,) complex # optional proportional terms
|
||||
"""
|
||||
|
||||
# -------- internals --------
|
||||
|
||||
def __init__(self, s, P, H, beta_min, beta_max ,alpha_scale=0.01, n_iter=20, d0=1.0, include_const=True, include_linear=False, verbose=True):
|
||||
self.s = s
|
||||
self.P = P
|
||||
self.H = H
|
||||
self.beta_min = beta_min
|
||||
self.beta_max = beta_max
|
||||
self.alpha_scale = alpha_scale
|
||||
self.z0 = self._generate_starting_poles(P, beta_min=beta_min, beta_max=beta_max,alpha_scale=alpha_scale)
|
||||
self.z0 = np.array(self.z0, dtype=np.complex128)
|
||||
self.n_iter = n_iter
|
||||
self.d0 = d0
|
||||
self.include_const = include_const
|
||||
self.include_linear = include_linear
|
||||
self.verbose = verbose
|
||||
|
||||
self.rel_iteration = []
|
||||
self.cond_iteration = []
|
||||
self.conf_poles_recognize = []
|
||||
self.rms_error_iteration = []
|
||||
self.rms_error_poles_recongnize = []
|
||||
|
||||
@staticmethod
|
||||
def _generate_starting_poles(P, beta_min:float, beta_max:float, alpha_scale=0.01):
|
||||
"""
|
||||
仅生成复共轭对: p = -alpha + j beta, p*。
|
||||
n_pairs: 复对数量 (总极点数 = 2*n_pairs)
|
||||
beta_min,beta_max: 想要覆盖的虚部范围 (单位: rad/s)
|
||||
alpha_scale: alpha = alpha_scale * beta (文中 {α_p}=0.01{β_p})
|
||||
返回: list[complex] (正虚部先, 后跟共轭)
|
||||
"""
|
||||
betas = 2*np.pi*np.linspace(beta_min, beta_max, P)
|
||||
poles = []
|
||||
for b in betas:
|
||||
alpha = alpha_scale * b
|
||||
p = -alpha + 1j * b
|
||||
poles += [p, np.conj(p)]
|
||||
return poles
|
||||
|
||||
def _generate_laguerre_basis(self, s: np.ndarray, z: np.ndarray):
|
||||
poles = z
|
||||
poles = sorted(poles, key=lambda p: np.real(p))
|
||||
basis = np.zeros((len(poles)+1,len(s)),dtype=complex)
|
||||
|
||||
product = np.ones(len(s),dtype=complex)
|
||||
|
||||
basis[0] = np.ones(len(s),dtype=complex) # φ_0 = 1
|
||||
i = 0
|
||||
while i < len(poles):
|
||||
if np.real(poles[i]) >= 0:
|
||||
raise ValueError(f"极点必须在左半平面: {poles[i]}")
|
||||
|
||||
# 复对首 (正虚部)
|
||||
if np.iscomplex(poles[i]) and np.imag(poles[i]) > 0:
|
||||
if i + 1 >= len(poles):
|
||||
raise ValueError("复极点缺少共轭")
|
||||
pn = poles[i]
|
||||
pc = poles[i + 1]
|
||||
if not np.isclose(pc, np.conj(pn)):
|
||||
pc, pn = pn,pc
|
||||
if not np.isclose(pc, np.conj(pn)):
|
||||
raise ValueError("复极点未按 (p, p*) 顺序排列 (正虚部在前)")
|
||||
poles[i], poles[i+1] = pc, pn # swap
|
||||
sigma = -np.real(pn) # >0
|
||||
scale = np.sqrt(2 * sigma)
|
||||
r = np.abs(pn)
|
||||
denom = (s - pn) * (s - pc)
|
||||
|
||||
# 两个基函数
|
||||
phi_p = scale * (s - r) / denom * product
|
||||
phi_pc = scale * (s + r) / denom * product
|
||||
|
||||
# product 先乘 (s + p^*)/(s - p),再乘 (s + p)/(s - p^*)
|
||||
product = product * (s + pc) / (s - pn)
|
||||
product = product * (s + pn) / (s - pc)
|
||||
|
||||
basis[i + 1] = phi_p
|
||||
basis[i + 2] = phi_pc
|
||||
i += 2
|
||||
continue
|
||||
|
||||
# 复对次 (负虚部) —— 应该被首元素处理,出现表示顺序错误
|
||||
if np.iscomplex(pn) and np.imag(pn) < 0:
|
||||
raise ValueError("检测到负虚部复极点但其共轭尚未处理,请将正虚部成员放在前面。")
|
||||
|
||||
# 实极点
|
||||
sigma = -np.real(pn)
|
||||
if sigma <= 0:
|
||||
raise ValueError("实极点实部应为负 (稳定)。")
|
||||
scale = np.sqrt(2 * sigma)
|
||||
phi = scale / (s - pn) * product
|
||||
# 更新乘积
|
||||
product = product * (s + pn) / (s - pn)
|
||||
i += 1
|
||||
basis[i + 1] = phi
|
||||
return basis
|
||||
|
||||
|
||||
def _orthonormal_psi(self,s,z):
|
||||
s = np.asarray(s, np.complex128).reshape(-1)
|
||||
z = np.asarray(z, np.complex128).reshape(-1)
|
||||
return self._generate_laguerre_basis(s,z).T
|
||||
|
||||
@staticmethod
|
||||
def _psi(s, z):
|
||||
s = np.asarray(s, np.complex128).reshape(-1)
|
||||
z = np.asarray(z, np.complex128).reshape(-1)
|
||||
return 1.0 / (s[:, None] + z[None, :])
|
||||
|
||||
# @staticmethod
|
||||
# def _lhp(z):
|
||||
# z = np.asarray(z, np.complex128).reshape(-1).copy()
|
||||
# z[z.real > 0] = -np.conj(z[z.real > 0])
|
||||
# return z
|
||||
|
||||
def _build_70(self, s, H_list, z_ref, d0):
|
||||
Hs = [np.asarray(h, np.complex128).reshape(-1) for h in H_list]
|
||||
K, P, M = len(s), len(z_ref), len(Hs)
|
||||
Psi = self._psi(s, z_ref)
|
||||
Z = np.zeros((K, P))
|
||||
rows, rhs = [], []
|
||||
for m, H in enumerate(Hs):
|
||||
Hp = H[:, None]
|
||||
L_re = np.real(Hp * Psi); L_im = np.imag(Hp * Psi) # acts on c
|
||||
R_re = -np.real(Psi); R_im = -np.imag(Psi) # acts on r^(m)
|
||||
rows.append(np.hstack([L_re] + [R_re if j == m else Z for j in range(M)]))
|
||||
rhs.append(-np.real(d0 * H))
|
||||
rows.append(np.hstack([L_im] + [R_im if j == m else Z for j in range(M)]))
|
||||
rhs.append(-np.imag(d0 * H))
|
||||
A = np.vstack(rows)
|
||||
b = np.concatenate(rhs)
|
||||
cond_poles_recognize = np.linalg.cond(A)
|
||||
rms_error_poles_recongnize = np.sqrt(np.mean(np.abs(A @ np.zeros(A.shape[1]) - b)**2))
|
||||
return A, b, M, P, cond_poles_recognize, rms_error_poles_recongnize
|
||||
|
||||
def _step_70(self, s, H_list, z_ref, d0=1.0, scale=True):
|
||||
A, b, M, P, cond_poles_recognize, rms_error_poles_recongnize = self._build_70(s, H_list, z_ref, d0)
|
||||
if scale:
|
||||
coln = np.maximum(np.linalg.norm(A, axis=0), 1e-12)
|
||||
x, *_ = np.linalg.lstsq(A / coln, b, rcond=None)
|
||||
x = x / coln
|
||||
cond_iteration = np.linalg.cond(A)
|
||||
rms_error_iteration = np.sqrt(np.mean(np.abs(A @ x - b)**2))
|
||||
else:
|
||||
x, *_ = np.linalg.lstsq(A, b, rcond=None)
|
||||
cond_iteration = np.linalg.cond(A)
|
||||
rms_error_iteration = np.sqrt(np.mean(np.abs(A @ x - b)**2))
|
||||
|
||||
c = x[:P]
|
||||
res_ratio = np.empty((P, M), np.complex128)
|
||||
off = P
|
||||
for m in range(M):
|
||||
res_ratio[:, m] = x[off:off+P]; off += P
|
||||
# relocate poles with test matrix
|
||||
Sigma = np.diag(-np.asarray(z_ref, np.complex128))
|
||||
T = Sigma - (np.ones((P, 1), np.complex128) @ (c.reshape(1, -1) / d0))
|
||||
z_new = -np.linalg.eigvals(T)
|
||||
# z_new = self._lhp(z_new)
|
||||
# cond = np.linalg.cond(T)
|
||||
return z_new, c, cond_iteration, rms_error_iteration, cond_poles_recognize, rms_error_poles_recongnize, res_ratio
|
||||
|
||||
# -------- public API --------
|
||||
def fit(self):
|
||||
"""
|
||||
s : (K,) complex samples (j*2π*f_sel)
|
||||
H : (K,) complex or (K,M) or list of M vectors
|
||||
z0: initial poles (P,) complex (LHP + conjugate pairs recommended)
|
||||
"""
|
||||
# normalize responses -> list
|
||||
if isinstance(self.H, (list, tuple)):
|
||||
H_list = [np.asarray(h, np.complex128).reshape(-1) for h in self.H]
|
||||
else:
|
||||
H_arr = np.asarray(self.H, np.complex128)
|
||||
if H_arr.ndim == 1:
|
||||
H_list = [H_arr]
|
||||
elif H_arr.ndim == 2 and H_arr.shape[0] == len(self.s):
|
||||
H_list = [H_arr[:, i].copy() for i in range(H_arr.shape[1])]
|
||||
else:
|
||||
raise ValueError("H must be (K,), list of (K,), or (K,M) with M responses.")
|
||||
M = len(H_list)
|
||||
|
||||
# z = self._lhp(np.asarray(self.z0, np.complex128))
|
||||
z = self.z0
|
||||
# SK/VF relocations
|
||||
for it in range(self.n_iter):
|
||||
z_next, c_last, cond_iteration, rms_error_iteration, cond_poles_recognize, rms_error_poles_recongnize, _ = self._step_70(self.s, H_list, z, d0=self.d0, scale=True)
|
||||
rel = np.linalg.norm(z_next) / max(1.0, np.linalg.norm(z))
|
||||
if self.verbose:
|
||||
print(f"[VF-70] iter {it+1:02d}/{self.n_iter:02d} Δz_rel={rel}")
|
||||
self.cond_iteration.append(cond_iteration)
|
||||
self.rms_error_iteration.append(rms_error_iteration)
|
||||
self.conf_poles_recognize.append(cond_poles_recognize)
|
||||
self.rms_error_poles_recongnize.append(rms_error_poles_recongnize)
|
||||
self.rel_iteration.append(rel)
|
||||
z = z_next
|
||||
|
||||
# ---- Finalize: refit residues with fixed poles z (pole–residue model) ----
|
||||
Phi = self._psi(self.s, z) # K x P
|
||||
# Build design matrix for extras
|
||||
extras = []
|
||||
if self.include_const: extras.append(np.ones(len(self.s), np.complex128))
|
||||
if self.include_linear: extras.append(self.s.astype(np.complex128))
|
||||
if extras:
|
||||
X_base = np.column_stack([Phi] + extras) # K x (P + E)
|
||||
else:
|
||||
X_base = Phi
|
||||
|
||||
res = np.empty((len(z), M), np.complex128)
|
||||
h = np.zeros(M, np.complex128)
|
||||
g = np.zeros(M, np.complex128)
|
||||
|
||||
for m, Hm in enumerate(H_list):
|
||||
theta, *_ = np.linalg.lstsq(X_base, Hm, rcond=None) # complex LS
|
||||
res[:, m] = theta[:len(z)]
|
||||
e = len(theta) - len(z)
|
||||
if e >= 1: h[m] = theta[len(z)]
|
||||
if e >= 2: g[m] = theta[len(z)+1]
|
||||
|
||||
# store the rational function
|
||||
self.poles = z # (P,)
|
||||
self.res = res # (P, M)
|
||||
self.h = h # (M,)
|
||||
self.g = g # (M,)
|
||||
return self
|
||||
|
||||
# Evaluate the stored **rational** model on any grid
|
||||
def evaluate(self, s_eval, m=None):
|
||||
if not hasattr(self, "poles"):
|
||||
raise RuntimeError("Model not fitted. Call fit(...) first.")
|
||||
s_eval = np.asarray(s_eval, np.complex128).reshape(-1)
|
||||
Phi = self._psi(s_eval, self.poles) # K_eval x P
|
||||
if m is None:
|
||||
H = Phi @ self.res
|
||||
if np.any(self.h): H += self.h
|
||||
if np.any(self.g): H += s_eval[:, None] * self.g
|
||||
return H # (K_eval, M) or (K_eval,1)
|
||||
m = int(m)
|
||||
H = Phi @ self.res[:, m]
|
||||
H += self.h[m]
|
||||
H += s_eval * self.g[m]
|
||||
return H # (K_eval,)
|
||||
|
||||
# def plot_rel_and_cond(self):
|
||||
# fig, (ax1, ax2) = plt.subplots(2,1,figsize=(15,20))
|
||||
# ax1.plot(np.log(self.rel), 'g-', label='rel')
|
||||
# ax2.plot(np.log(self.cond), 'b-', label='cond')
|
||||
# ax1.set_xlabel('Iteration')
|
||||
# ax1.set_ylabel('Relative Change', color='g')
|
||||
# ax2.set_ylabel('Condition Number', color='b')
|
||||
# ax1.tick_params(axis='y', labelcolor='g')
|
||||
# ax2.tick_params(axis='y', labelcolor='b')
|
||||
# fig.tight_layout()
|
||||
# plt.title('Relative Change and Condition Number per Iteration')
|
||||
# # plt.show()
|
||||
# plt.savefig(f"img_rel_cond.png")
|
||||
def plot_rel_and_cond(self):
|
||||
fig = make_subplots(rows=3, cols=2)
|
||||
fig.add_trace(plotly.graph_objs.Scatter(y=self.rel_iteration, mode='lines+markers', name='rel'), row=1, col=1)
|
||||
fig.add_trace(plotly.graph_objs.Scatter(y=self.cond_iteration, mode='lines+markers', name='cond_iteration'), row=2, col=1)
|
||||
fig.add_trace(plotly.graph_objs.Scatter(y=self.rms_error_iteration, mode='lines+markers', name='rms_error_iteration'), row=3, col=1)
|
||||
fig.add_trace(plotly.graph_objs.Scatter(y=self.conf_poles_recognize, mode='lines+markers', name='cond_poles_recognize'), row=2, col=2)
|
||||
fig.add_trace(plotly.graph_objs.Scatter(y=self.rms_error_poles_recongnize, mode='lines+markers', name='rms_error_poles_recognize'), row=3, col=2)
|
||||
fig.update_xaxes(title_text='Iteration', row=1, col=1)
|
||||
fig.update_yaxes(title_text='Relative Change', row=1, col=1)
|
||||
fig.update_yaxes(title_text='Condition Number (Iteration)', row=2, col=1)
|
||||
fig.update_yaxes(title_text='RMS Error (Iteration)', row=3, col=1)
|
||||
fig.update_yaxes(title_text='Condition Number (Pole Recognition)', row=2, col=2)
|
||||
fig.update_yaxes(title_text='RMS Error (Pole Recognition)', row=3, col=2)
|
||||
fig.update_layout(height=800, width=800, title_text='Relative Change and Condition Number per Iteration')
|
||||
fig.write_image("img_rel_cond.png")
|
||||
# fig.show()
|
||||
|
||||
def evaluate_on_freq(self, freq_eval, m=None):
|
||||
return self.evaluate(1j * 2*np.pi * np.asarray(freq_eval, float), m=m)
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# formula_67(s,y)
|
||||
H11 = np.array([y[i,0,0] for i in range(len(y))])
|
||||
H11_slice,freqs_slice = auto_select(H11,freqs,max_points=20)
|
||||
s_slice = freqs_slice * 2j * np.pi
|
||||
P_pairs = 2
|
||||
start_point = 0
|
||||
id = 3000
|
||||
network = rf.Network(f"/tmp/paramer/simulation/{id}/{id}.s2p")
|
||||
# network = rf.data.ring_slot
|
||||
ports = network.nports
|
||||
K = 100
|
||||
|
||||
K = 10
|
||||
f70 = formula_70_psi(s_slice,P_pairs, H11_slice, beta_min=1e8, beta_max=freqs_slice[-1],alpha_scale=0.01, n_iter=K, d0=1.0, verbose=True)
|
||||
model = f70.fit()
|
||||
model.plot_rel_and_cond()
|
||||
full_freqences = network.f[start_point:]
|
||||
noised_sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports)
|
||||
sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports)
|
||||
|
||||
Hfit_dense = model.evaluate_on_freq(freqs)
|
||||
# noised_sampled_points = network.y[start_point:,0,0].reshape(-1,1,1)
|
||||
# sampled_points = network.y[start_point:,0,0].reshape(-1,1,1)
|
||||
|
||||
fig, axes = plt.subplots(2, 1, figsize=(10, 8), sharex=False)
|
||||
H,freqs = auto_select_multple_ports(noised_sampled_points,full_freqences,max_points=20)
|
||||
|
||||
# (1) Magnitude plot like your screenshot
|
||||
ax0 = axes[0]
|
||||
ax0.plot(freqs, np.abs(H11), 'o', ms=4, color='red', label='Samples')
|
||||
ax0.plot(freqs, np.abs(Hfit_dense), '-', lw=2, color='k', label='Fit')
|
||||
ax0.plot(freqs_slice, np.abs(H11_slice), 'x', ms=4, color='blue', label='Input Samples')
|
||||
ax0.set_title("Response i=0, j=0")
|
||||
ax0.set_ylabel("Magnitude")
|
||||
ax0.legend(loc="best")
|
||||
vf = VFManager(npoles_cplx=2,freqs=freqs,H=H,model=MultiPortOrthonormalBasis,iterations=K,verbose=False)
|
||||
model = vf.fit()
|
||||
vf.plot_metrics(show=False,save_path="outputs")
|
||||
model_responses = vf.get_model_responses(full_freqences)
|
||||
vf.plot_model_responses(show=False,save_path="outputs")
|
||||
|
||||
# (2) RMS error vs iteration
|
||||
# ax1 = axes[1]
|
||||
# its = np.arange(1, K+1)
|
||||
# ax1.plot(its, hist["rms_rel"], '-o', lw=2)
|
||||
# ax1.set_xlabel("Iteration")
|
||||
# ax1.set_ylabel("RMS error (relative)")
|
||||
# ax1.grid(True, alpha=0.3)
|
||||
# ax1.set_title(f"RMS(final) = {hist['rms_rel'][-1]:.3e}")
|
||||
# # Original plot functions
|
||||
|
||||
# Dt_1 = np.ones((len(freqs),1),np.complex128)
|
||||
# # Levi step (no weighting):
|
||||
# basis = MultiPortOrthonormalBasis(H,freqs,poles=poles)
|
||||
# Dt = basis.Dt
|
||||
# poles = basis.next_poles
|
||||
|
||||
fig.tight_layout()
|
||||
plt.savefig(f"img_formula_70.png")
|
||||
# print("Levi step (no weighting):")
|
||||
# print("A:",basis.A)
|
||||
# print("B:",basis.B)
|
||||
# print("C:",basis.C)
|
||||
# print("D:",basis.D)
|
||||
# print("next_pozles:",basis.next_poles)
|
||||
# print("Dt:",Dt, "norm:",np.linalg.norm(Dt))
|
||||
|
||||
# # SK weighting (optional, after first pass):
|
||||
# least_squares_condition = []
|
||||
# least_squares_rms_error = []
|
||||
# eigenval_condition = []
|
||||
# eigenval_rms_error = []
|
||||
# for i in range(K):
|
||||
# basis = MultiPortOrthonormalBasis(H,freqs,poles=poles,weights=Dt)
|
||||
# Dt_1 = Dt
|
||||
# Dt = basis.Dt
|
||||
# poles = basis.next_poles
|
||||
# print(f"SK Iteration {i+1}/{K}")
|
||||
# print("A:",basis.A)
|
||||
# print("B:",basis.B)
|
||||
# print("C:",basis.C)
|
||||
# print("D:",basis.D)
|
||||
# print("z:",basis.next_poles)
|
||||
# print("Dt:",Dt)
|
||||
# print("Dt/Dt-1",np.linalg.norm(Dt) / np.linalg.norm(Dt_1))
|
||||
# least_squares_condition.append(basis.least_squares_condition)
|
||||
# least_squares_rms_error.append(basis.least_squares_rms_error)
|
||||
# eigenval_condition.append(basis.eigenval_condition)
|
||||
# eigenval_rms_error.append(basis.eigenval_rms_error)
|
||||
|
||||
# # H11_evaluated = basis.evaluate_pole_residue(network.f[1:],poles,basis.C[0])
|
||||
# H_evaluated = basis.get_model_responses(full_freqences)
|
||||
# fitted_points = H_evaluated
|
||||
# sliced_freqences = freqs
|
||||
|
||||
# input_points = H
|
||||
# for i in range(ports):
|
||||
# for j in range(ports):
|
||||
# fig, axes = plt.subplots(3, 2, figsize=(15, 16), sharex=False)
|
||||
# ax00 = axes[0][0]
|
||||
# ax00.plot(full_freqences, np.abs(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
|
||||
# ax00.plot(full_freqences, np.abs(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
# ax00.plot(sliced_freqences, np.abs(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
|
||||
# ax00.set_title(f"Response i={i+1}, j={j+1}")
|
||||
# ax00.set_ylabel("Magnitude")
|
||||
# ax00.legend(loc="best")
|
||||
|
||||
# ax01 = axes[0][1]
|
||||
# ax01.set_title(f"Response i={i+1}, j={j+1}")
|
||||
# ax01.set_ylabel("Phase (deg)")
|
||||
# ax01.plot(full_freqences, np.angle(sampled_points[:,i,j],deg=True), 'o', ms=4, color='red', label='Samples')
|
||||
# ax01.plot(full_freqences, np.angle(fitted_points[:,i,j],deg=True), '-', lw=2, color='k', label='Fit')
|
||||
# ax01.plot(sliced_freqences, np.angle(input_points[:,i,j],deg=True), 'x', ms=4, color='blue', label='Input Samples')
|
||||
# ax01.legend(loc="best")
|
||||
|
||||
# # ax00 = axes[0][0]
|
||||
# # ax00.plot(full_freqences, np.real(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
|
||||
# # ax00.plot(full_freqences, np.real(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
# # ax00.plot(sliced_freqences, np.real(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
|
||||
# # ax00.set_title(f"Response i={i+1}, j={j+1}")
|
||||
# # ax00.set_ylabel("Real Part")
|
||||
# # ax00.legend(loc="best")
|
||||
|
||||
# # ax01 = axes[0][1]
|
||||
# # ax01.set_title(f"Response i={i+1}, j={j+1}")
|
||||
# # ax01.set_ylabel("Imag Part")
|
||||
# # ax01.plot(full_freqences, np.imag(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples')
|
||||
# # ax01.plot(full_freqences, np.imag(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit')
|
||||
# # ax01.plot(sliced_freqences, np.imag(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples')
|
||||
# # ax01.legend(loc="best")
|
||||
|
||||
# ax10 = axes[1][0]
|
||||
# ax10.plot(least_squares_condition, label='Least Squares Condition')
|
||||
# ax10.set_title("least_squares_condition")
|
||||
# ax10.set_ylabel("Magnitude")
|
||||
# ax10.legend(loc="best")
|
||||
|
||||
# ax11 = axes[1][1]
|
||||
# ax11.plot(least_squares_rms_error, label='Least Squares RMS Error')
|
||||
# ax11.set_title("least_squares_rms_error")
|
||||
# ax11.set_ylabel("Magnitude")
|
||||
# ax11.legend(loc="best")
|
||||
|
||||
# ax20 = axes[2][0]
|
||||
# ax20.plot(eigenval_condition, label='Eigenvalue Condition')
|
||||
# ax20.set_title("eigenval_condition")
|
||||
# ax20.set_ylabel("Magnitude")
|
||||
# ax20.legend(loc="best")
|
||||
|
||||
# ax21 = axes[2][1]
|
||||
# ax21.plot(eigenval_rms_error, label='Eigenvalue RMS Error')
|
||||
# ax21.set_title("eigenval_rms_error")
|
||||
# ax21.set_ylabel("Magnitude")
|
||||
# ax21.legend(loc="best")
|
||||
# fig.tight_layout()
|
||||
# plt.savefig(f"MultiplePortQR_port_{i+1}{j+1}.png")
|
||||
# print(f"Saved MultiplePortQR_port_{i+1}{j+1}.png")
|
||||
155
models/basic.py
155
models/basic.py
@@ -1,155 +0,0 @@
|
||||
from abc import abstractmethod
|
||||
from skrf import Network
|
||||
from schemas.paramer import SimulationRequestUnit, UuidResponseUnit, SimulationResponseUnit
|
||||
from typing import List, Literal, Union, Dict
|
||||
import requests
|
||||
import time
|
||||
from utils import send_get_request
|
||||
from pydantic import BaseModel, Field
|
||||
import itertools
|
||||
import json
|
||||
import numpy as np
|
||||
|
||||
class ModelBasicParametersUnit(BaseModel):
|
||||
name: str
|
||||
type: Literal["number","integer","string","boolean"]
|
||||
range: List[Union[float,int,str,bool]]
|
||||
|
||||
class ModelBasicInfo(BaseModel):
|
||||
base_url: str = Field(default="http://localhost:8105/api/v1")
|
||||
nports: int = Field(default=2)
|
||||
cell_name: str
|
||||
template_name: str
|
||||
user_id: int = Field(default=0)
|
||||
template_version: str = Field(default="")
|
||||
|
||||
class ModelBasicDatasetUnit(BaseModel):
|
||||
nports: int = Field(default=2)
|
||||
parameters: Dict[str, Union[float, int, str, bool]]
|
||||
id: int = Field(default=0)
|
||||
result_dir: str = Field(default="")
|
||||
|
||||
@property
|
||||
def network(self) -> Network:
|
||||
try:
|
||||
network = Network(f"{self.result_dir}/{self.id}.s{self.nports}p")
|
||||
return network
|
||||
except Exception as e:
|
||||
raise RuntimeError(f"Error loading network from {self.result_dir}: {e}")
|
||||
|
||||
@property
|
||||
def s_params(self) -> np.ndarray:
|
||||
return self.network.s
|
||||
|
||||
@property
|
||||
def y_params(self) -> np.ndarray:
|
||||
return self.network.y
|
||||
|
||||
@property
|
||||
def z_params(self) -> np.ndarray:
|
||||
return self.network.z
|
||||
|
||||
@property
|
||||
def freqs(self) -> np.ndarray:
|
||||
return self.network.f
|
||||
|
||||
|
||||
class ModelBasic:
|
||||
def __init__(self):
|
||||
self._dataset:List[ModelBasicDatasetUnit] = []
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def info(self)->ModelBasicInfo:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def parameters(self)->List[ModelBasicParametersUnit]:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def settings(self)->dict:
|
||||
pass
|
||||
|
||||
def sweep(self):
|
||||
parameters_list = []
|
||||
lst = [res.range for res in self.parameters]
|
||||
parameters_name = [res.name for res in self.parameters]
|
||||
result = [list(item) for item in itertools.product(*lst)]
|
||||
for res in result:
|
||||
parameters_list.append({parameters_name[i]:res[i] for i in range(len(res))})
|
||||
|
||||
for res in parameters_list:
|
||||
print(f"Simulating with parameters: {res}")
|
||||
request_unit = SimulationRequestUnit(
|
||||
user_id=self.info.user_id,
|
||||
template_name=self.info.template_name,
|
||||
template_version=self.info.template_version,
|
||||
cell_name=self.info.cell_name,
|
||||
parameters=res,
|
||||
settings=self.settings
|
||||
)
|
||||
response = self.simulate(request_unit)
|
||||
|
||||
self._dataset.append(ModelBasicDatasetUnit(nports=self.info.nports,parameters=res, id=response.id, result_dir=response.result_path))
|
||||
|
||||
@property
|
||||
def results(self)->List[ModelBasicDatasetUnit]:
|
||||
return self._dataset
|
||||
|
||||
def export(self, path:str|None):
|
||||
if path is None:
|
||||
path = f"{self.info.cell_name}_dataset.json"
|
||||
with open(path,"w") as f:
|
||||
json.dump([dict(item) for item in self.results],f,indent=4)
|
||||
|
||||
def load(self, path:str|None):
|
||||
if path is None:
|
||||
path = f"{self.info.cell_name}_dataset.json"
|
||||
with open(path,"r") as f:
|
||||
data = json.load(f)
|
||||
self._dataset += [ModelBasicDatasetUnit(**item) for item in data]
|
||||
|
||||
def clear(self):
|
||||
self._dataset = []
|
||||
|
||||
def simulate(self,simulation_request:SimulationRequestUnit)->UuidResponseUnit:
|
||||
def send_simulate_request(url, data:list)->list[dict]:
|
||||
response = requests.post(url, json = data)
|
||||
if response.status_code not in [200,201,202]:
|
||||
raise RuntimeError(f"send_simulate_request: {response.status_code}, {response.text}")
|
||||
return response.json()
|
||||
|
||||
response = send_simulate_request(f"{self.info.base_url}/simulations/create", [dict(simulation_request)])
|
||||
|
||||
simulation_response_model:SimulationResponseUnit = SimulationResponseUnit(**(response[0]))
|
||||
|
||||
time.sleep(0.05)
|
||||
|
||||
response = send_get_request(f"{self.info.base_url}/simulations/input_hash/{simulation_response_model.input_hash}")
|
||||
|
||||
assert isinstance(response, dict), "Response is not a dictionary."
|
||||
uuid_model = UuidResponseUnit(**response)
|
||||
|
||||
|
||||
time.sleep(0.05) # Wait for 2 seconds before checking the status again
|
||||
|
||||
status = uuid_model.status
|
||||
while status != "completed" and status != "failed":
|
||||
time.sleep(0.05) # Wait for 2 seconds before checking again
|
||||
response = send_get_request(f"{self.info.base_url}/simulations/input_hash/{simulation_response_model.input_hash}")
|
||||
assert isinstance(response, dict), "Response is not a dictionary."
|
||||
try:
|
||||
uuid_model = UuidResponseUnit(**response)
|
||||
except Exception as e:
|
||||
print(f"Error parsing response: {e}")
|
||||
continue
|
||||
assert response is not None, "No response received from the server."
|
||||
status = uuid_model.status
|
||||
|
||||
if status == "failed":
|
||||
raise RuntimeError(f"Simulation failed: {uuid_model.error_message}")
|
||||
else:
|
||||
return uuid_model
|
||||
@@ -1,45 +0,0 @@
|
||||
from typing import List,Optional
|
||||
from pydantic import BaseModel, Field
|
||||
from schemas.paramer import SimulationRequestUnit
|
||||
from skrf import Network
|
||||
import re
|
||||
from models.basic import ModelBasic, ModelBasicParametersUnit, ModelBasicInfo, ModelBasicDatasetUnit
|
||||
|
||||
W = []
|
||||
L = []
|
||||
i = 15.52
|
||||
while i <= 100:
|
||||
W.append(i)
|
||||
L.append(i)
|
||||
i = int(i*1.05*100 + 0.5) / 100.0
|
||||
|
||||
class Capa(ModelBasic):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
@property
|
||||
def info(self) -> ModelBasicInfo:
|
||||
return ModelBasicInfo(
|
||||
nports=2,
|
||||
cell_name="capa",
|
||||
template_name="em_interface_compound",
|
||||
user_id=0,
|
||||
template_version=""
|
||||
)
|
||||
|
||||
@property
|
||||
def settings(self) -> dict:
|
||||
return {}
|
||||
|
||||
@property
|
||||
def parameters(self) -> List[ModelBasicParametersUnit]:
|
||||
return [
|
||||
ModelBasicParametersUnit(name="W",type="number",range=W),
|
||||
ModelBasicParametersUnit(name="L",type="number",range=L)
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
from typing import List,Optional
|
||||
from pydantic import BaseModel, Field
|
||||
from schemas.paramer import SimulationRequestUnit
|
||||
from skrf import Network
|
||||
import re
|
||||
from models.basic import ModelBasic, ModelBasicParametersUnit, ModelBasicInfo, ModelBasicDatasetUnit
|
||||
|
||||
W = []
|
||||
L = []
|
||||
i = 15.52
|
||||
while i <= 100:
|
||||
W.append(i)
|
||||
L.append(i)
|
||||
i = int(i*1.05*100 + 0.5) / 100.0
|
||||
|
||||
class Mlin(ModelBasic):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
@property
|
||||
def info(self) -> ModelBasicInfo:
|
||||
return ModelBasicInfo(
|
||||
nports=2,
|
||||
cell_name="mlin",
|
||||
template_name="em_interface_compound",
|
||||
user_id=0,
|
||||
template_version=""
|
||||
)
|
||||
|
||||
@property
|
||||
def settings(self) -> dict:
|
||||
return {}
|
||||
|
||||
@property
|
||||
def parameters(self) -> List[ModelBasicParametersUnit]:
|
||||
return [
|
||||
ModelBasicParametersUnit(name="W",type="number",range=W),
|
||||
ModelBasicParametersUnit(name="L",type="number",range=L)
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,309 +0,0 @@
|
||||
! Created with skrf 1.8.0 (http://scikit-rf.org).
|
||||
# Hz S RI R 50.0
|
||||
!freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22
|
||||
0.0 0.5169316987261682 -0.14305278198989352 0.4988694955145437 0.12530267192181432 0.4988694955145437 0.12530267192181432 0.5263854174928203 -0.14417829506357768
|
||||
1000.0 0.5169316947040424 -0.14305278151191225 0.4988694984093659 0.12530266799393616 0.4988694984093659 0.12530266799393616 0.5263854133767084 -0.14417829453782283
|
||||
10000.0 0.5169316585049104 -0.14305277721008075 0.4988695244627657 0.12530263264303276 0.4988695244627657 0.12530263264303276 0.5263853763317018 -0.14417828980602918
|
||||
12589.0 0.5169316480916267 -0.14305277597258723 0.4988695319574604 0.12530262247375623 0.4988695319574604 0.12530262247375623 0.5263853656750881 -0.14417828844484987
|
||||
15849.0 0.5169316349794967 -0.14305277441436826 0.4988695413945808 0.12530260966887344 0.4988695413945808 0.12530260966887344 0.5263853522565635 -0.14417828673088906
|
||||
19953.0 0.5169316184726925 -0.1430527724527331 0.4988695532749311 0.12530259354886147 0.4988695532749311 0.12530259354886147 0.5263853353640404 -0.14417828457319115
|
||||
25119.0 0.5169315976943908 -0.14305276998348182 0.4988695682295826 0.12530257325744293 0.4988695682295826 0.12530257325744293 0.5263853141002066 -0.14417828185714157
|
||||
31623.0 0.5169315715344848 -0.1430527668746916 0.4988695870575062 0.1253025477105234 0.4988695870575062 0.1253025477105234 0.526385287329015 -0.14417827843763203
|
||||
39811.0 0.5169315386013189 -0.14305276296098088 0.4988696107603104 0.12530251554905705 0.4988696107603104 0.12530251554905705 0.5263852536262912 -0.1441782741327513
|
||||
50119.0 0.5169314971412463 -0.14305275803394987 0.49886964060013766 0.12530247506048903 0.49886964060013766 0.12530247506048903 0.5263852111974101 -0.1441782687132703
|
||||
63096.0 0.5169314449461201 -0.14305275183118685 0.4988696781662454 0.1253024240884142 0.4988696781662454 0.1253024240884142 0.5263851577826266 -0.1441782618905496
|
||||
79433.0 0.5169313792366513 -0.14305274402240672 0.49886972545895575 0.12530235991866878 0.49886972545895575 0.12530235991866878 0.5263850905377072 -0.1441782533012926
|
||||
100000.0 0.5169312965135905 -0.14305273419176578 0.498869784996764 0.12530227913399875 0.498869784996764 0.12530227913399875 0.5263850058816346 -0.14417824248809258
|
||||
125893.0 0.5169311923686877 -0.14305272181539658 0.4988698599523953 0.12530217742944966 0.4988698599523953 0.12530217742944966 0.5263848993031504 -0.1441782288747222
|
||||
158489.0 0.5169310612634759 -0.14305270623511884 0.4988699543120198 0.12530204939633327 0.4988699543120198 0.12530204939633327 0.5263847651343683 -0.1441782117372171
|
||||
199526.0 0.5169308962075003 -0.14305268662020118 0.49887007310683856 0.1253018882079974 0.49887007310683856 0.1253018882079974 0.5263845962214859 -0.14417819016181527
|
||||
251189.0 0.5169306884124163 -0.14305266192625446 0.49887022266203807 0.12530168528202823 0.49887022266203807 0.12530168528202823 0.5263843835707991 -0.1441781629997424
|
||||
316228.0 0.5169304268173779 -0.14305263083883016 0.4988704109383793 0.12530142981676085 0.4988704109383793 0.12530142981676085 0.526384115863 -0.14417812880517264
|
||||
398107.0 0.5169300974897413 -0.14305259170220114 0.4988706479635265 0.12530110820602533 0.4988706479635265 0.12530110820602533 0.5263837788398773 -0.14417808575689117
|
||||
501187.0 0.5169296828890162 -0.14305254243189108 0.4988709463617992 0.125300703320345 0.4988709463617992 0.125300703320345 0.5263833545510671 -0.14417803156208114
|
||||
630957.0 0.5169291609377541 -0.14305248040426072 0.4988713220228765 0.12530019359959674 0.4988713220228765 0.12530019359959674 0.5263828204032315 -0.1441779633348741
|
||||
794328.0 0.5169285038390437 -0.14305240231598146 0.4988717949528746 0.12529955189821454 0.4988717949528746 0.12529955189821454 0.5263821479499213 -0.14417787744177832
|
||||
1000000.0 0.5169276766003909 -0.14305230400861618 0.49887239033674674 0.12529874404365846 0.49887239033674674 0.12529874404365846 0.5263813013809635 -0.14417776930872658
|
||||
1258925.0 0.5169266351714739 -0.14305218024731395 0.49887313987858567 0.12529772701780695 0.49887313987858567 0.12529772701780695 0.526380235616701 -0.14417763317765178
|
||||
1584893.0 0.5169253240871785 -0.14305202444071294 0.49887408349798956 0.12529644665522024 0.49887408349798956 0.12529644665522024 0.5263788938959513 -0.14417746179839447
|
||||
1995262.0 0.5169236735314454 -0.14305182829201415 0.4988752714432822 0.12529483477578932 0.4988752714432822 0.12529483477578932 0.5263772047712447 -0.144177246044902
|
||||
2511886.0 0.5169215956047378 -0.14305158135541474 0.49887676697790806 0.1252928055396649 0.49887676697790806 0.1252928055396649 0.5263750782890728 -0.1441769744273278
|
||||
3162278.0 0.5169189796463092 -0.14305127048021582 0.4988786497471103 0.12529025087913537 0.4988786497471103 0.12529025087913537 0.5263724012028501 -0.14417663248057871
|
||||
3981072.0 0.5169156863538554 -0.1430508791120138 0.49888102001016127 0.12528703475606862 0.49888102001016127 0.12528703475606862 0.5263690309551585 -0.14417620199566117
|
||||
5011872.0 0.5169115403466041 -0.14305038640891315 0.4988840039928882 0.12528298589926556 0.4988840039928882 0.12528298589926556 0.5263647880670566 -0.14417566004756066
|
||||
6309573.0 0.5169063208299607 -0.14304976613213158 0.49888776060655593 0.12527788868785483 0.49888776060655593 0.12527788868785483 0.5263594465845839 -0.14417497777496466
|
||||
7943282.0 0.5168997498468791 -0.14304898524981696 0.4988924899036425 0.12527147167796068 0.4988924899036425 0.12527147167796068 0.5263527220555985 -0.14417411884453263
|
||||
10000000.0 0.5168914774683946 -0.14304800217712021 0.4988984437365743 0.12526339314025572 0.4988984437365743 0.12526339314025572 0.5263442563742526 -0.14417303751506683
|
||||
12589254.0 0.516881063163137 -0.14304676456218599 0.49890593916654286 0.12525322286602916 0.49890593916654286 0.12525322286602916 0.526333598715163 -0.14417167620221563
|
||||
15848932.0 0.5168679523282272 -0.14304520649713184 0.498915375354792 0.12524041924801782 0.498915375354792 0.12524041924801782 0.5263201815158981 -0.14416996241069416
|
||||
19952623.0 0.5168514467668739 -0.14304324500966592 0.49892725481061334 0.12522430044978053 0.49892725481061334 0.12522430044978053 0.5263032902647165 -0.14416780487524355
|
||||
25118864.0 0.5168306674957757 -0.14304077564319373 0.49894221015976653 0.12520400808460874 0.49894221015976653 0.12520400808460874 0.5262820254388815 -0.14416508869897593
|
||||
31622777.0 0.5168045079396447 -0.14303766689455033 0.49896103783152573 0.12517846150680842 0.49896103783152573 0.12517846150680842 0.5262552546054668 -0.14416166923516513
|
||||
39810717.0 0.5167715750151072 -0.14303375321253045 0.49898474046203506 0.12514630027614093 0.49898474046203506 0.12514630027614093 0.5262215521285504 -0.14415736438598972
|
||||
50118723.0 0.5167301149184613 -0.14302882617865584 0.49901458030667317 0.12510581168454307 0.49901458030667317 0.12510581168454307 0.5261791232228341 -0.1441519449018302
|
||||
63095734.0 0.5166779197480051 -0.14302262341036215 0.49905214644624535 0.12505483956650784 0.49905214644624535 0.12505483956650784 0.5261257083939916 -0.14414512217534436
|
||||
79432823.0 0.5166122099212112 -0.1430148145876941 0.4990994394142159 0.12499066947149441 0.4990994394142159 0.12499066947149441 0.5260584631082538 -0.14413653287154995
|
||||
100000000.0 0.5165294861484319 -0.1430049838621606 0.49915897773484985 0.12490988410622846 0.49915897773484985 0.12490988410622846 0.525973806307144 -0.14412571957846906
|
||||
125892541.0 0.5164253430918343 -0.1429926077123401 0.4992339320374304 0.12480818136003487 0.4992339320374304 0.12480818136003487 0.5258672297121321 -0.1441121064494314
|
||||
158489319.0 0.5162942347507815 -0.14297702706275484 0.499328293914133 0.12468014518777729 0.499328293914133 0.12468014518777729 0.525733057727714 -0.14409496853526813
|
||||
199526231.0 0.516129179129203 -0.14295741218713942 0.4994470884781358 0.12451895719754857 0.4994470884781358 0.12451895719754857 0.5255641452076658 -0.14407339317971052
|
||||
251188643.0 0.5159213864101769 -0.14293271852146178 0.4995966419754571 0.1243160335379748 0.4995966419754571 0.1243160335379748 0.5253514969410836 -0.14404623141598272
|
||||
316227766.0 0.5156597908770215 -0.14290163103837383 0.49978491867278524 0.1240605677874669 0.49978491867278524 0.1240605677874669 0.5250837886357498 -0.14401203678155508
|
||||
398107171.0 0.5153304616115358 -0.14286249421578498 0.5000219449923526 0.12373895546115266 0.5000219449923526 0.12373895546115266 0.5247467638460045 -0.1439689882871723
|
||||
501187234.0 0.5149158606330113 -0.14281322387560505 0.5003203434474182 0.12333406953339042 0.5003203434474182 0.12333406953339042 0.5243224747764942 -0.1439147934439998
|
||||
630957344.0 0.514393908928449 -0.1427511961926681 0.50069600484314 0.12282434835303803 0.50069600484314 0.12282434835303803 0.5237883264880697 -0.14384656617914132
|
||||
794328235.0 0.5137368106564871 -0.14267310796550947 0.5011689345257409 0.12218264739897594 0.5011689345257409 0.12218264739897594 0.5231158736265745 -0.1437606731406718
|
||||
800000996.0 0.5137139940982403 -0.14267039649196073 0.5011853561602363 0.12216036548496063 0.5011853561602363 0.12216036548496063 0.5230925239077618 -0.14375769065905702
|
||||
1000000000.0 0.5129095729488049 -0.14257480071256423 0.5017643177176059 0.1213747937659555 0.5017643177176059 0.1213747937659555 0.5222693056360564 -0.14365254021249166
|
||||
1600000990.0 0.5104962935004823 -0.1422880114729652 0.5035012139053171 0.11901806298384085 0.5035012139053171 0.11901806298384085 0.5197996344470474 -0.14333708678134274
|
||||
2400000990.0 0.5072785928785918 -0.14190562645110177 0.505817071667767 0.11587576045915382 0.505817071667767 0.11587576045915382 0.5165067449616364 -0.14291648290047396
|
||||
3200000980.0 0.5040608922969224 -0.14152324143401826 0.5081329294012686 0.11273345797374554 0.5081329294012686 0.11273345797374554 0.5132138555173865 -0.14249587902486277
|
||||
4000000980.0 0.5008431916750319 -0.14114085641215496 0.5104487871637186 0.10959115544905842 0.5104487871637186 0.10959115544905842 0.5099209660319755 -0.1420752751439941
|
||||
4800000980.0 0.49762549105314136 -0.14075847139029166 0.5127646449261685 0.10644885292437128 0.5127646449261685 0.10644885292437128 0.5066280765465645 -0.14165467126312542
|
||||
5600000970.0 0.4944077904714721 -0.1403760863732082 0.5150805026596701 0.10330655043896295 0.5150805026596701 0.10330655043896295 0.5033351871023147 -0.1412340673875143
|
||||
6400000970.0 0.49119008984958146 -0.13999370135134492 0.51739636042212 0.10016424791427578 0.51739636042212 0.10016424791427578 0.5000422976169037 -0.14081346350664567
|
||||
7200000960.0 0.48797238926791214 -0.1396113163342615 0.5197122181556217 0.0970219454288674 0.5197122181556217 0.0970219454288674 0.4967494081726538 -0.14039285963103457
|
||||
8000000960.0 0.4847546886460215 -0.13922893131239825 0.5220280759180717 0.09387964290418022 0.5220280759180717 0.09387964290418022 0.49345651868724266 -0.13997225575016592
|
||||
8800000960.0 0.48153698802413086 -0.138846546290535 0.5243439336805215 0.09073734037949305 0.5243439336805215 0.09073734037949305 0.4901636292018316 -0.1395516518692973
|
||||
9600000950.0 0.47831928744246155 -0.13846416127345157 0.5266597914140232 0.08759503789408464 0.5266597914140232 0.08759503789408464 0.48687073975758166 -0.13913104799368622
|
||||
10400000900.0 0.4751015870216772 -0.1380817762754874 0.5289756490317319 0.08445273556579136 0.5289756490317319 0.08445273556579136 0.48357785047797625 -0.13871044413910533
|
||||
11200000900.0 0.47188388639978657 -0.13769939125362413 0.5312915067941818 0.08131043304110418 0.5312915067941818 0.08131043304110418 0.4802849609925652 -0.1382898402582367
|
||||
12000000900.0 0.4686661857778959 -0.13731700623176088 0.5336073645566316 0.078168130516417 0.5336073645566316 0.078168130516417 0.4769920715071541 -0.13786923637736806
|
||||
12800000900.0 0.4654484851560053 -0.13693462120989763 0.5359232223190815 0.07502582799172978 0.5359232223190815 0.07502582799172978 0.473699182021743 -0.13744863249649944
|
||||
13600000900.0 0.4622307845341146 -0.1365522361880344 0.5382390800815314 0.0718835254670426 0.5382390800815314 0.0718835254670426 0.4704062925363319 -0.13702802861563082
|
||||
14400000900.0 0.45901308391222395 -0.13616985116617114 0.5405549378439812 0.0687412229423554 0.5405549378439812 0.0687412229423554 0.46711340305092086 -0.13660742473476217
|
||||
15200000900.0 0.4557953832903334 -0.13578746614430787 0.5428707956064311 0.06559892041766822 0.5428707956064311 0.06559892041766822 0.4638205135655099 -0.13618682085389353
|
||||
16000000900.0 0.4525776826684428 -0.13540508112244465 0.545186653368881 0.06245661789298104 0.545186653368881 0.06245661789298104 0.46052762408009884 -0.1357662169730249
|
||||
16800000900.0 0.44935998204655214 -0.1350226961005814 0.5475025111313307 0.059314315368293846 0.5475025111313307 0.059314315368293846 0.4572347345946877 -0.13534561309215629
|
||||
17600000900.0 0.4461422814246615 -0.13464031107871813 0.5498183688937807 0.056172012843606664 0.5498183688937807 0.056172012843606664 0.45394184510927665 -0.13492500921128764
|
||||
18400000900.0 0.44292458080277086 -0.13425792605685488 0.5521342266562306 0.05302971031891947 0.5521342266562306 0.05302971031891947 0.4506489556238656 -0.134504405330419
|
||||
19200000900.0 0.4397068801808802 -0.13387554103499164 0.5544500844186804 0.049887407794232286 0.5544500844186804 0.049887407794232286 0.44735606613845447 -0.13408380144955034
|
||||
20000000900.0 0.4364891795589896 -0.1334931560131284 0.5567659421811303 0.04674510526954509 0.5567659421811303 0.04674510526954509 0.4440631766530434 -0.13366319756868175
|
||||
20800000900.0 0.43327147893709894 -0.13311077099126514 0.5590817999435801 0.04360280274485791 0.5590817999435801 0.04360280274485791 0.44077028716763234 -0.1332425936878131
|
||||
21600000900.0 0.43005377831520825 -0.13272838596940187 0.56139765770603 0.040460500220170684 0.56139765770603 0.040460500220170684 0.43747739768222127 -0.13282198980694446
|
||||
22400000900.0 0.4268360776933176 -0.13234600094753862 0.5637135154684798 0.03731819769548349 0.5637135154684798 0.03731819769548349 0.43418450819681015 -0.1324013859260758
|
||||
23200000900.0 0.42361837707142697 -0.13196361592567538 0.5660293732309296 0.03417589517079632 0.5660293732309296 0.03417589517079632 0.4308916187113991 -0.1319807820452072
|
||||
24000000900.0 0.4204006764495363 -0.1315812309038121 0.5683452309933795 0.031033592646109123 0.5683452309933795 0.031033592646109123 0.427598729225988 -0.13156017816433854
|
||||
24800000900.0 0.4171829758276457 -0.13119884588194886 0.5706610887558294 0.02789129012142194 0.5706610887558294 0.02789129012142194 0.42430583974057695 -0.1311395742834699
|
||||
25600000900.0 0.413965275205755 -0.13081646086008564 0.5729769465182792 0.024748987596734745 0.5729769465182792 0.024748987596734745 0.42101295025516583 -0.13071897040260128
|
||||
26400000900.0 0.41074757458386435 -0.13043407583822236 0.5752928042807292 0.02160668507204755 0.5752928042807292 0.02160668507204755 0.41772006076975476 -0.13029836652173266
|
||||
27200000900.0 0.4075298739619737 -0.13005169081635912 0.577608662043179 0.018464382547360367 0.577608662043179 0.018464382547360367 0.4144271712843437 -0.129877762640864
|
||||
28000000900.0 0.40431217334008307 -0.12966930579449584 0.5799245198056288 0.01532208002267317 0.5799245198056288 0.01532208002267317 0.41113428179893263 -0.12945715875999536
|
||||
28800000900.0 0.40109447271819243 -0.1292869207726326 0.5822403775680787 0.012179777497985989 0.5822403775680787 0.012179777497985989 0.40784139231352157 -0.1290365548791267
|
||||
29600000900.0 0.3978767720963018 -0.12890453575076935 0.5845562353305285 0.009037474973298792 0.5845562353305285 0.009037474973298792 0.40454850282811045 -0.1286159509982581
|
||||
30400000800.0 0.3946590718766237 -0.1285221507767042 0.5868720928034962 0.0058951728413994126 0.5868720928034962 0.0058951728413994126 0.4012556137543105 -0.12819534716996492
|
||||
31200000800.0 0.39144137125473305 -0.12813976575484096 0.589187950565946 0.0027528703167122442 0.589187950565946 0.0027528703167122442 0.39796272426889945 -0.1277747432890963
|
||||
32000000800.0 0.3882236706328424 -0.1277573807329777 0.5915038083283959 -0.0003894322079749657 0.5915038083283959 -0.0003894322079749657 0.3946698347834884 -0.12735413940822765
|
||||
32800000800.0 0.38500597001095177 -0.12737499571111444 0.5938196660908457 -0.003531734732662134 0.5938196660908457 -0.003531734732662134 0.3913769452980773 -0.126933535527359
|
||||
33333334200.0 0.38286083599488296 -0.1271200723313402 0.5953635714588004 -0.005626603344312142 0.5953635714588004 -0.005626603344312142 0.38918168536672915 -0.12665313290506292
|
||||
33600000800.0 0.3817882693890611 -0.12699261068925122 0.5961355238532955 -0.00667403725734933 0.5961355238532955 -0.00667403725734933 0.38808405581266625 -0.12651293164649038
|
||||
34400000800.0 0.37857056876717043 -0.12661022566738794 0.5984513816157454 -0.009816339782036526 0.5984513816157454 -0.009816339782036526 0.3847911663272552 -0.12609232776562176
|
||||
35200000800.0 0.3753528681452798 -0.1262278406455247 0.6007672393781952 -0.012958642306723722 0.6007672393781952 -0.012958642306723722 0.38149827684184406 -0.12567172388475312
|
||||
36000000800.0 0.37213516752338927 -0.12584545562366145 0.6030830971406451 -0.01610094483141089 0.6030830971406451 -0.01610094483141089 0.378205387356433 -0.12525112000388447
|
||||
36800000800.0 0.3689174669014986 -0.12546307060179818 0.6053989549030949 -0.019243247356098087 0.6053989549030949 -0.019243247356098087 0.374912497871022 -0.12483051612301584
|
||||
37600000800.0 0.365699766279608 -0.12508068557993493 0.6077148126655447 -0.022385549880785283 0.6077148126655447 -0.022385549880785283 0.3716196083856109 -0.12440991224214719
|
||||
38400000800.0 0.36248206565771734 -0.12469830055807167 0.6100306704279946 -0.02552785240547245 0.6100306704279946 -0.02552785240547245 0.36832671890019986 -0.12398930836127856
|
||||
39200000800.0 0.3592643650358267 -0.12431591553620841 0.6123465281904446 -0.028670154930159675 0.6123465281904446 -0.028670154930159675 0.3650338294147888 -0.12356870448040991
|
||||
40000000800.0 0.35604666441393606 -0.12393353051434516 0.6146623859528944 -0.03181245745484684 0.6146623859528944 -0.03181245745484684 0.3617409399293777 -0.12314810059954127
|
||||
40800000800.0 0.3528289637920454 -0.1235511454924819 0.6169782437153443 -0.03495475997953404 0.6169782437153443 -0.03495475997953404 0.35844805044396666 -0.12272749671867263
|
||||
41600000800.0 0.3496112631701548 -0.12316876047061864 0.6192941014777941 -0.03809706250422121 0.6192941014777941 -0.03809706250422121 0.3551551609585556 -0.122306892837804
|
||||
42400000800.0 0.3463935625482641 -0.12278637544875538 0.621609959240244 -0.041239365028908403 0.621609959240244 -0.041239365028908403 0.3518622714731445 -0.12188628895693535
|
||||
43200000800.0 0.34317586192637345 -0.12240399042689212 0.6239258170026938 -0.0443816675535956 0.6239258170026938 -0.0443816675535956 0.3485693819877334 -0.12146568507606671
|
||||
44000000800.0 0.3399581613044828 -0.12202160540502888 0.6262416747651436 -0.047523970078282796 0.6262416747651436 -0.047523970078282796 0.3452764925023223 -0.12104508119519806
|
||||
44800000800.0 0.3367404606825921 -0.12163922038316562 0.6285575325275935 -0.05066627260297002 0.6285575325275935 -0.05066627260297002 0.3419836030169112 -0.12062447731432943
|
||||
45600000800.0 0.3335227600607015 -0.12125683536130236 0.6308733902900433 -0.05380857512765719 0.6308733902900433 -0.05380857512765719 0.33869071353150015 -0.12020387343346078
|
||||
46400000800.0 0.33030505943881083 -0.12087445033943911 0.6331892480524932 -0.056950877652344384 0.6331892480524932 -0.056950877652344384 0.3353978240460891 -0.11978326955259215
|
||||
47200000800.0 0.3270873588169202 -0.12049206531757584 0.635505105814943 -0.06009318017703158 0.635505105814943 -0.06009318017703158 0.33210493456067797 -0.1193626656717235
|
||||
48000000800.0 0.32386965819502955 -0.12010968029571262 0.6378209635773928 -0.06323548270171878 0.6378209635773928 -0.06323548270171878 0.3288120450752669 -0.11894206179085487
|
||||
48800000800.0 0.3206519575731389 -0.11972729527384936 0.6401368213398427 -0.06637778522640594 0.6401368213398427 -0.06637778522640594 0.32551915558985584 -0.11852145790998625
|
||||
49600000800.0 0.3174342569512483 -0.1193449102519861 0.6424526791022925 -0.06952008775109311 0.6424526791022925 -0.06952008775109311 0.32222626610444477 -0.11810085402911762
|
||||
50400000700.0 0.31421655673157023 -0.11896252527792098 0.6447685365752602 -0.0726623898829925 0.6447685365752602 -0.0726623898829925 0.31893337703064484 -0.11768025020082445
|
||||
51200000700.0 0.3109988561096796 -0.11858014025605772 0.64708439433771 -0.0758046924076797 0.64708439433771 -0.0758046924076797 0.31564048754523377 -0.11725964631995581
|
||||
52000000700.0 0.30778115548778895 -0.11819775523419446 0.6494002521001598 -0.07894699493236687 0.6494002521001598 -0.07894699493236687 0.3123475980598227 -0.11683904243908717
|
||||
52800000700.0 0.3045634548658982 -0.11781537021233121 0.6517161098626097 -0.0820892974570541 0.6517161098626097 -0.0820892974570541 0.30905470857441164 -0.11641843855821853
|
||||
53600000700.0 0.3013457542440076 -0.11743298519046795 0.6540319676250597 -0.08523159998174126 0.6540319676250597 -0.08523159998174126 0.3057618190890005 -0.11599783467734989
|
||||
54400000700.0 0.298128053622117 -0.11705060016860469 0.6563478253875095 -0.08837390250642846 0.6563478253875095 -0.08837390250642846 0.30246892960358945 -0.11557723079648125
|
||||
55200000700.0 0.29491035300022633 -0.11666821514674144 0.6586636831499593 -0.09151620503111563 0.6586636831499593 -0.09151620503111563 0.2991760401181784 -0.11515662691561261
|
||||
56000000700.0 0.29169265237833564 -0.11628583012487817 0.6609795409124092 -0.09465850755580285 0.6609795409124092 -0.09465850755580285 0.29588315063276727 -0.11473602303474396
|
||||
56800000700.0 0.288474951756445 -0.11590344510301492 0.663295398674859 -0.09780081008049002 0.663295398674859 -0.09780081008049002 0.2925902611473562 -0.11431541915387533
|
||||
57600000700.0 0.28525725113455436 -0.11552106008115166 0.6656112564373089 -0.10094311260517722 0.6656112564373089 -0.10094311260517722 0.28929737166194514 -0.11389481527300668
|
||||
58400000700.0 0.2820395505126637 -0.1151386750592884 0.6679271141997587 -0.10408541512986441 0.6679271141997587 -0.10408541512986441 0.28600448217653407 -0.11347421139213805
|
||||
59200000700.0 0.2788218498907731 -0.11475629003742516 0.6702429719622085 -0.10722771765455161 0.6702429719622085 -0.10722771765455161 0.282711592691123 -0.1130536075112694
|
||||
60000000700.0 0.27560414926888244 -0.1143739050155619 0.6725588297246584 -0.11037002017923878 0.6725588297246584 -0.11037002017923878 0.27941870320571194 -0.11263300363040077
|
||||
60800000700.0 0.2723864486469918 -0.11399151999369864 0.6748746874871082 -0.11351232270392594 0.6748746874871082 -0.11351232270392594 0.2761258137203008 -0.11221239974953212
|
||||
61600000700.0 0.2691687480251011 -0.11360913497183538 0.6771905452495581 -0.11665462522861317 0.6771905452495581 -0.11665462522861317 0.2728329242348897 -0.11179179586866347
|
||||
62400000700.0 0.26595104740321046 -0.11322674994997212 0.6795064030120079 -0.11979692775330034 0.6795064030120079 -0.11979692775330034 0.26954003474947863 -0.11137119198779484
|
||||
63200000700.0 0.2627333467813198 -0.11284436492810887 0.6818222607744578 -0.12293923027798753 0.6818222607744578 -0.12293923027798753 0.26624714526406756 -0.1109505881069262
|
||||
64000000700.0 0.2595156461594292 -0.11246197990624561 0.6841381185369076 -0.1260815328026747 0.6841381185369076 -0.1260815328026747 0.2629542557786565 -0.11052998422605756
|
||||
64800000700.0 0.25629794553753854 -0.11207959488438235 0.6864539762993576 -0.12922383532736192 0.6864539762993576 -0.12922383532736192 0.2596613662932454 -0.11010938034518891
|
||||
65600000700.0 0.2530802449156479 -0.1116972098625191 0.6887698340618074 -0.1323661378520491 0.6887698340618074 -0.1323661378520491 0.2563684768078343 -0.10968877646432028
|
||||
66400000700.0 0.24986254429375726 -0.11131482484065584 0.6910856918242572 -0.13550844037673626 0.6910856918242572 -0.13550844037673626 0.25307558732242325 -0.10926817258345164
|
||||
66666667300.0 0.24878997768793537 -0.11118736319856684 0.6918576442187524 -0.1365558742897735 0.6918576442187524 -0.1365558742897735 0.25197795776836035 -0.10912797132487909
|
||||
67200000700.0 0.24664484367186656 -0.11093243981879258 0.6934015495867071 -0.13865074290142348 0.6934015495867071 -0.13865074290142348 0.24978269783701218 -0.108847568702583
|
||||
68000000700.0 0.24342714304997592 -0.11055005479692932 0.6957174073491569 -0.14179304542611065 0.6957174073491569 -0.14179304542611065 0.24648980835160106 -0.10842696482171435
|
||||
68800000700.0 0.24020944242808528 -0.11016766977506606 0.6980332651116068 -0.14493534795079788 0.6980332651116068 -0.14493534795079788 0.24319691886619 -0.10800636094084572
|
||||
69600000700.0 0.23699174180619464 -0.10978528475320282 0.7003491228740566 -0.14807765047548505 0.7003491228740566 -0.14807765047548505 0.23990402938077893 -0.10758575705997708
|
||||
70400000600.0 0.23377404158651655 -0.10940289977913768 0.7026649803470242 -0.1512199526073844 0.7026649803470242 -0.1512199526073844 0.23661114030697905 -0.10716515323168392
|
||||
71200000600.0 0.2305563409646259 -0.10902051475727442 0.7049808381094741 -0.15436225513207158 0.7049808381094741 -0.15436225513207158 0.23331825082156799 -0.10674454935081529
|
||||
72000000600.0 0.22733864034273527 -0.10863812973541118 0.7072966958719239 -0.1575045576567588 0.7072966958719239 -0.1575045576567588 0.23002536133615692 -0.10632394546994664
|
||||
72800000600.0 0.22412093972084463 -0.1082557447135479 0.7096125536343738 -0.16064686018144603 0.7096125536343738 -0.16064686018144603 0.2267324718507458 -0.10590334158907799
|
||||
73600000600.0 0.22090323909895399 -0.10787335969168466 0.7119284113968236 -0.1637891627061332 0.7119284113968236 -0.1637891627061332 0.22343958236533473 -0.10548273770820936
|
||||
74400000600.0 0.21768553847706335 -0.10749097466982141 0.7142442691592734 -0.16693146523082036 0.7142442691592734 -0.16693146523082036 0.22014669287992367 -0.10506213382734073
|
||||
75200000600.0 0.2144678378551727 -0.10710858964795814 0.7165601269217233 -0.17007376775550753 0.7165601269217233 -0.17007376775550753 0.2168538033945126 -0.10464152994647208
|
||||
76000000600.0 0.211250137233282 -0.10672620462609489 0.7188759846841732 -0.17321607028019476 0.7188759846841732 -0.17321607028019476 0.21356091390910148 -0.10422092606560343
|
||||
76800000600.0 0.20803243661139137 -0.10634381960423163 0.721191842446623 -0.17635837280488192 0.721191842446623 -0.17635837280488192 0.21026802442369041 -0.1038003221847348
|
||||
77600000600.0 0.20481473598950073 -0.10596143458236837 0.7235077002090728 -0.1795006753295691 0.7235077002090728 -0.1795006753295691 0.20697513493827935 -0.10337971830386616
|
||||
78400000600.0 0.2015970353676101 -0.10557904956050512 0.7258235579715228 -0.18264297785425632 0.7258235579715228 -0.18264297785425632 0.20368224545286823 -0.10295911442299752
|
||||
79200000600.0 0.19837933474571945 -0.10519666453864185 0.7281394157339726 -0.18578528037894348 0.7281394157339726 -0.18578528037894348 0.20038935596745716 -0.10253851054212887
|
||||
80000000600.0 0.1951616341238288 -0.1048142795167786 0.7304552734964225 -0.1889275829036307 0.7304552734964225 -0.1889275829036307 0.1970964664820461 -0.10211790666126024
|
||||
80800000600.0 0.19194393350193817 -0.10443189449491538 0.7327711312588723 -0.19206988542831788 0.7327711312588723 -0.19206988542831788 0.19380357699663503 -0.1016973027803916
|
||||
81600000600.0 0.18872623288004747 -0.10404950947305211 0.7350869890213221 -0.1952121879530051 0.7350869890213221 -0.1952121879530051 0.1905106875112239 -0.10127669889952295
|
||||
82400000600.0 0.18550853225815683 -0.10366712445118886 0.737402846783772 -0.19835449047769227 0.737402846783772 -0.19835449047769227 0.18721779802581284 -0.10085609501865433
|
||||
83200000600.0 0.1822908316362662 -0.1032847394293256 0.7397187045462218 -0.20149679300237944 0.7397187045462218 -0.20149679300237944 0.18392490854040178 -0.1004354911377857
|
||||
84000000600.0 0.17907313101437555 -0.10290235440746234 0.7420345623086717 -0.2046390955270666 0.7420345623086717 -0.2046390955270666 0.1806320190549907 -0.10001488725691707
|
||||
84800000600.0 0.1758554303924849 -0.1025199693855991 0.7443504200711215 -0.20778139805175383 0.7443504200711215 -0.20778139805175383 0.1773391295695796 -0.09959428337604842
|
||||
85600000600.0 0.17263772977059427 -0.10213758436373582 0.7466662778335714 -0.210923700576441 0.7466662778335714 -0.210923700576441 0.17404624008416852 -0.09917367949517977
|
||||
86400000600.0 0.16942002914870363 -0.10175519934187258 0.7489821355960212 -0.21406600310112817 0.7489821355960212 -0.21406600310112817 0.17075335059875746 -0.09875307561431114
|
||||
87200000600.0 0.16620232852681294 -0.10137281432000932 0.7512979933584711 -0.2172083056258154 0.7512979933584711 -0.2172083056258154 0.16746046111334634 -0.09833247173344249
|
||||
88000000600.0 0.16298462790492235 -0.10099042929814606 0.7536138511209209 -0.22035060815050256 0.7536138511209209 -0.22035060815050256 0.16416757162793533 -0.09791186785257386
|
||||
88800000600.0 0.15976692728303166 -0.10060804427628281 0.7559297088833707 -0.22349291067518978 0.7559297088833707 -0.22349291067518978 0.16087468214252415 -0.09749126397170521
|
||||
89600000600.0 0.15654922666114102 -0.10022565925441954 0.7582455666458207 -0.226635213199877 0.7582455666458207 -0.226635213199877 0.15758179265711308 -0.09707066009083656
|
||||
90400000500.0 0.15333152644146297 -0.09984327428035442 0.7605614241187882 -0.22977751533177632 0.7605614241187882 -0.22977751533177632 0.15428890358331326 -0.09665005626254342
|
||||
91200000500.0 0.15011382581957228 -0.09946088925849116 0.7628772818812382 -0.23291981785646354 0.7628772818812382 -0.23291981785646354 0.1509960140979021 -0.09622945238167477
|
||||
92000000500.0 0.14689612519768164 -0.0990785042366279 0.765193139643688 -0.2360621203811507 0.765193139643688 -0.2360621203811507 0.14770312461249102 -0.09580884850080613
|
||||
92800000500.0 0.143678424575791 -0.09869611921476465 0.7675089974061378 -0.23920442290583793 0.7675089974061378 -0.23920442290583793 0.14441023512707996 -0.0953882446199375
|
||||
93600000500.0 0.14046072395390036 -0.09831373419290139 0.7698248551685877 -0.2423467254305251 0.7698248551685877 -0.2423467254305251 0.1411173456416689 -0.09496764073906885
|
||||
94400000500.0 0.13724302333200972 -0.09793134917103813 0.7721407129310376 -0.24548902795521227 0.7721407129310376 -0.24548902795521227 0.13782445615625782 -0.0945470368582002
|
||||
95200000500.0 0.13402532271011908 -0.09754896414917488 0.7744565706934874 -0.24863133047989944 0.7744565706934874 -0.24863133047989944 0.13453156667084676 -0.09412643297733159
|
||||
96000000500.0 0.13080762208822844 -0.09716657912731162 0.7767724284559372 -0.2517736330045866 0.7767724284559372 -0.2517736330045866 0.1312386771854357 -0.09370582909646294
|
||||
96800000500.0 0.12758992146633774 -0.09678419410544836 0.7790882862183871 -0.2549159355292739 0.7790882862183871 -0.2549159355292739 0.12794578770002457 -0.09328522521559429
|
||||
97600000500.0 0.1243722208444471 -0.0964018090835851 0.781404143980837 -0.25805823805396105 0.781404143980837 -0.25805823805396105 0.12465289821461345 -0.09286462133472564
|
||||
98400000500.0 0.12115452022255646 -0.09601942406172184 0.7837200017432868 -0.2612005405786482 0.7837200017432868 -0.2612005405786482 0.12136000872920238 -0.09244401745385701
|
||||
99200000500.0 0.11793681960066582 -0.0956370390398586 0.7860358595057366 -0.2643428431033354 0.7860358595057366 -0.2643428431033354 0.11806711924379132 -0.09202341357298838
|
||||
100000000000.0 0.11471912098983805 -0.09525465425698598 0.7883517158207753 -0.2674851436640835 0.7883517158207753 -0.2674851436640835 0.1147742318164362 -0.09160280995499716
|
||||
100800000000.0 0.11150142036794741 -0.09487226923512272 0.7906675735832251 -0.2706274461887707 0.7906675735832251 -0.2706274461887707 0.11148134233102514 -0.09118220607412852
|
||||
101600000000.0 0.10828371974605677 -0.09448988421325946 0.7929834313456751 -0.2737697487134579 0.7929834313456751 -0.2737697487134579 0.10818845284561407 -0.09076160219325988
|
||||
102400000000.0 0.10506601912416613 -0.09410749919139622 0.7952992891081249 -0.27691205123814505 0.7952992891081249 -0.27691205123814505 0.104895563360203 -0.09034099831239123
|
||||
103200000000.0 0.10184831850227544 -0.09372511416953294 0.7976151468705748 -0.28005435376283233 0.7976151468705748 -0.28005435376283233 0.10160267387479183 -0.08992039443152258
|
||||
104000000000.0 0.0986306178803848 -0.0933427291476697 0.7999310046330246 -0.2831966562875195 0.7999310046330246 -0.2831966562875195 0.09830978438938076 -0.08949979055065395
|
||||
104800000000.0 0.09541291725849416 -0.09296034412580644 0.8022468623954745 -0.28633895881220667 0.8022468623954745 -0.28633895881220667 0.0950168949039697 -0.08907918666978532
|
||||
105600000000.0 0.09219521663660352 -0.09257795910394317 0.8045627201579243 -0.28948126133689384 0.8045627201579243 -0.28948126133689384 0.09172400541855863 -0.08865858278891667
|
||||
106400000000.0 0.08897751601471288 -0.09219557408207993 0.8068785779203742 -0.292623563861581 0.8068785779203742 -0.292623563861581 0.08843111593314756 -0.08823797890804803
|
||||
107200000000.0 0.08575981539282224 -0.09181318906021667 0.809194435682824 -0.2957658663862682 0.809194435682824 -0.2957658663862682 0.0851382264477365 -0.0878173750271794
|
||||
108000000000.0 0.0825421147709316 -0.09143080403835341 0.8115102934452738 -0.2989081689109554 0.8115102934452738 -0.2989081689109554 0.08184533696232543 -0.08739677114631075
|
||||
108800000000.0 0.0793244141490409 -0.09104841901649015 0.8138261512077237 -0.3020504714356426 0.8138261512077237 -0.3020504714356426 0.07855244747691426 -0.0869761672654421
|
||||
109600000000.0 0.07610671352715026 -0.09066603399462689 0.8161420089701736 -0.3051927739603298 0.8161420089701736 -0.3051927739603298 0.07525955799150319 -0.08655556338457346
|
||||
110400000000.0 0.07288901290525962 -0.09028364897276364 0.8184578667326234 -0.308335076485017 0.8184578667326234 -0.308335076485017 0.07196666850609212 -0.08613495950370482
|
||||
111200000000.0 0.06967131228336898 -0.08990126395090038 0.8207737244950732 -0.3114773790097042 0.8207737244950732 -0.3114773790097042 0.06867377902068106 -0.08571435562283619
|
||||
112000000000.0 0.06645361166147834 -0.08951887892903712 0.8230895822575232 -0.31461968153439135 0.8230895822575232 -0.31461968153439135 0.06538088953526999 -0.08529375174196754
|
||||
112800000000.0 0.0632359110395877 -0.08913649390717387 0.8254054400199731 -0.3177619840590785 0.8254054400199731 -0.3177619840590785 0.06208800004985893 -0.08487314786109891
|
||||
113600000000.0 0.06001821041769706 -0.08875410888531061 0.8277212977824229 -0.3209042865837657 0.8277212977824229 -0.3209042865837657 0.05879511056444786 -0.08445254398023028
|
||||
114400000000.0 0.05680050979580642 -0.08837172386344735 0.8300371555448727 -0.3240465891084529 0.8300371555448727 -0.3240465891084529 0.055502221079036795 -0.08403194009936163
|
||||
115200000000.0 0.053582809173915724 -0.0879893388415841 0.8323530133073226 -0.32718889163314013 0.8323530133073226 -0.32718889163314013 0.05220933159362562 -0.08361133621849298
|
||||
116000000000.0 0.050365108552025084 -0.08760695381972083 0.8346688710697725 -0.3303311941578273 0.8346688710697725 -0.3303311941578273 0.04891644210821455 -0.08319073233762433
|
||||
116800000000.0 0.047147407930134444 -0.08722456879785759 0.8369847288322223 -0.33347349668251447 0.8369847288322223 -0.33347349668251447 0.04562355262280349 -0.0827701284567557
|
||||
117600000000.0 0.043929707308243804 -0.08684218377599433 0.8393005865946721 -0.3366157992072017 0.8393005865946721 -0.3366157992072017 0.04233066313739242 -0.08234952457588707
|
||||
118400000000.0 0.040712006686353164 -0.08645979875413107 0.8416164443571219 -0.33975810173188886 0.8416164443571219 -0.33975810173188886 0.039037773651981356 -0.08192892069501842
|
||||
119200000000.0 0.037494306064462524 -0.08607741373226782 0.8439323021195718 -0.34290040425657603 0.8439323021195718 -0.34290040425657603 0.03574488416657029 -0.08150831681414979
|
||||
120000000000.0 0.034276605442571884 -0.08569502871040456 0.8462481598820216 -0.3460427067812632 0.8462481598820216 -0.3460427067812632 0.032451994681159224 -0.08108771293328114
|
||||
120800000000.0 0.031058904820681188 -0.0853126436885413 0.8485640176444715 -0.3491850093059505 0.8485640176444715 -0.3491850093059505 0.029159105195748103 -0.08066710905241249
|
||||
121600000000.0 0.027841204198790548 -0.08493025866667804 0.8508798754069213 -0.35232731183063765 0.8508798754069213 -0.35232731183063765 0.02586621571033698 -0.08024650517154386
|
||||
122400000000.0 0.024623503576899908 -0.08454787364481478 0.8531957331693713 -0.3554696143553248 0.8531957331693713 -0.3554696143553248 0.022573326224925916 -0.07982590129067521
|
||||
123200000000.0 0.021405802955009268 -0.08416548862295153 0.855511590931821 -0.358611916880012 0.855511590931821 -0.358611916880012 0.01928043673951485 -0.07940529740980658
|
||||
124000000000.0 0.018188102333118628 -0.08378310360108827 0.857827448694271 -0.36175421940469915 0.857827448694271 -0.36175421940469915 0.015987547254103784 -0.07898469352893794
|
||||
124800000000.0 0.014970401711227987 -0.08340071857922501 0.8601433064567208 -0.3648965219293864 0.8601433064567208 -0.3648965219293864 0.012694657768692719 -0.0785640896480693
|
||||
125600000000.0 0.011752701089337347 -0.08301833355736177 0.8624591642191706 -0.36803882445407354 0.8624591642191706 -0.36803882445407354 0.009401768283281653 -0.07814348576720066
|
||||
126400000000.0 0.008535000467446596 -0.0826359485354985 0.8647750219816205 -0.37118112697876077 0.8647750219816205 -0.37118112697876077 0.006108878797870476 -0.07772288188633202
|
||||
127200000000.0 0.005317299845555956 -0.08225356351363525 0.8670908797440704 -0.374323429503448 0.8670908797440704 -0.374323429503448 0.0028159893124594104 -0.07730227800546337
|
||||
128000000000.0 0.002099599223665316 -0.08187117849177199 0.8694067375065202 -0.37746573202813516 0.8694067375065202 -0.37746573202813516 -0.0004769001729516553 -0.07688167412459473
|
||||
128800000000.0 -0.001118101398225324 -0.08148879346990873 0.87172259526897 -0.3806080345528223 0.87172259526897 -0.3806080345528223 -0.003769789658362721 -0.07646107024372609
|
||||
129600000000.0 -0.004335802020115853 -0.08110640844804548 0.8740384530314198 -0.3837503370775095 0.8740384530314198 -0.3837503370775095 -0.007062679143773787 -0.07604046636285745
|
||||
130400000000.0 -0.007553502642006493 -0.08072402342618222 0.8763543107938697 -0.38689263960219666 0.8763543107938697 -0.38689263960219666 -0.010355568629184853 -0.07561986248198882
|
||||
131200000000.0 -0.010771203263897133 -0.08034163840431896 0.8786701685563195 -0.39003494212688383 0.8786701685563195 -0.39003494212688383 -0.013648458114595918 -0.07519925860112017
|
||||
132000000000.0 -0.013988903885787773 -0.07995925338245571 0.8809860263187694 -0.393177244651571 0.8809860263187694 -0.393177244651571 -0.016941347600006984 -0.07477865472025154
|
||||
132800000000.0 -0.017206604507678525 -0.07957686836059244 0.8833018840812192 -0.3963195471762583 0.8833018840812192 -0.3963195471762583 -0.02023423708541816 -0.07435805083938289
|
||||
133333334000.0 -0.019351740937022743 -0.07932194469402942 0.8848457911860673 -0.3984144181446352 0.8848457911860673 -0.3984144181446352 -0.022429499486433357 -0.07407764790163389
|
||||
133600000000.0 -0.020424305129569165 -0.0791944833387292 0.8856177418436691 -0.39946184970094545 0.8856177418436691 -0.39946184970094545 -0.023527126570829227 -0.07393744695851424
|
||||
134400000000.0 -0.023642005751459805 -0.07881209831686593 0.887933599606119 -0.4026041522256326 0.887933599606119 -0.4026041522256326 -0.026820016056240292 -0.07351684307764561
|
||||
135200000000.0 -0.026859706373350445 -0.07842971329500267 0.8902494573685689 -0.4057464547503198 0.8902494573685689 -0.4057464547503198 -0.030112905541651358 -0.07309623919677696
|
||||
136000000000.0 -0.030077406995241085 -0.07804732827313943 0.8925653151310187 -0.40888875727500695 0.8925653151310187 -0.40888875727500695 -0.033405795027062424 -0.07267563531590833
|
||||
136800000000.0 -0.033295107617131725 -0.07766494325127617 0.8948811728934685 -0.41203105979969423 0.8948811728934685 -0.41203105979969423 -0.03669868451247349 -0.0722550314350397
|
||||
137600000000.0 -0.036512808239022365 -0.0772825582294129 0.8971970306559183 -0.4151733623243814 0.8971970306559183 -0.4151733623243814 -0.039991573997884555 -0.07183442755417105
|
||||
138400000000.0 -0.039730508860913116 -0.07690017320754965 0.8995128884183683 -0.41831566484906857 0.8995128884183683 -0.41831566484906857 -0.04328446348329573 -0.0714138236733024
|
||||
139200000000.0 -0.042948209482803756 -0.07651778818568639 0.9018287461808181 -0.42145796737375585 0.9018287461808181 -0.42145796737375585 -0.0465773529687068 -0.07099321979243377
|
||||
140000000000.0 -0.046165910104694396 -0.07613540316382314 0.9041446039432679 -0.424600269898443 0.9041446039432679 -0.424600269898443 -0.049870242454117863 -0.07057261591156512
|
||||
140800000000.0 -0.04938361072658504 -0.07575301814195988 0.9064604617057177 -0.4277425724231302 0.9064604617057177 -0.4277425724231302 -0.05316313193952893 -0.07015201203069649
|
||||
141600000000.0 -0.05260131134847568 -0.07537063312009662 0.9087763194681676 -0.43088487494781735 0.9087763194681676 -0.43088487494781735 -0.056456021424939995 -0.06973140814982784
|
||||
142400000000.0 -0.05581901197036632 -0.07498824809823337 0.9110921772306175 -0.4340271774725045 0.9110921772306175 -0.4340271774725045 -0.05974891091035106 -0.0693108042689592
|
||||
143200000000.0 -0.059036712592256846 -0.07460586307637011 0.9134080349930673 -0.4371694799971917 0.9134080349930673 -0.4371694799971917 -0.06304180039576213 -0.06889020038809056
|
||||
144000000000.0 -0.0622544132141476 -0.07422347805450685 0.9157238927555171 -0.44031178252187897 0.9157238927555171 -0.44031178252187897 -0.06633468988117319 -0.06846959650722191
|
||||
144800000000.0 -0.06547211383603824 -0.07384109303264359 0.918039750517967 -0.44345408504656614 0.918039750517967 -0.44345408504656614 -0.06962757936658437 -0.06804899262635328
|
||||
145600000000.0 -0.06868981445792888 -0.07345870801078033 0.9203556082804168 -0.4465963875712533 0.9203556082804168 -0.4465963875712533 -0.07292046885199543 -0.06762838874548464
|
||||
146400000000.0 -0.07190751507981952 -0.07307632298891709 0.9226714660428668 -0.4497386900959405 0.9226714660428668 -0.4497386900959405 -0.0762133583374065 -0.067207784864616
|
||||
147200000000.0 -0.07512521570171016 -0.07269393796705383 0.9249873238053166 -0.45288099262062764 0.9249873238053166 -0.45288099262062764 -0.07950624782281757 -0.06678718098374736
|
||||
148000000000.0 -0.0783429163236008 -0.07231155294519057 0.9273031815677664 -0.4560232951453148 0.9273031815677664 -0.4560232951453148 -0.08279913730822863 -0.06636657710287872
|
||||
148800000000.0 -0.08156061694549144 -0.07192916792332732 0.9296190393302162 -0.459165597670002 0.9296190393302162 -0.459165597670002 -0.0860920267936397 -0.06594597322201008
|
||||
149600000000.0 -0.08477831756738208 -0.07154678290146406 0.9319348970926661 -0.46230790019468915 0.9319348970926661 -0.46230790019468915 -0.08938491627905076 -0.06552536934114143
|
||||
150400000000.0 -0.08799601818927283 -0.0711643978796008 0.934250754855116 -0.4654502027193764 0.934250754855116 -0.4654502027193764 -0.09267780576446183 -0.06510476546027279
|
||||
151200000000.0 -0.09121371881116347 -0.07078201285773754 0.9365666126175658 -0.4685925052440636 0.9365666126175658 -0.4685925052440636 -0.0959706952498729 -0.06468416157940415
|
||||
152000000000.0 -0.09443141943305411 -0.07039962783587428 0.9388824703800156 -0.47173480776875076 0.9388824703800156 -0.47173480776875076 -0.09926358473528407 -0.0642635576985355
|
||||
152800000000.0 -0.09764912005494475 -0.07001724281401103 0.9411983281424655 -0.47487711029343793 0.9411983281424655 -0.47487711029343793 -0.10255647422069514 -0.06384295381766687
|
||||
153600000000.0 -0.10086682067683539 -0.06963485779214777 0.9435141859049154 -0.4780194128181252 0.9435141859049154 -0.4780194128181252 -0.1058493637061062 -0.06342234993679824
|
||||
154400000000.0 -0.10408452129872603 -0.06925247277028451 0.9458300436673652 -0.4811617153428124 0.9458300436673652 -0.4811617153428124 -0.10914225319151727 -0.06300174605592959
|
||||
155200000000.0 -0.10730222192061667 -0.06887008774842127 0.948145901429815 -0.48430401786749955 0.948145901429815 -0.48430401786749955 -0.11243514267692833 -0.06258114217506096
|
||||
156000000000.0 -0.11051992254250731 -0.06848770272655799 0.9504617591922649 -0.4874463203921868 0.9504617591922649 -0.4874463203921868 -0.1157280321623394 -0.06216053829419231
|
||||
156800000000.0 -0.11373762316439795 -0.06810531770469475 0.9527776169547149 -0.490588622916874 0.9527776169547149 -0.490588622916874 -0.11902092164775047 -0.06173993441332366
|
||||
157600000000.0 -0.11695532378628859 -0.06772293268283149 0.9550934747171647 -0.49373092544156116 0.9550934747171647 -0.49373092544156116 -0.12231381113316153 -0.06131933053245503
|
||||
158400000000.0 -0.12017302440817923 -0.06734054766096823 0.9574093324796145 -0.49687322796624833 0.9574093324796145 -0.49687322796624833 -0.1256067006185726 -0.06089872665158638
|
||||
159200000000.0 -0.12339072503006987 -0.06695816263910498 0.9597251902420643 -0.5000155304909355 0.9597251902420643 -0.5000155304909355 -0.12889959010398377 -0.06047812277071775
|
||||
160000000000.0 -0.1266084256519605 -0.06657577761724172 0.9620410480045141 -0.5031578330156227 0.9620410480045141 -0.5031578330156227 -0.13219247958939484 -0.060057518889849115
|
||||
160800000000.0 -0.12982612627385115 -0.06619339259537846 0.964356905766964 -0.5063001355403098 0.964356905766964 -0.5063001355403098 -0.1354853690748059 -0.05963691500898047
|
||||
161600000000.0 -0.1330438268957419 -0.0658110075735152 0.9666727635294139 -0.5094424380649971 0.9666727635294139 -0.5094424380649971 -0.13877825856021697 -0.05921631112811182
|
||||
162400000000.0 -0.13626152751763254 -0.06542862255165194 0.9689886212918637 -0.5125847405896843 0.9689886212918637 -0.5125847405896843 -0.14207114804562804 -0.05879570724724319
|
||||
163200000000.0 -0.13947922813952318 -0.06504623752978869 0.9713044790543135 -0.5157270431143715 0.9713044790543135 -0.5157270431143715 -0.1453640375310391 -0.05837510336637454
|
||||
164000000000.0 -0.14269692876141382 -0.06466385250792543 0.9736203368167634 -0.5188693456390586 0.9736203368167634 -0.5188693456390586 -0.14865692701645017 -0.057954499485505906
|
||||
164800000000.0 -0.14591462938330446 -0.06428146748606217 0.9759361945792133 -0.5220116481637458 0.9759361945792133 -0.5220116481637458 -0.15194981650186123 -0.05753389560463726
|
||||
165600000000.0 -0.1491323300051951 -0.06389908246419893 0.9782520523416631 -0.525153950688433 0.9782520523416631 -0.525153950688433 -0.1552427059872723 -0.057113291723768625
|
||||
166400000000.0 -0.15235003062708574 -0.06351669744233567 0.9805679101041129 -0.5282962532131201 0.9805679101041129 -0.5282962532131201 -0.15853559547268348 -0.05669268784289999
|
||||
167200000000.0 -0.15556773124897638 -0.0631343124204724 0.9828837678665627 -0.5314385557378074 0.9828837678665627 -0.5314385557378074 -0.16182848495809454 -0.056272083962031344
|
||||
168000000000.0 -0.15878543187086702 -0.06275192739860914 0.9851996256290128 -0.5345808582624946 0.9851996256290128 -0.5345808582624946 -0.1651213744435056 -0.0558514800811627
|
||||
168800000000.0 -0.16200313249275766 -0.062369542376745885 0.9875154833914626 -0.5377231607871817 0.9875154833914626 -0.5377231607871817 -0.16841426392891667 -0.05543087620029406
|
||||
169600000000.0 -0.1652208331146483 -0.06198715735488264 0.9898313411539124 -0.5408654633118689 0.9898313411539124 -0.5408654633118689 -0.17170715341432774 -0.055010272319425416
|
||||
170400000000.0 -0.16843853373653894 -0.06160477233301938 0.9921471989163622 -0.5440077658365562 0.9921471989163622 -0.5440077658365562 -0.1750000428997388 -0.05458966843855678
|
||||
171200000000.0 -0.17165623435842958 -0.06122238731115612 0.9944630566788121 -0.5471500683612434 0.9944630566788121 -0.5471500683612434 -0.17829293238514987 -0.054169064557688135
|
||||
172000000000.0 -0.17487393498032022 -0.06084000228929287 0.9967789144412619 -0.5502923708859305 0.9967789144412619 -0.5502923708859305 -0.18158582187056094 -0.0537484606768195
|
||||
172800000000.0 -0.17809163560221086 -0.06045761726742961 0.9990947722037118 -0.5534346734106177 0.9990947722037118 -0.5534346734106177 -0.184878711355972 -0.05332785679595087
|
||||
173600000000.0 -0.1813093362241016 -0.06007523224556635 1.0014106299661616 -0.556576975935305 1.0014106299661616 -0.556576975935305 -0.18817160084138318 -0.052907252915082206
|
||||
174400000000.0 -0.18452703684599225 -0.05969284722370309 1.0037264877286116 -0.5597192784599921 1.0037264877286116 -0.5597192784599921 -0.19146449032679425 -0.05248664903421357
|
||||
175200000000.0 -0.1877447374678829 -0.05931046220183983 1.0060423454910614 -0.5628615809846793 1.0060423454910614 -0.5628615809846793 -0.1947573798122053 -0.05206604515334494
|
||||
176000000000.0 -0.19096243808977353 -0.058928077179976585 1.0083582032535112 -0.5660038835093665 1.0083582032535112 -0.5660038835093665 -0.19805026929761638 -0.05164544127247629
|
||||
176800000000.0 -0.19418013871166417 -0.058545692158113324 1.010674061015961 -0.5691461860340536 1.010674061015961 -0.5691461860340536 -0.20134315878302744 -0.05122483739160766
|
||||
177600000000.0 -0.19739783933355481 -0.058163307136250064 1.0129899187784108 -0.5722884885587408 1.0129899187784108 -0.5722884885587408 -0.2046360482684385 -0.05080423351073901
|
||||
178400000000.0 -0.20061553995544545 -0.05778092211438682 1.0153057765408606 -0.575430791083428 1.0153057765408606 -0.575430791083428 -0.20792893775384957 -0.05038362962987038
|
||||
179200000000.0 -0.2038332405773361 -0.05739853709252356 1.0176216343033104 -0.5785730936081152 1.0176216343033104 -0.5785730936081152 -0.21122182723926064 -0.049963025749001744
|
||||
180000000000.0 -0.20705094119922673 -0.0570161520706603 1.0199374920657602 -0.5817153961328023 1.0199374920657602 -0.5817153961328023 -0.2145147167246717 -0.049542421868133096
|
||||
180800000000.0 -0.21026864182111737 -0.05663376704879705 1.0222533498282103 -0.5848576986574895 1.0222533498282103 -0.5848576986574895 -0.21780760621008277 -0.04912181798726446
|
||||
181600000000.0 -0.21348634244300801 -0.05625138202693379 1.02456920759066 -0.5880000011821768 1.02456920759066 -0.5880000011821768 -0.22110049569549395 -0.048701214106395815
|
||||
182400000000.0 -0.21670404306489877 -0.05586899700507052 1.02688506535311 -0.591142303706864 1.02688506535311 -0.591142303706864 -0.22439338518090512 -0.048280610225527154
|
||||
183200000000.0 -0.2199217436867894 -0.05548661198320726 1.0292009231155599 -0.5942846062315512 1.0292009231155599 -0.5942846062315512 -0.2276862746663162 -0.04786000634465852
|
||||
184000000000.0 -0.22313944430868005 -0.05510422696134401 1.0315167808780097 -0.5974269087562384 1.0315167808780097 -0.5974269087562384 -0.23097916415172726 -0.04743940246378989
|
||||
184800000000.0 -0.2263571449305707 -0.05472184193948075 1.0338326386404595 -0.6005692112809256 1.0338326386404595 -0.6005692112809256 -0.23427205363713832 -0.04701879858292124
|
||||
185600000000.0 -0.22957484555246133 -0.05433945691761749 1.0361484964029093 -0.6037115138056127 1.0361484964029093 -0.6037115138056127 -0.2375649431225494 -0.046598194702052606
|
||||
186400000000.0 -0.23279254617435197 -0.053957071895754244 1.038464354165359 -0.6068538163302999 1.038464354165359 -0.6068538163302999 -0.24085783260796045 -0.04617759082118396
|
||||
187200000000.0 -0.2360102467962426 -0.053574686873890984 1.0407802119278091 -0.6099961188549872 1.0407802119278091 -0.6099961188549872 -0.24415072209337152 -0.045756986940315325
|
||||
188000000000.0 -0.23922794741813325 -0.053192301852027724 1.043096069690259 -0.6131384213796743 1.043096069690259 -0.6131384213796743 -0.24744361157878259 -0.04533638305944668
|
||||
188800000000.0 -0.2424456480400239 -0.05280991683016448 1.0454119274527087 -0.6162807239043615 1.0454119274527087 -0.6162807239043615 -0.25073650106419365 -0.044915779178578044
|
||||
189600000000.0 -0.24566334866191453 -0.05242753180830122 1.0477277852151587 -0.6194230264290487 1.0477277852151587 -0.6194230264290487 -0.2540293905496047 -0.04449517529770941
|
||||
190400000000.0 -0.24888104928380517 -0.05204514678643796 1.0500436429776085 -0.6225653289537358 1.0500436429776085 -0.6225653289537358 -0.2573222800350158 -0.04407457141684076
|
||||
191200000000.0 -0.2520987499056958 -0.05166276176457471 1.0523595007400584 -0.625707631478423 1.0523595007400584 -0.625707631478423 -0.26061516952042685 -0.04365396753597213
|
||||
192000000000.0 -0.25531645052758645 -0.05128037674271145 1.0546753585025082 -0.6288499340031102 1.0546753585025082 -0.6288499340031102 -0.2639080590058379 -0.04323336365510348
|
||||
192800000000.0 -0.2585341511494771 -0.05089799172084819 1.056991216264958 -0.6319922365277973 1.056991216264958 -0.6319922365277973 -0.267200948491249 -0.04281275977423485
|
||||
193600000000.0 -0.2617518517713677 -0.050515606698984944 1.0593070740274078 -0.6351345390524845 1.0593070740274078 -0.6351345390524845 -0.27049383797666005 -0.042392155893366215
|
||||
194400000000.0 -0.2649695523932585 -0.05013322167712167 1.0616229317898578 -0.6382768415771719 1.0616229317898578 -0.6382768415771719 -0.27378672746207133 -0.041971552012497554
|
||||
195200000000.0 -0.2681872530151491 -0.04975083665525841 1.0639387895523076 -0.6414191441018591 1.0639387895523076 -0.6414191441018591 -0.2770796169474824 -0.041550948131628906
|
||||
196000000000.0 -0.27140495363703976 -0.04936845163339515 1.0662546473147576 -0.6445614466265462 1.0662546473147576 -0.6445614466265462 -0.28037250643289346 -0.04113034425076027
|
||||
196800000000.0 -0.2746226542589304 -0.0489860666115319 1.0685705050772074 -0.6477037491512334 1.0685705050772074 -0.6477037491512334 -0.28366539591830453 -0.040709740369891625
|
||||
197600000000.0 -0.27784035488082104 -0.04860368158966864 1.0708863628396572 -0.6508460516759206 1.0708863628396572 -0.6508460516759206 -0.2869582854037156 -0.04028913648902299
|
||||
198400000000.0 -0.2810580555027117 -0.04822129656780538 1.073202220602107 -0.6539883542006077 1.073202220602107 -0.6539883542006077 -0.29025117488912666 -0.03986853260815436
|
||||
199200000000.0 -0.2842757561246023 -0.04783891154594214 1.0755180783645568 -0.6571306567252949 1.0755180783645568 -0.6571306567252949 -0.2935440643745377 -0.03944792872728571
|
||||
200000000000.0 -0.28749345674649296 -0.047456526524078876 1.0778339361270066 -0.6602729592499821 1.0778339361270066 -0.6602729592499821 -0.2968369538599488 -0.03902732484641708
|
||||
@@ -1,309 +0,0 @@
|
||||
! Created with skrf 1.8.0 (http://scikit-rf.org).
|
||||
# Hz S RI R 50.0
|
||||
!freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22
|
||||
0.0 0.54669299140207 -0.1662104177109195 0.46100154888068945 0.1530653599528759 0.46100154888068945 0.1530653599528759 0.5593473899566386 -0.16509997898188067
|
||||
1000.0 0.5466929861541492 -0.16621041680285528 0.46100155138238874 0.1530653541325667 0.46100155138238874 0.1530653541325667 0.559347384635358 -0.16509997772031268
|
||||
10000.0 0.5466929389228627 -0.16621040863027736 0.4610015738976825 0.15306530174978375 0.4610015738976825 0.15306530174978375 0.5593473367438332 -0.16509996636620083
|
||||
12589.0 0.546692925335996 -0.16621040627929912 0.46100158037458194 0.15306528668100317 0.46100158037458194 0.15306528668100317 0.5593473229670379 -0.16509996310000133
|
||||
15849.0 0.5466929082277745 -0.16621040331900977 0.4610015885301217 0.15306526770679513 0.4610015885301217 0.15306526770679513 0.5593473056196633 -0.1650999589872897
|
||||
19953.0 0.5466928866903079 -0.16621039959231423 0.4610015987970956 0.1530652438202461 0.4610015987970956 0.1530652438202461 0.559347283781128 -0.1650999538098147
|
||||
25119.0 0.5466928595795495 -0.1662103949012545 0.46100161172087417 0.15306521375252868 0.46100161172087417 0.15306521375252868 0.5593472562913927 -0.16509994729255453
|
||||
31623.0 0.5466928254470731 -0.16621038899520488 0.46100162799192645 0.15306517589723756 0.46100162799192645 0.15306517589723756 0.5593472216817841 -0.16509993908731635
|
||||
39811.0 0.5466927824770983 -0.16621038155997508 0.4610016484758403 0.1530651282405457 0.4610016484758403 0.1530651282405457 0.5593471781111391 -0.1650999287575977
|
||||
50119.0 0.5466927283815316 -0.16621037219964918 0.4610016742633567 0.1530650682447983 0.4610016742633567 0.1530650682447983 0.5593471232593793 -0.16509991575335498
|
||||
63096.0 0.5466926602792644 -0.16621036041569986 0.4610017067279085 0.15306499271464558 0.4610017067279085 0.15306499271464558 0.5593470542051218 -0.16509989938198727
|
||||
79433.0 0.5466925745439837 -0.1662103455806548 0.46100174759817003 0.15306489762825393 0.46100174759817003 0.15306489762825393 0.5593469672713616 -0.16509987877175114
|
||||
100000.0 0.5466924666099984 -0.16621032690449813 0.46100179905061955 0.15306477792195428 0.46100179905061955 0.15306477792195428 0.5593468578285848 -0.16509985282508244
|
||||
125893.0 0.5466923307255872 -0.16621030339199147 0.46100186382711955 0.15306462721668773 0.46100186382711955 0.15306462721668773 0.5593467200446678 -0.16509982015930266
|
||||
158489.0 0.5466921596643636 -0.16621027379273035 0.46100194537250994 0.1530644374978885 0.46100194537250994 0.1530644374978885 0.5593465465922074 -0.16509977903723272
|
||||
199526.0 0.5466919443054411 -0.16621023652849923 0.46100204803474415 0.1530641986498592 0.46100204803474415 0.1530641986498592 0.5593463282228179 -0.16509972726626743
|
||||
251189.0 0.5466916731821132 -0.16621018961517778 0.4610021772800351 0.15306389795522415 0.4610021772800351 0.15306389795522415 0.5593460533095016 -0.16509966208988075
|
||||
316228.0 0.5466913318625978 -0.1662101305555894 0.46100233998805595 0.15306351940813304 0.46100233998805595 0.15306351940813304 0.5593457072187367 -0.16509958003876077
|
||||
398107.0 0.5466909021680975 -0.16621005620419965 0.46100254482469305 0.1530630428470347 0.46100254482469305 0.1530630428470347 0.5593452715176075 -0.16509947674283593
|
||||
501187.0 0.54669036121243 -0.16620996260094054 0.46100280269985694 0.1530624428895607 0.46100280269985694 0.1530624428895607 0.5593447230000097 -0.16509934670040832
|
||||
630957.0 0.5466896801897587 -0.16620984476144754 0.46100312734537524 0.15306168758803368 0.46100312734537524 0.15306168758803368 0.5593440324574342 -0.16509918298673124
|
||||
794328.0 0.5466888228317034 -0.16620969641008893 0.4610035360504917 0.1530607367182967 0.4610035360504917 0.1530607367182967 0.5593431631145115 -0.1650989768831084
|
||||
1000000.0 0.5466877434813538 -0.166209509646706 0.46100405057999033 0.15305953964365956 0.46100405057999033 0.15305953964365956 0.5593420686761007 -0.16509871741389834
|
||||
1258925.0 0.5466863846634824 -0.16620927452617953 0.4610046983324818 0.15305803262009574 0.4610046983324818 0.15305803262009574 0.5593406908635374 -0.16509839076240854
|
||||
1584893.0 0.5466846740092625 -0.16620897852630398 0.46100551380639954 0.1530561353855411 0.46100551380639954 0.1530561353855411 0.5593389562963631 -0.16509797953161645
|
||||
1995262.0 0.5466825204252861 -0.16620860588490077 0.4610065404262399 0.1530537469110683 0.4610065404262399 0.1530537469110683 0.5593367726077901 -0.16509746182322513
|
||||
2511886.0 0.546679809223494 -0.16620813675713456 0.46100783286413954 0.15305073999963972 0.46100783286413954 0.15305073999963972 0.5593340235065535 -0.16509681006692783
|
||||
3162278.0 0.5466763960178437 -0.16620754615943462 0.4610094599493512 0.15304695451708789 0.4610094599493512 0.15304695451708789 0.559330562588262 -0.16509598955320468
|
||||
3981072.0 0.5466720990518489 -0.166206802641905 0.4610115083257286 0.1530421888828234 0.4610115083257286 0.1530421888828234 0.5593262055556852 -0.16509495658891016
|
||||
5011872.0 0.5466666894951747 -0.16620586660931375 0.46101408707736796 0.15303618930808321 0.46101408707736796 0.15303618930808321 0.5593207203797069 -0.16509365616463398
|
||||
6309573.0 0.5466598792632135 -0.16620468821347584 0.4610173335350524 0.15302863628699287 0.4610173335350524 0.15302863628699287 0.5593138149486316 -0.16509201902660173
|
||||
7943282.0 0.5466513056879083 -0.1662032047007977 0.46102142058371554 0.15301912759544334 0.46102142058371554 0.15301912759544334 0.5593051215247256 -0.1650899579916349
|
||||
10000000.0 0.546640512194909 -0.16620133706878468 0.4610265658736982 0.15300715686071253 0.4610265658736982 0.15300715686071253 0.5592941771512603 -0.16508736330205745
|
||||
12589254.0 0.5466269239952031 -0.16619898585988765 0.46103304340861984 0.15299208660179292 0.46103304340861984 0.15299208660179292 0.5592803990043426 -0.16508409678211294
|
||||
15848932.0 0.5466098174634991 -0.16619602586294838 0.46104119814279354 0.15297311426788723 0.46104119814279354 0.15297311426788723 0.5592630533432417 -0.16507998447671546
|
||||
19952623.0 0.5465882816184877 -0.1661922994480081 0.46105146434369926 0.1529492295173389 0.46105146434369926 0.1529492295173389 0.55924121645219 -0.1650748073915405
|
||||
25118864.0 0.5465611695953194 -0.16618760816943778 0.4610643887251971 0.1529191603972328 0.4610643887251971 0.1529191603972328 0.5592137254345031 -0.16506828982730595
|
||||
31622777.0 0.546527037575551 -0.16618170219879488 0.4610806595598022 0.15288130561245666 0.4610806595598022 0.15288130561245666 0.5591791162888364 -0.16506008469890535
|
||||
39810717.0 0.5464840679156028 -0.16617426702349875 0.4611011433235758 0.15283364926981186 0.4611011433235758 0.15283364926981186 0.5591355459630696 -0.16504975505596017
|
||||
50118723.0 0.5464299723173738 -0.1661649066921378 0.46112693085497947 0.152773653487488 0.46112693085497947 0.152773653487488 0.559080694171358 -0.16503675080562896
|
||||
63095734.0 0.5463618699925138 -0.1661531227328507 0.4611593954343257 0.15269812327076424 0.4611593954343257 0.15269812327076424 0.5590116398552845 -0.16502037942404513
|
||||
79432823.0 0.5462761342447099 -0.16613828760697735 0.46120026591845537 0.15260303636108943 0.46120026591845537 0.15260303636108943 0.5589247056215441 -0.16499976907563838
|
||||
100000000.0 0.5461681993304599 -0.1661196112895713 0.4612517188107773 0.15248332903124232 0.4612517188107773 0.15248332903124232 0.5588152619028559 -0.1649738221836484
|
||||
125892541.0 0.5460323173281535 -0.1660960991996931 0.46131649416249504 0.15233262643622567 0.46131649416249504 0.15233262643622567 0.5586774804283577 -0.16494115698294182
|
||||
158489319.0 0.5458612520216092 -0.16606649923211647 0.46139804149922853 0.1521429031088094 0.46139804149922853 0.1521429031088094 0.5585040238279905 -0.16490003393149014
|
||||
199526231.0 0.5456458935609996 -0.16602923508089748 0.46150070351328915 0.15190405559168585 0.46150070351328915 0.15190405559168585 0.5582856549068324 -0.16484826307721756
|
||||
251188643.0 0.545374773318821 -0.16598232229337812 0.46162994733327123 0.1516033643789841 0.46162994733327123 0.1516033643789841 0.5580107447193196 -0.1647830874323488
|
||||
316227766.0 0.5450334531578723 -0.1659232625933056 0.4617926556618101 0.1512248165719648 0.4617926556618101 0.1512248165719648 0.5576646532999023 -0.16470103615717366
|
||||
398107171.0 0.5446037565321509 -0.1658489108358039 0.46199749331205503 0.1507482531164152 0.46199749331205503 0.1507482531164152 0.5572289500156269 -0.164597739721414
|
||||
501187234.0 0.5440628005341162 -0.16575530751947015 0.4622553686335967 0.15014829527571583 0.4622553686335967 0.15014829527571583 0.556680432082547 -0.16446769721431742
|
||||
630957344.0 0.5433817772855165 -0.16563746792659956 0.46258001442705865 0.1493929931084779 0.46258001442705865 0.1493929931084779 0.5559898889218124 -0.16430398339847893
|
||||
794328235.0 0.5425244198022299 -0.16548911666695781 0.4629887192708573 0.14844212400590961 0.4629887192708573 0.14844212400590961 0.5551205465790867 -0.1640978799131498
|
||||
800000996.0 0.5424946496022605 -0.16548396543570207 0.46300291081308503 0.14840910678277924 0.46300291081308503 0.14840910678277924 0.5550903602263816 -0.16409072333950084
|
||||
1000000000.0 0.5414450706859694 -0.16530235349743766 0.4635032481815683 0.14724505073654004 0.4635032481815683 0.14724505073654004 0.5540261094188117 -0.163838410999558
|
||||
1600000990.0 0.5382963130608676 -0.16475751407036499 0.46500427023877794 0.1437528594446324 0.46500427023877794 0.1437528594446324 0.5508333358280478 -0.16308146896121212
|
||||
2400000990.0 0.5340979764879871 -0.16403106269957954 0.467005629679481 0.13909661207156374 0.467005629679481 0.13909661207156374 0.5465763113977863 -0.16207221457535398
|
||||
3200000980.0 0.5298996399675858 -0.16330461133787472 0.4690069890951671 0.13444036475669813 0.4690069890951671 0.13444036475669813 0.5423192870207375 -0.16106296020211155
|
||||
4000000980.0 0.5257013033947053 -0.16257815996708924 0.47100834853587015 0.12978411738362944 0.47100834853587015 0.12978411738362944 0.538062262590476 -0.16005370581625342
|
||||
4800000980.0 0.521502966821825 -0.16185170859630377 0.47300970797657327 0.12512787001056075 0.47300970797657327 0.12512787001056075 0.5338052381602144 -0.1590444514303953
|
||||
5600000970.0 0.5173046303014237 -0.16112525723459895 0.47501106739225935 0.12047162269569517 0.47501106739225935 0.12047162269569517 0.5295482137831657 -0.15803519705715285
|
||||
6400000970.0 0.5131062937285432 -0.1603988058638135 0.4770124268329624 0.11581537532262648 0.4770124268329624 0.11581537532262648 0.5252911893529042 -0.15702594267129472
|
||||
7200000960.0 0.508907957208142 -0.15967235450210868 0.47901378624864854 0.1111591280077609 0.47901378624864854 0.1111591280077609 0.5210341649758555 -0.1560166882980523
|
||||
8000000960.0 0.5047096206352615 -0.1589459031313232 0.4810151456893516 0.10650288063469221 0.4810151456893516 0.10650288063469221 0.516777140545594 -0.15500743391219415
|
||||
8800000960.0 0.5005112840623811 -0.15821945176053775 0.4830165051300547 0.10184663326162352 0.4830165051300547 0.10184663326162352 0.5125201161153324 -0.15399817952633604
|
||||
9600000950.0 0.4963129475419798 -0.15749300039883293 0.48501786454574075 0.09719038594675794 0.48501786454574075 0.09719038594675794 0.5082630917382837 -0.1529889251530936
|
||||
10400000900.0 0.49211461123149536 -0.15676654907345067 0.4870192238613589 0.09253413886470471 0.4870192238613589 0.09253413886470471 0.5040060675740862 -0.15197967083031386
|
||||
11200000900.0 0.4879162746586149 -0.15604009770266522 0.48902058330206194 0.08787789149163604 0.48902058330206194 0.08787789149163604 0.4997490431438247 -0.15097041644445575
|
||||
12000000900.0 0.4837179380857345 -0.15531364633187975 0.49102194274276506 0.08322164411856735 0.49102194274276506 0.08322164411856735 0.49549201871356313 -0.1499611620585976
|
||||
12800000900.0 0.479519601512854 -0.15458719496109427 0.4930233021834681 0.07856539674549864 0.4930233021834681 0.07856539674549864 0.4912349942833016 -0.1489519076727395
|
||||
13600000900.0 0.47532126493997356 -0.15386074359030882 0.4950246616241712 0.07390914937242997 0.4950246616241712 0.07390914937242997 0.4869779698530401 -0.14794265328688136
|
||||
14400000900.0 0.47112292836709313 -0.15313429221952335 0.4970260210648743 0.06925290199936128 0.4970260210648743 0.06925290199936128 0.48272094542277855 -0.14693339890102325
|
||||
15200000900.0 0.46692459179421264 -0.1524078408487379 0.4990273805055774 0.0645966546262926 0.4990273805055774 0.0645966546262926 0.478463920992517 -0.1459241445151651
|
||||
16000000900.0 0.4627262552213322 -0.15168138947795243 0.5010287399462805 0.059940407253223915 0.5010287399462805 0.059940407253223915 0.47420689656225545 -0.144914890129307
|
||||
16800000900.0 0.45852791864845177 -0.15095493810716698 0.5030300993869835 0.05528415988015524 0.5030300993869835 0.05528415988015524 0.4699498721319939 -0.14390563574344886
|
||||
17600000900.0 0.4543295820755713 -0.1502284867363815 0.5050314588276866 0.05062791250708655 0.5050314588276866 0.05062791250708655 0.4656928477017324 -0.14289638135759075
|
||||
18400000900.0 0.45013124550269085 -0.14950203536559603 0.5070328182683898 0.045971665134017875 0.5070328182683898 0.045971665134017875 0.46143582327147087 -0.1418871269717326
|
||||
19200000900.0 0.4459329089298104 -0.14877558399481058 0.5090341777090928 0.041315417760949186 0.5090341777090928 0.041315417760949186 0.4571787988412094 -0.1408778725858745
|
||||
20000000900.0 0.4417345723569299 -0.1480491326240251 0.5110355371497959 0.036659170387880496 0.5110355371497959 0.036659170387880496 0.45292177441094783 -0.13986861820001636
|
||||
20800000900.0 0.4375362357840495 -0.14732268125323966 0.5130368965904989 0.03200292301481182 0.5130368965904989 0.03200292301481182 0.4486647499806863 -0.13885936381415825
|
||||
21600000900.0 0.433337899211169 -0.1465962298824542 0.515038256031202 0.027346675641743118 0.515038256031202 0.027346675641743118 0.44440772555042474 -0.13785010942830012
|
||||
22400000900.0 0.42913956263828856 -0.1458697785116687 0.5170396154719051 0.02269042826867443 0.5170396154719051 0.02269042826867443 0.4401507011201632 -0.136840855042442
|
||||
23200000900.0 0.4249412260654081 -0.14514332714088327 0.5190409749126081 0.018034180895605767 0.5190409749126081 0.018034180895605767 0.4358936766899017 -0.13583160065658387
|
||||
24000000900.0 0.42074288949252764 -0.1444168757700978 0.5210423343533113 0.013377933522537078 0.5210423343533113 0.013377933522537078 0.43163665225964015 -0.13482234627072576
|
||||
24800000900.0 0.4165445529196472 -0.14369042439931234 0.5230436937940144 0.008721686149468444 0.5230436937940144 0.008721686149468444 0.42737962782937866 -0.13381309188486762
|
||||
25600000900.0 0.4123462163467667 -0.14296397302852687 0.5250450532347174 0.004065438776399727 0.5250450532347174 0.004065438776399727 0.4231226033991171 -0.13280383749900948
|
||||
26400000900.0 0.4081478797738862 -0.1422375216577414 0.5270464126754205 -0.0005908085966689625 0.5270464126754205 -0.0005908085966689625 0.41886557896885557 -0.13179458311315137
|
||||
27200000900.0 0.40394954320100585 -0.14151107028695595 0.5290477721161236 -0.005247055969737624 0.5290477721161236 -0.005247055969737624 0.414608554538594 -0.13078532872729326
|
||||
28000000900.0 0.39975120662812536 -0.14078461891617047 0.5310491315568266 -0.009903303342806341 0.5310491315568266 -0.009903303342806341 0.4103515301083325 -0.12977607434143512
|
||||
28800000900.0 0.3955528700552449 -0.14005816754538503 0.5330504909975298 -0.014559550715875003 0.5330504909975298 -0.014559550715875003 0.406094505678071 -0.128766819955577
|
||||
29600000900.0 0.3913545334823645 -0.13933171617459955 0.5350518504382329 -0.019215798088943692 0.5350518504382329 -0.019215798088943692 0.40183748124780944 -0.12775756556971887
|
||||
30400000800.0 0.3871561974342761 -0.1386052648946205 0.537053209628766 -0.023872044879981458 0.537053209628766 -0.023872044879981458 0.39758045734967595 -0.12674831131001754
|
||||
31200000800.0 0.3829578608613956 -0.13787881352383505 0.539054569069469 -0.02852829225305012 0.539054569069469 -0.02852829225305012 0.3933234329194144 -0.12573905692415943
|
||||
32000000800.0 0.3787595242885151 -0.13715236215304957 0.5410559285101721 -0.033184539626118836 0.5410559285101721 -0.033184539626118836 0.38906640848915286 -0.1247298025383013
|
||||
32800000800.0 0.37456118771563474 -0.13642591078226413 0.5430572879508753 -0.0378407869991875 0.5430572879508753 -0.0378407869991875 0.3848093840588914 -0.12372054815244318
|
||||
33333334200.0 0.3717622963171864 -0.13594160980786954 0.5443915277447906 -0.04094495230258724 0.5443915277447906 -0.04094495230258724 0.3819713674172983 -0.12304771181109989
|
||||
33600000800.0 0.37036285114275425 -0.13569945941147865 0.5450586473915783 -0.04249703437225619 0.5450586473915783 -0.04249703437225619 0.3805523596286299 -0.12271129376658504
|
||||
34400000800.0 0.3661645145698738 -0.1349730080406932 0.5470600068322814 -0.04715328174532485 0.5470600068322814 -0.04715328174532485 0.37629533519836833 -0.12170203938072693
|
||||
35200000800.0 0.3619661779969933 -0.13424655666990773 0.5490613662729845 -0.051809529118393566 0.5490613662729845 -0.051809529118393566 0.3720383107681068 -0.1206927849948688
|
||||
36000000800.0 0.3577678414241129 -0.13352010529912228 0.5510627257136875 -0.05646577649146223 0.5510627257136875 -0.05646577649146223 0.36778128633784524 -0.11968353060901069
|
||||
36800000800.0 0.3535695048512324 -0.1327936539283368 0.5530640851543906 -0.06112202386453092 0.5530640851543906 -0.06112202386453092 0.3635242619075837 -0.11867427622315255
|
||||
37600000800.0 0.34937116827835196 -0.13206720255755133 0.5550654445950938 -0.06577827123759963 0.5550654445950938 -0.06577827123759963 0.35926723747732214 -0.11766502183729442
|
||||
38400000800.0 0.34517283170547153 -0.13134075118676589 0.5570668040357968 -0.0704345186106683 0.5570668040357968 -0.0704345186106683 0.35501021304706065 -0.1166557674514363
|
||||
39200000800.0 0.34097449513259104 -0.1306142998159804 0.5590681634764999 -0.07509076598373698 0.5590681634764999 -0.07509076598373698 0.35075318861679916 -0.11564651306557817
|
||||
40000000800.0 0.3367761585597106 -0.12988784844519496 0.561069522917203 -0.07974701335680565 0.561069522917203 -0.07974701335680565 0.3464961641865376 -0.11463725867972002
|
||||
40800000800.0 0.33257782198683017 -0.12916139707440946 0.563070882357906 -0.08440326072987436 0.563070882357906 -0.08440326072987436 0.34223913975627607 -0.1136280042938619
|
||||
41600000800.0 0.3283794854139497 -0.128434945703624 0.5650722417986092 -0.08905950810294302 0.5650722417986092 -0.08905950810294302 0.3379821153260145 -0.11261874990800377
|
||||
42400000800.0 0.32418114884106924 -0.12770849433283854 0.5670736012393122 -0.09371575547601171 0.5670736012393122 -0.09371575547601171 0.333725090895753 -0.11160949552214565
|
||||
43200000800.0 0.3199828122681888 -0.12698204296205307 0.5690749606800153 -0.0983720028490804 0.5690749606800153 -0.0983720028490804 0.3294680664654915 -0.11060024113628752
|
||||
44000000800.0 0.3157844756953083 -0.12625559159126762 0.5710763201207183 -0.10302825022214904 0.5710763201207183 -0.10302825022214904 0.32521104203523 -0.10959098675042941
|
||||
44800000800.0 0.31158613912242783 -0.12552914022048214 0.5730776795614214 -0.10768449759521778 0.5730776795614214 -0.10768449759521778 0.3209540176049684 -0.10858173236457128
|
||||
45600000800.0 0.30738780254954745 -0.12480268884969667 0.5750790390021245 -0.11234074496828647 0.5750790390021245 -0.11234074496828647 0.3166969931747069 -0.10757247797871315
|
||||
46400000800.0 0.30318946597666696 -0.12407623747891122 0.5770803984428275 -0.1169969923413551 0.5770803984428275 -0.1169969923413551 0.31243996874444535 -0.10656322359285503
|
||||
47200000800.0 0.29899112940378647 -0.12334978610812575 0.5790817578835307 -0.12165323971442385 0.5790817578835307 -0.12165323971442385 0.3081829443141838 -0.10555396920699689
|
||||
48000000800.0 0.29479279283090604 -0.12262333473734029 0.5810831173242338 -0.12630948708749254 0.5810831173242338 -0.12630948708749254 0.30392591988392226 -0.10454471482113878
|
||||
48800000800.0 0.2905944562580256 -0.12189688336655483 0.5830844767649368 -0.13096573446056115 0.5830844767649368 -0.13096573446056115 0.29966889545366077 -0.10353546043528065
|
||||
49600000800.0 0.28639611968514517 -0.12117043199576934 0.5850858362056399 -0.13562198183362983 0.5850858362056399 -0.13562198183362983 0.2954118710233992 -0.1025262060494225
|
||||
50400000700.0 0.2821977836370567 -0.1204439807157903 0.587087195396173 -0.1402782286246676 0.587087195396173 -0.1402782286246676 0.29115484712526574 -0.10151695178972117
|
||||
51200000700.0 0.2779994470641763 -0.11971752934500482 0.5890885548368762 -0.1449344759977363 0.5890885548368762 -0.1449344759977363 0.28689782269500425 -0.10050769740386305
|
||||
52000000700.0 0.27380111049129585 -0.11899107797421937 0.5910899142775792 -0.14959072337080498 0.5910899142775792 -0.14959072337080498 0.2826407982647427 -0.09949844301800494
|
||||
52800000700.0 0.26960277391841536 -0.1182646266034339 0.5930912737182823 -0.15424697074387367 0.5930912737182823 -0.15424697074387367 0.27838377383448115 -0.0984891886321468
|
||||
53600000700.0 0.2654044373455349 -0.11753817523264844 0.5950926331589854 -0.15890321811694236 0.5950926331589854 -0.15890321811694236 0.2741267494042196 -0.09747993424628865
|
||||
54400000700.0 0.2612061007726545 -0.11681172386186295 0.5970939925996884 -0.16355946549001096 0.5970939925996884 -0.16355946549001096 0.2698697249739581 -0.09647067986043052
|
||||
55200000700.0 0.25700776419977406 -0.11608527249107749 0.5990953520403915 -0.16821571286307965 0.5990953520403915 -0.16821571286307965 0.26561270054369657 -0.09546142547457241
|
||||
56000000700.0 0.25280942762689357 -0.11535882112029203 0.6010967114810947 -0.1728719602361484 0.6010967114810947 -0.1728719602361484 0.261355676113435 -0.09445217108871427
|
||||
56800000700.0 0.24861109105401313 -0.11463236974950652 0.6030980709217977 -0.177528207609217 0.6030980709217977 -0.177528207609217 0.25709865168317353 -0.09344291670285612
|
||||
57600000700.0 0.24441275448113264 -0.11390591837872108 0.6050994303625008 -0.1821844549822857 0.6050994303625008 -0.1821844549822857 0.252841627252912 -0.092433662316998
|
||||
58400000700.0 0.24021441790825215 -0.1131794670079356 0.6071007898032039 -0.1868407023553544 0.6071007898032039 -0.1868407023553544 0.24858460282265044 -0.09142440793113984
|
||||
59200000700.0 0.23601608133537183 -0.1124530156371501 0.6091021492439069 -0.19149694972842304 0.6091021492439069 -0.19149694972842304 0.244327578392389 -0.09041515354528172
|
||||
60000000700.0 0.2318177447624914 -0.11172656426636465 0.61110350868461 -0.1961531971014917 0.61110350868461 -0.1961531971014917 0.2400705539621275 -0.0894058991594236
|
||||
60800000700.0 0.22761940818961096 -0.11100011289557918 0.6131048681253132 -0.2008094444745604 0.6131048681253132 -0.2008094444745604 0.23581352953186596 -0.08839664477356547
|
||||
61600000700.0 0.22342107161673058 -0.11027366152479372 0.6151062275660163 -0.20546569184762906 0.6151062275660163 -0.20546569184762906 0.23155650510160453 -0.08738739038770735
|
||||
62400000700.0 0.21922273504385015 -0.10954721015400828 0.6171075870067194 -0.21012193922069775 0.6171075870067194 -0.21012193922069775 0.22729948067134298 -0.08637813600184925
|
||||
63200000700.0 0.2150243984709697 -0.10882075878322288 0.6191089464474225 -0.2147781865937664 0.6191089464474225 -0.2147781865937664 0.2230424562410815 -0.08536888161599118
|
||||
64000000700.0 0.21082606189808928 -0.10809430741243745 0.6211103058881257 -0.21943443396683512 0.6211103058881257 -0.21943443396683512 0.21878543181082 -0.0843596272301331
|
||||
64800000700.0 0.2066277253252088 -0.10736785604165203 0.6231116653288288 -0.2240906813399039 0.6231116653288288 -0.2240906813399039 0.2145284073805584 -0.08335037284427502
|
||||
65600000700.0 0.2024293887523283 -0.10664140467086661 0.6251130247695318 -0.22874692871297256 0.6251130247695318 -0.22874692871297256 0.2102713829502969 -0.08234111845841692
|
||||
66400000700.0 0.19823105217944786 -0.10591495330008116 0.6271143842102349 -0.23340317608604128 0.6271143842102349 -0.23340317608604128 0.20601435852003536 -0.08133186407255882
|
||||
66666667300.0 0.19683160700501573 -0.10567280290369029 0.6277815038570227 -0.23495525815571028 0.6277815038570227 -0.23495525815571028 0.20459535073136687 -0.08099544602804397
|
||||
67200000700.0 0.19403271560656726 -0.10518850192929571 0.629115743650938 -0.23805942345911005 0.629115743650938 -0.23805942345911005 0.2017573340897737 -0.08032260968670073
|
||||
68000000700.0 0.18983437903368683 -0.10446205055851027 0.631117103091641 -0.24271567083217868 0.631117103091641 -0.24271567083217868 0.19750030965951215 -0.0793133553008426
|
||||
68800000700.0 0.1856360424608064 -0.10373559918772479 0.633118462532344 -0.2473719182052474 0.633118462532344 -0.2473719182052474 0.19324328522925066 -0.07830410091498448
|
||||
69600000700.0 0.18143770588792596 -0.10300914781693934 0.6351198219730472 -0.2520281655783161 0.6351198219730472 -0.2520281655783161 0.18898626079898911 -0.07729484652912635
|
||||
70400000600.0 0.17723936983983757 -0.10228269653696029 0.6371211811635804 -0.25668441236935385 0.6371211811635804 -0.25668441236935385 0.18472923690085563 -0.07628559226942502
|
||||
71200000600.0 0.17304103326695708 -0.10155624516617483 0.6391225406042834 -0.26134065974242254 0.6391225406042834 -0.26134065974242254 0.18047221247059414 -0.0752763378835669
|
||||
72000000600.0 0.16884269669407664 -0.10082979379538937 0.6411239000449864 -0.2659969071154912 0.6411239000449864 -0.2659969071154912 0.1762151880403326 -0.07426708349770879
|
||||
72800000600.0 0.16464436012119615 -0.1001033424246039 0.6431252594856895 -0.27065315448856 0.6431252594856895 -0.27065315448856 0.17195816361007105 -0.07325782911185065
|
||||
73600000600.0 0.16044602354831572 -0.09937689105381842 0.6451266189263927 -0.27530940186162867 0.6451266189263927 -0.27530940186162867 0.1677011391798095 -0.0722485747259925
|
||||
74400000600.0 0.15624768697543517 -0.09865043968303296 0.6471279783670957 -0.27996564923469724 0.6471279783670957 -0.27996564923469724 0.163444114749548 -0.07123932034013437
|
||||
75200000600.0 0.15204935040255474 -0.0979239883122475 0.6491293378077987 -0.28462189660776593 0.6491293378077987 -0.28462189660776593 0.15918709031928635 -0.07023006595427626
|
||||
76000000600.0 0.14785101382967425 -0.09719753694146202 0.6511306972485018 -0.28927814398083473 0.6511306972485018 -0.28927814398083473 0.1549300658890248 -0.06922081156841813
|
||||
76800000600.0 0.14365267725679381 -0.09647108557067656 0.6531320566892049 -0.2939343913539033 0.6531320566892049 -0.2939343913539033 0.15067304145876326 -0.06821155718256
|
||||
77600000600.0 0.13945434068391338 -0.0957446341998911 0.655133416129908 -0.298590638726972 0.655133416129908 -0.298590638726972 0.14641601702850177 -0.06720230279670188
|
||||
78400000600.0 0.1352560041110329 -0.09501818282910562 0.6571347755706112 -0.3032468861000407 0.6571347755706112 -0.3032468861000407 0.14215899259824022 -0.06619304841084375
|
||||
79200000600.0 0.1310576675381524 -0.09429173145832016 0.6591361350113142 -0.3079031334731094 0.6591361350113142 -0.3079031334731094 0.13790196816797867 -0.06518379402498563
|
||||
80000000600.0 0.12685933096527197 -0.0935652800875347 0.6611374944520172 -0.31255938084617807 0.6611374944520172 -0.31255938084617807 0.13364494373771718 -0.0641745396391275
|
||||
80800000600.0 0.12266099439239153 -0.09283882871674924 0.6631388538927203 -0.31721562821924676 0.6631388538927203 -0.31721562821924676 0.12938791930745563 -0.06316528525326938
|
||||
81600000600.0 0.11846265781951104 -0.09211237734596378 0.6651402133334234 -0.32187187559231545 0.6651402133334234 -0.32187187559231545 0.1251308948771941 -0.062156030867411255
|
||||
82400000600.0 0.1142643212466306 -0.09138592597517832 0.6671415727741266 -0.32652812296538414 0.6671415727741266 -0.32652812296538414 0.12087387044693254 -0.06114677648155313
|
||||
83200000600.0 0.11006598467375017 -0.09065947460439283 0.6691429322148296 -0.3311843703384528 0.6691429322148296 -0.3311843703384528 0.11661684601667105 -0.060137522095695006
|
||||
84000000600.0 0.10586764810086974 -0.08993302323360737 0.6711442916555327 -0.3358406177115215 0.6711442916555327 -0.3358406177115215 0.1123598215864095 -0.059128267709836854
|
||||
84800000600.0 0.10166931152798925 -0.0892065718628219 0.6731456510962357 -0.3404968650845902 0.6731456510962357 -0.3404968650845902 0.10810279715614796 -0.05811901332397873
|
||||
85600000600.0 0.09747097495510881 -0.08848012049203643 0.6751470105369388 -0.3451531124576589 0.6751470105369388 -0.3451531124576589 0.10384577272588646 -0.057109758938120606
|
||||
86400000600.0 0.09327263838222832 -0.08775366912125097 0.6771483699776419 -0.3498093598307276 0.6771483699776419 -0.3498093598307276 0.09958874829562492 -0.05610050455226248
|
||||
87200000600.0 0.08907430180934783 -0.0870272177504655 0.6791497294183451 -0.3544656072037963 0.6791497294183451 -0.3544656072037963 0.09533172386536337 -0.05509125016640436
|
||||
88000000600.0 0.08487596523646745 -0.08630076637968005 0.6811510888590481 -0.35912185457686496 0.6811510888590481 -0.35912185457686496 0.09107469943510188 -0.054081995780546246
|
||||
88800000600.0 0.08067762866358691 -0.08557431500889458 0.6831524482997512 -0.3637781019499336 0.6831524482997512 -0.3637781019499336 0.08681767500484028 -0.053072741394688094
|
||||
89600000600.0 0.07647929209070647 -0.08484786363810912 0.6851538077404542 -0.3684343493230023 0.6851538077404542 -0.3684343493230023 0.08256065057457873 -0.05206348700882997
|
||||
90400000500.0 0.0722809560426182 -0.08412141235813009 0.6871551669309873 -0.37309059611404 0.6871551669309873 -0.37309059611404 0.07830362667644536 -0.05105423274912867
|
||||
91200000500.0 0.06808261946973765 -0.0833949609873446 0.6891565263716904 -0.3777468434871088 0.6891565263716904 -0.3777468434871088 0.07404660224618376 -0.050044978363270515
|
||||
92000000500.0 0.06388428289685716 -0.08266850961655914 0.6911578858123935 -0.3824030908601775 0.6911578858123935 -0.3824030908601775 0.06978957781592221 -0.049035723977412404
|
||||
92800000500.0 0.059685946323976724 -0.08194205824577368 0.6931592452530966 -0.38705933823324606 0.6931592452530966 -0.38705933823324606 0.06553255338566072 -0.04802646959155428
|
||||
93600000500.0 0.05548760975109629 -0.08121560687498822 0.6951606046937997 -0.39171558560631475 0.6951606046937997 -0.39171558560631475 0.06127552895539917 -0.047017215205696156
|
||||
94400000500.0 0.051289273178215855 -0.08048915550420276 0.6971619641345027 -0.39637183297938344 0.6971619641345027 -0.39637183297938344 0.05701850452513768 -0.04600796081983803
|
||||
95200000500.0 0.04709093660533542 -0.0797627041334173 0.6991633235752058 -0.40102808035245213 0.6991633235752058 -0.40102808035245213 0.052761480094876134 -0.04499870643397992
|
||||
96000000500.0 0.042892600032454986 -0.07903625276263183 0.7011646830159088 -0.4056843277255208 0.7011646830159088 -0.4056843277255208 0.04850445566461459 -0.0439894520481218
|
||||
96800000500.0 0.038694263459574385 -0.07830980139184636 0.703166042456612 -0.4103405750985895 0.703166042456612 -0.4103405750985895 0.04424743123435304 -0.042980197662263644
|
||||
97600000500.0 0.034495926886694006 -0.0775833500210609 0.7051674018973151 -0.4149968224716582 0.7051674018973151 -0.4149968224716582 0.039990406804091494 -0.04197094327640552
|
||||
98400000500.0 0.030297590313813516 -0.07685689865027544 0.7071687613380182 -0.4196530698447269 0.7071687613380182 -0.4196530698447269 0.03573338237382995 -0.04096168889054741
|
||||
99200000500.0 0.026099253740933137 -0.07613044727948998 0.7091701207787212 -0.4243093172177956 0.7091701207787212 -0.4243093172177956 0.03147635794356851 -0.03995243450468927
|
||||
100000000000.0 0.02190091979201303 -0.07540399636273662 0.7111714789685747 -0.4289655616807096 0.7111714789685747 -0.4289655616807096 0.02721933617394723 -0.03894318074961514
|
||||
100800000000.0 0.01770258321913254 -0.07467754499195116 0.7131728384092777 -0.4336218090537783 0.7131728384092777 -0.4336218090537783 0.02296231174368568 -0.03793392636375703
|
||||
101600000000.0 0.01350424664625216 -0.0739510936211657 0.7151741978499808 -0.438278056426847 0.7151741978499808 -0.438278056426847 0.018705287313424135 -0.03692467197789892
|
||||
102400000000.0 0.00930591007337167 -0.07322464225038024 0.7171755572906839 -0.44293430379991566 0.7171755572906839 -0.44293430379991566 0.0144482628831627 -0.03591541759204078
|
||||
103200000000.0 0.00510757350049118 -0.07249819087959476 0.7191769167313871 -0.44759055117298446 0.7191769167313871 -0.44759055117298446 0.010191238452901041 -0.034906163206182644
|
||||
104000000000.0 0.0009092369276106904 -0.0717717395088093 0.7211782761720901 -0.45224679854605304 0.7211782761720901 -0.45224679854605304 0.005934214022639495 -0.033896908820324534
|
||||
104800000000.0 -0.0032890996452696886 -0.07104528813802384 0.7231796356127932 -0.45690304591912173 0.7231796356127932 -0.45690304591912173 0.0016771895923780589 -0.032887654434466396
|
||||
105600000000.0 -0.007487436218150179 -0.07031883676723838 0.7251809950534962 -0.4615592932921904 0.7251809950534962 -0.4615592932921904 -0.002579834837883488 -0.031878400048608285
|
||||
106400000000.0 -0.011685772791030558 -0.06959238539645292 0.7271823544941993 -0.4662155406652591 0.7271823544941993 -0.4662155406652591 -0.006836859268145035 -0.030869145662750147
|
||||
107200000000.0 -0.015884109363911048 -0.06886593402566746 0.7291837139349024 -0.4708717880383278 0.7291837139349024 -0.4708717880383278 -0.011093883698406581 -0.029859891276892037
|
||||
108000000000.0 -0.020082445936791538 -0.068139482654882 0.7311850733756055 -0.4755280354113965 0.7311850733756055 -0.4755280354113965 -0.015350908128668017 -0.028850636891033926
|
||||
108800000000.0 -0.024280782509672028 -0.06741303128409652 0.7331864328163086 -0.4801842827844652 0.7331864328163086 -0.4801842827844652 -0.019607932558929675 -0.02784138250517576
|
||||
109600000000.0 -0.028479119082552518 -0.06668657991331106 0.7351877922570116 -0.48484053015753387 0.7351877922570116 -0.48484053015753387 -0.02386495698919122 -0.02683212811931765
|
||||
110400000000.0 -0.0326774556554329 -0.0659601285425256 0.7371891516977147 -0.48949677753060256 0.7371891516977147 -0.48949677753060256 -0.028121981419452657 -0.02582287373345954
|
||||
111200000000.0 -0.03687579222831339 -0.06523367717174014 0.7391905111384178 -0.49415302490367125 0.7391905111384178 -0.49415302490367125 -0.032379005849714204 -0.0248136193476014
|
||||
112000000000.0 -0.041074128801193766 -0.06450722580095468 0.741191870579121 -0.49880927227673993 0.741191870579121 -0.49880927227673993 -0.03663603027997575 -0.02380436496174329
|
||||
112800000000.0 -0.045272465374074256 -0.0637807744301692 0.743193230019824 -0.5034655196498086 0.743193230019824 -0.5034655196498086 -0.0408930547102373 -0.022795110575885152
|
||||
113600000000.0 -0.049470801946954635 -0.06305432305938374 0.745194589460527 -0.5081217670228773 0.745194589460527 -0.5081217670228773 -0.04515007914049873 -0.021785856190027042
|
||||
114400000000.0 -0.053669138519835125 -0.06232787168859828 0.7471959489012301 -0.512778014395946 0.7471959489012301 -0.512778014395946 -0.04940710357076028 -0.02077660180416893
|
||||
115200000000.0 -0.057867475092715726 -0.06160142031781281 0.7491973083419332 -0.5174342617690146 0.7491973083419332 -0.5174342617690146 -0.05366412800102194 -0.019767347418310766
|
||||
116000000000.0 -0.062065811665596105 -0.06087496894702735 0.7511986677826363 -0.5220905091420833 0.7511986677826363 -0.5220905091420833 -0.057921152431283485 -0.018758093032452655
|
||||
116800000000.0 -0.0662641482384766 -0.060148517576241886 0.7532000272233395 -0.526746756515152 0.7532000272233395 -0.526746756515152 -0.06217817686154492 -0.017748838646594545
|
||||
117600000000.0 -0.07046248481135697 -0.059422066205456425 0.7552013866640425 -0.5314030038882207 0.7552013866640425 -0.5314030038882207 -0.06643520129180647 -0.016739584260736406
|
||||
118400000000.0 -0.07466082138423746 -0.058695614834670964 0.7572027461047455 -0.5360592512612894 0.7572027461047455 -0.5360592512612894 -0.07069222572206801 -0.015730329874878296
|
||||
119200000000.0 -0.07885915795711784 -0.057969163463885504 0.7592041055454486 -0.5407154986343581 0.7592041055454486 -0.5407154986343581 -0.07494925015232945 -0.014721075489020158
|
||||
120000000000.0 -0.08305749452999833 -0.05724271209310004 0.7612054649861517 -0.5453717460074268 0.7612054649861517 -0.5453717460074268 -0.079206274582591 -0.013711821103162047
|
||||
120800000000.0 -0.08725583110287882 -0.05651626072231457 0.7632068244268548 -0.5500279933804955 0.7632068244268548 -0.5500279933804955 -0.08346329901285265 -0.01270256671730391
|
||||
121600000000.0 -0.09145416767575931 -0.05578980935152911 0.765208183867558 -0.5546842407535642 0.765208183867558 -0.5546842407535642 -0.0877203234431142 -0.011693312331445771
|
||||
122400000000.0 -0.0956525042486398 -0.055063357980743646 0.767209543308261 -0.5593404881266328 0.767209543308261 -0.5593404881266328 -0.09197734787337564 -0.01068405794558766
|
||||
123200000000.0 -0.09985084082152018 -0.054336906609958185 0.769210902748964 -0.5639967354997015 0.769210902748964 -0.5639967354997015 -0.09623437230363718 -0.00967480355972955
|
||||
124000000000.0 -0.10404917739440067 -0.053610455239172725 0.7712122621896671 -0.5686529828727702 0.7712122621896671 -0.5686529828727702 -0.10049139673389873 -0.008665549173871412
|
||||
124800000000.0 -0.10824751396728105 -0.052884003868387264 0.7732136216303702 -0.5733092302458389 0.7732136216303702 -0.5733092302458389 -0.10474842116416028 -0.007656294788013301
|
||||
125600000000.0 -0.11244585054016154 -0.0521575524976018 0.7752149810710733 -0.5779654776189076 0.7752149810710733 -0.5779654776189076 -0.10900544559442171 -0.006647040402155163
|
||||
126400000000.0 -0.11664418711304203 -0.05143110112681633 0.7772163405117765 -0.5826217249919763 0.7772163405117765 -0.5826217249919763 -0.11326247002468337 -0.005637786016297025
|
||||
127200000000.0 -0.12084252368592252 -0.05070464975603087 0.7792176999524795 -0.587277972365045 0.7792176999524795 -0.587277972365045 -0.11751949445494492 -0.004628531630438915
|
||||
128000000000.0 -0.1250408602588029 -0.04997819838524539 0.7812190593931825 -0.5919342197381137 0.7812190593931825 -0.5919342197381137 -0.12177651888520635 -0.0036192772445807764
|
||||
128800000000.0 -0.1292391968316834 -0.049251747014459904 0.7832204188338856 -0.5965904671111824 0.7832204188338856 -0.5965904671111824 -0.1260335433154679 -0.002610022858722666
|
||||
129600000000.0 -0.13343753340456388 -0.04852529564367444 0.7852217782745887 -0.601246714484251 0.7852217782745887 -0.601246714484251 -0.13029056774572945 -0.0016007684728645277
|
||||
130400000000.0 -0.13763586997744426 -0.04779884427288898 0.7872231377152918 -0.6059029618573195 0.7872231377152918 -0.6059029618573195 -0.134547592175991 -0.0005915140870063895
|
||||
131200000000.0 -0.14183420655032475 -0.04707239290210352 0.7892244971559949 -0.6105592092303882 0.7892244971559949 -0.6105592092303882 -0.13880461660625243 0.0004177402988517209
|
||||
132000000000.0 -0.14603254312320513 -0.04634594153131806 0.7912258565966979 -0.6152154566034569 0.7912258565966979 -0.6152154566034569 -0.14306164103651398 0.0014269946847098591
|
||||
132800000000.0 -0.15023087969608573 -0.045619490160532586 0.793227216037401 -0.6198717039765258 0.793227216037401 -0.6198717039765258 -0.14731866546677563 0.0024362490705679973
|
||||
133333334000.0 -0.15302977424328645 -0.04513518864129948 0.794561457332336 -0.6229758727721109 0.794561457332336 -0.6229758727721109 -0.1501566853011369 0.0031090861688520544
|
||||
133600000000.0 -0.1544292162689661 -0.044893038789747125 0.7952285754781041 -0.6245279513495945 0.7952285754781041 -0.6245279513495945 -0.15157568989703707 0.0034455034564261078
|
||||
134400000000.0 -0.1586275528418466 -0.044166587418961664 0.7972299349188072 -0.6291841987226632 0.7972299349188072 -0.6291841987226632 -0.15583271432729862 0.004454757842284246
|
||||
135200000000.0 -0.16282588941472698 -0.0434401360481762 0.7992312943595102 -0.6338404460957316 0.7992312943595102 -0.6338404460957316 -0.16008973875756016 0.005464012228142356
|
||||
136000000000.0 -0.16702422598760747 -0.04271368467739074 0.8012326538002134 -0.6384966934688003 0.8012326538002134 -0.6384966934688003 -0.1643467631878217 0.006473266614000467
|
||||
136800000000.0 -0.17122256256048796 -0.04198723330660528 0.8032340132409164 -0.643152940841869 0.8032340132409164 -0.643152940841869 -0.16860378761808315 0.007482520999858605
|
||||
137600000000.0 -0.17542089913336834 -0.04126078193581982 0.8052353726816195 -0.6478091882149377 0.8052353726816195 -0.6478091882149377 -0.1728608120483447 0.008491775385716716
|
||||
138400000000.0 -0.17961923570624894 -0.04053433056503433 0.8072367321223226 -0.6524654355880066 0.8072367321223226 -0.6524654355880066 -0.17711783647860635 0.009501029771574854
|
||||
139200000000.0 -0.18381757227912932 -0.039807879194248885 0.8092380915630257 -0.6571216829610751 0.8092380915630257 -0.6571216829610751 -0.18137486090886779 0.010510284157432992
|
||||
140000000000.0 -0.1880159088520098 -0.03908142782346341 0.8112394510037287 -0.6617779303341438 0.8112394510037287 -0.6617779303341438 -0.18563188533912933 0.011519538543291102
|
||||
140800000000.0 -0.19221424542489018 -0.038354976452677964 0.8132408104444319 -0.6664341777072125 0.8132408104444319 -0.6664341777072125 -0.18988890976939088 0.01252879292914924
|
||||
141600000000.0 -0.19641258199777067 -0.03762852508189249 0.8152421698851349 -0.6710904250802812 0.8152421698851349 -0.6710904250802812 -0.19414593419965243 0.013538047315007351
|
||||
142400000000.0 -0.20061091857065105 -0.03690207371110704 0.817243529325838 -0.6757466724533499 0.817243529325838 -0.6757466724533499 -0.19840295862991386 0.014547301700865461
|
||||
143200000000.0 -0.20480925514353154 -0.03617562234032157 0.8192448887665411 -0.6804029198264185 0.8192448887665411 -0.6804029198264185 -0.2026599830601754 0.0155565560867236
|
||||
144000000000.0 -0.20900759171641203 -0.03544917096953609 0.8212462482072442 -0.6850591671994872 0.8212462482072442 -0.6850591671994872 -0.20691700749043707 0.016565810472581738
|
||||
144800000000.0 -0.21320592828929252 -0.034722719598750645 0.8232476076479472 -0.6897154145725559 0.8232476076479472 -0.6897154145725559 -0.2111740319206985 0.01757506485843985
|
||||
145600000000.0 -0.217404264862173 -0.03399626822796517 0.8252489670886504 -0.6943716619456246 0.8252489670886504 -0.6943716619456246 -0.21543105635096005 0.018584319244297987
|
||||
146400000000.0 -0.2216026014350534 -0.033269816857179724 0.8272503265293534 -0.6990279093186933 0.8272503265293534 -0.6990279093186933 -0.2196880807812216 0.019593573630156097
|
||||
147200000000.0 -0.22580093800793388 -0.03254336548639425 0.8292516859700565 -0.703684156691762 0.8292516859700565 -0.703684156691762 -0.22394510521148314 0.020602828016014235
|
||||
148000000000.0 -0.22999927458081426 -0.0318169141156088 0.8312530454107596 -0.7083404040648307 0.8312530454107596 -0.7083404040648307 -0.22820212964174458 0.021612082401872346
|
||||
148800000000.0 -0.23419761115369475 -0.031090462744823327 0.8332544048514626 -0.7129966514378994 0.8332544048514626 -0.7129966514378994 -0.23245915407200612 0.022621336787730456
|
||||
149600000000.0 -0.23839594772657513 -0.03036401137403788 0.8352557642921656 -0.717652898810968 0.8352557642921656 -0.717652898810968 -0.23671617850226767 0.023630591173588594
|
||||
150400000000.0 -0.24259428429945573 -0.029637560003252406 0.8372571237328688 -0.7223091461840367 0.8372571237328688 -0.7223091461840367 -0.24097320293252933 0.024639845559446732
|
||||
151200000000.0 -0.2467926208723361 -0.02891110863246693 0.8392584831735719 -0.7269653935571054 0.8392584831735719 -0.7269653935571054 -0.24523022736279076 0.025649099945304843
|
||||
152000000000.0 -0.2509909574452166 -0.028184657261681484 0.841259842614275 -0.7316216409301741 0.841259842614275 -0.7316216409301741 -0.2494872517930523 0.02665835433116298
|
||||
152800000000.0 -0.2551892940180971 -0.02745820589089601 0.8432612020549781 -0.7362778883032428 0.8432612020549781 -0.7362778883032428 -0.25374427622331386 0.02766760871702109
|
||||
153600000000.0 -0.25938763059097747 -0.026731754520110562 0.8452625614956811 -0.7409341356763115 0.8452625614956811 -0.7409341356763115 -0.2580013006535753 0.02867686310287923
|
||||
154400000000.0 -0.26358596716385796 -0.026005303149325087 0.8472639209363841 -0.7455903830493802 0.8472639209363841 -0.7455903830493802 -0.26225832508383684 0.02968611748873734
|
||||
155200000000.0 -0.26778430373673834 -0.02527885177853964 0.8492652803770873 -0.7502466304224489 0.8492652803770873 -0.7502466304224489 -0.2665153495140984 0.03069537187459545
|
||||
156000000000.0 -0.27198264030961894 -0.024552400407754138 0.8512666398177904 -0.7549028777955176 0.8512666398177904 -0.7549028777955176 -0.27077237394436005 0.03170462626045362
|
||||
156800000000.0 -0.2761809768824993 -0.02382594903696869 0.8532679992584935 -0.7595591251685863 0.8532679992584935 -0.7595591251685863 -0.2750293983746215 0.03271388064631173
|
||||
157600000000.0 -0.2803793134553798 -0.023099497666183216 0.8552693586991966 -0.764215372541655 0.8552693586991966 -0.764215372541655 -0.279286422804883 0.03372313503216984
|
||||
158400000000.0 -0.2845776500282602 -0.02237304629539777 0.8572707181398996 -0.7688716199147236 0.8572707181398996 -0.7688716199147236 -0.2835434472351446 0.034732389418027976
|
||||
159200000000.0 -0.2887759866011407 -0.021646594924612295 0.8592720775806026 -0.7735278672877923 0.8592720775806026 -0.7735278672877923 -0.287800471665406 0.035741643803886086
|
||||
160000000000.0 -0.29297432317402117 -0.020920143553826848 0.8612734370213058 -0.778184114660861 0.8612734370213058 -0.778184114660861 -0.29205749609566756 0.036750898189744224
|
||||
160800000000.0 -0.29717265974690155 -0.020193692183041373 0.8632747964620089 -0.7828403620339297 0.8632747964620089 -0.7828403620339297 -0.2963145205259291 0.037760152575602335
|
||||
161600000000.0 -0.30137099631978215 -0.019467240812255898 0.865276155902712 -0.7874966094069984 0.865276155902712 -0.7874966094069984 -0.30057154495619076 0.03876940696146047
|
||||
162400000000.0 -0.3055693328926625 -0.01874078944147045 0.8672775153434151 -0.7921528567800671 0.8672775153434151 -0.7921528567800671 -0.3048285693864522 0.03977866134731861
|
||||
163200000000.0 -0.309767669465543 -0.018014338070684977 0.8692788747841181 -0.7968091041531358 0.8692788747841181 -0.7968091041531358 -0.30908559381671374 0.04078791573317672
|
||||
164000000000.0 -0.3139660060384234 -0.01728788669989953 0.8712802342248211 -0.8014653515262045 0.8712802342248211 -0.8014653515262045 -0.3133426182469753 0.04179717011903483
|
||||
164800000000.0 -0.3181643426113039 -0.016561435329114055 0.8732815936655243 -0.8061215988992732 0.8732815936655243 -0.8061215988992732 -0.31759964267723684 0.04280642450489297
|
||||
165600000000.0 -0.32236267918418426 -0.015834983958328608 0.8752829531062274 -0.8107778462723418 0.8752829531062274 -0.8107778462723418 -0.3218566671074983 0.04381567889075108
|
||||
166400000000.0 -0.32656101575706475 -0.015108532587543133 0.8772843125469305 -0.8154340936454103 0.8772843125469305 -0.8154340936454103 -0.3261136915377598 0.04482493327660922
|
||||
167200000000.0 -0.33075935232994524 -0.014382081216757686 0.8792856719876335 -0.820090341018479 0.8792856719876335 -0.820090341018479 -0.33037071596802137 0.04583418766246733
|
||||
168000000000.0 -0.33495768890282573 -0.013655629845972211 0.8812870314283366 -0.8247465883915479 0.8812870314283366 -0.8247465883915479 -0.3346277403982829 0.04684344204832547
|
||||
168800000000.0 -0.3391560254757062 -0.012929178475186737 0.8832883908690397 -0.8294028357646166 0.8832883908690397 -0.8294028357646166 -0.33888476482854446 0.047852696434183606
|
||||
169600000000.0 -0.3433543620485866 -0.01220272710440129 0.8852897503097428 -0.8340590831376853 0.8852897503097428 -0.8340590831376853 -0.343141789258806 0.048861950820041716
|
||||
170400000000.0 -0.3475526986214671 -0.011476275733615815 0.8872911097504459 -0.8387153305107538 0.8872911097504459 -0.8387153305107538 -0.34739881368906755 0.04987120520589983
|
||||
171200000000.0 -0.35175103519434747 -0.010749824362830368 0.889292469191149 -0.8433715778838224 0.889292469191149 -0.8433715778838224 -0.351655838119329 0.050880459591757965
|
||||
172000000000.0 -0.35594937176722796 -0.010023372992044893 0.891293828631852 -0.8480278252568911 0.891293828631852 -0.8480278252568911 -0.35591286254959054 0.051889713977616075
|
||||
172800000000.0 -0.36014770834010834 -0.009296921621259446 0.893295188072555 -0.8526840726299598 0.893295188072555 -0.8526840726299598 -0.3601698869798521 0.052898968363474214
|
||||
173600000000.0 -0.36434604491298894 -0.008570470250473944 0.8952965475132582 -0.8573403200030285 0.8952965475132582 -0.8573403200030285 -0.36442691141011363 0.05390822274933235
|
||||
174400000000.0 -0.3685443814858693 -0.007844018879688497 0.8972979069539613 -0.8619965673760972 0.8972979069539613 -0.8619965673760972 -0.3686839358403752 0.05491747713519046
|
||||
175200000000.0 -0.3727427180587498 -0.007117567508903022 0.8992992663946644 -0.8666528147491659 0.8992992663946644 -0.8666528147491659 -0.3729409602706367 0.0559267315210486
|
||||
176000000000.0 -0.3769410546316303 -0.006391116138117575 0.9013006258353674 -0.8713090621222346 0.9013006258353674 -0.8713090621222346 -0.37719798470089827 0.05693598590690671
|
||||
176800000000.0 -0.3811393912045107 -0.0056646647673321004 0.9033019852760705 -0.8759653094953033 0.9033019852760705 -0.8759653094953033 -0.3814550091311597 0.05794524029276482
|
||||
177600000000.0 -0.38533772777739117 -0.0049382133965466535 0.9053033447167735 -0.880621556868372 0.9053033447167735 -0.880621556868372 -0.38571203356142125 0.05895449467862296
|
||||
178400000000.0 -0.38953606435027155 -0.004211762025761179 0.9073047041574767 -0.8852778042414406 0.9073047041574767 -0.8852778042414406 -0.3899690579916828 0.05996374906448107
|
||||
179200000000.0 -0.39373440092315204 -0.0034853106549757318 0.9093060635981798 -0.8899340516145093 0.9093060635981798 -0.8899340516145093 -0.39422608242194435 0.06097300345033921
|
||||
180000000000.0 -0.3979327374960324 -0.002758859284190257 0.9113074230388828 -0.894590298987578 0.9113074230388828 -0.894590298987578 -0.3984831068522058 0.06198225783619732
|
||||
180800000000.0 -0.4021310740689129 -0.00203240791340481 0.9133087824795859 -0.8992465463606467 0.9133087824795859 -0.8992465463606467 -0.40274013128246733 0.06299151222205543
|
||||
181600000000.0 -0.4063294106417933 -0.0013059565426193354 0.9153101419202889 -0.9039027937337152 0.9153101419202889 -0.9039027937337152 -0.4069971557127289 0.06400076660791357
|
||||
182400000000.0 -0.410527747214674 -0.0005795051718338606 0.9173115013609922 -0.9085590411067841 0.9173115013609922 -0.9085590411067841 -0.41125418014299053 0.06501002099377173
|
||||
183200000000.0 -0.4147260837875544 0.0001469461989516141 0.9193128608016952 -0.9132152884798528 0.9193128608016952 -0.9132152884798528 -0.4155112045732521 0.06601927537962984
|
||||
184000000000.0 -0.41892442036043487 0.0008733975697370611 0.9213142202423983 -0.9178715358529215 0.9213142202423983 -0.9178715358529215 -0.4197682290035136 0.06702852976548798
|
||||
184800000000.0 -0.42312275693331536 0.0015998489405225358 0.9233155796831014 -0.9225277832259902 0.9233155796831014 -0.9225277832259902 -0.4240252534337752 0.06803778415134609
|
||||
185600000000.0 -0.42732109350619574 0.0023263003113079828 0.9253169391238044 -0.9271840305990589 0.9253169391238044 -0.9271840305990589 -0.4282822778640366 0.0690470385372042
|
||||
186400000000.0 -0.4315194300790762 0.0030527516820934575 0.9273182985645074 -0.9318402779721275 0.9273182985645074 -0.9318402779721275 -0.43253930229429816 0.07005629292306234
|
||||
187200000000.0 -0.4357177666519566 0.0037792030528789045 0.9293196580052105 -0.9364965253451962 0.9293196580052105 -0.9364965253451962 -0.4367963267245597 0.07106554730892045
|
||||
188000000000.0 -0.4399161032248371 0.004505654423664379 0.9313210174459137 -0.9411527727182649 0.9313210174459137 -0.9411527727182649 -0.44105335115482114 0.07207480169477859
|
||||
188800000000.0 -0.4441144397977175 0.005232105794449826 0.9333223768866168 -0.9458090200913336 0.9333223768866168 -0.9458090200913336 -0.4453103755850827 0.0730840560806367
|
||||
189600000000.0 -0.44831277637059797 0.005958557165235301 0.9353237363273198 -0.9504652674644023 0.9353237363273198 -0.9504652674644023 -0.44956740001534423 0.07409331046649481
|
||||
190400000000.0 -0.45251111294347846 0.006685008536020748 0.9373250957680228 -0.9551215148374708 0.9373250957680228 -0.9551215148374708 -0.4538244244456058 0.07510256485235295
|
||||
191200000000.0 -0.45670944951635883 0.007411459906806223 0.9393264552087259 -0.9597777622105395 0.9393264552087259 -0.9597777622105395 -0.4580814488758673 0.07611181923821106
|
||||
192000000000.0 -0.4609077860892392 0.00813791127759167 0.941327814649429 -0.9644340095836081 0.941327814649429 -0.9644340095836081 -0.46233847330612887 0.0771210736240692
|
||||
192800000000.0 -0.4651061226621198 0.008864362648377144 0.9433291740901322 -0.9690902569566768 0.9433291740901322 -0.9690902569566768 -0.4665954977363902 0.07813032800992731
|
||||
193600000000.0 -0.4693044592350002 0.009590814019162591 0.9453305335308352 -0.9737465043297455 0.9453305335308352 -0.9737465043297455 -0.47085252216665174 0.07913958239578542
|
||||
194400000000.0 -0.4735027958078808 0.010317265389948094 0.9473318929715384 -0.9784027517028144 0.9473318929715384 -0.9784027517028144 -0.4751095465969135 0.08014883678164358
|
||||
195200000000.0 -0.4777011323807612 0.011043716760733568 0.9493332524122414 -0.9830589990758831 0.9493332524122414 -0.9830589990758831 -0.47936657102717506 0.08115809116750172
|
||||
196000000000.0 -0.4818994689536418 0.011770168131519015 0.9513346118529444 -0.9877152464489518 0.9513346118529444 -0.9877152464489518 -0.4836235954574366 0.08216734555335983
|
||||
196800000000.0 -0.48609780552652215 0.01249661950230449 0.9533359712936476 -0.9923714938220205 0.9533359712936476 -0.9923714938220205 -0.48788061988769815 0.08317659993921797
|
||||
197600000000.0 -0.49029614209940253 0.013223070873089937 0.9553373307343507 -0.9970277411950892 0.9553373307343507 -0.9970277411950892 -0.4921376443179597 0.08418585432507608
|
||||
198400000000.0 -0.49449447867228313 0.013949522243875412 0.9573386901750538 -1.0016839885681579 0.9573386901750538 -1.0016839885681579 -0.496394668748221 0.08519510871093419
|
||||
199200000000.0 -0.4986928152451635 0.014675973614660859 0.9593400496157568 -1.0063402359412263 0.9593400496157568 -1.0063402359412263 -0.5006516931784826 0.08620436309679233
|
||||
200000000000.0 -0.5028911518180439 0.015402424985446334 0.9613414090564599 -1.010996483314295 0.9613414090564599 -1.010996483314295 -0.5049087176087441 0.08721361748265047
|
||||
@@ -1,49 +0,0 @@
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import List,Union,Literal,Optional
|
||||
|
||||
class SimulationRequestUnit(BaseModel):
|
||||
user_id:int = Field(default=0)
|
||||
template_name:str = Field(default="em_interface_compound")
|
||||
template_version:str = Field(default="")
|
||||
cell_name:str = Field(default="capa")
|
||||
parameters:dict = Field(default={"W":10,"L":10})
|
||||
settings:dict = Field(default={})
|
||||
|
||||
class UuidResponseUnit(BaseModel):
|
||||
id:int
|
||||
user_id:Optional[int]
|
||||
template_name:str
|
||||
template_version:str
|
||||
cell_name:str
|
||||
status:Literal["pending","running","completed","failed"]
|
||||
parameters:dict
|
||||
settings:dict
|
||||
input_hash:str
|
||||
storage_type: str
|
||||
result_path:str
|
||||
completed_at:Optional[str]
|
||||
result_json:Optional[dict]
|
||||
error_message:Optional[str]
|
||||
failure_count:Optional[int]
|
||||
last_failed_at:Optional[str]
|
||||
cpu_usage:Optional[float]
|
||||
memory_usage:Optional[float]
|
||||
disk_usage:Optional[float]
|
||||
gpu_usage:Optional[float]
|
||||
node_name:Optional[str]
|
||||
jobs:Optional[List]
|
||||
results:Optional[List]
|
||||
created_at:str
|
||||
updated_at:str
|
||||
|
||||
class SimulationResponseUnit(BaseModel):
|
||||
template_name:str
|
||||
template_version:str
|
||||
template_id:int
|
||||
cell_name:str
|
||||
cell_id:int
|
||||
parameters:dict
|
||||
settings:dict
|
||||
input_hash:str
|
||||
status:str
|
||||
message:str
|
||||
13
sweep.py
13
sweep.py
@@ -1,13 +0,0 @@
|
||||
from models.mlin import Mlin
|
||||
|
||||
W = []
|
||||
L = []
|
||||
i = 15.52
|
||||
while i <= 100:
|
||||
W.append(i)
|
||||
L.append(i)
|
||||
i = int(i*1.05*100 + 0.5) / 100.0
|
||||
|
||||
model = Mlin()
|
||||
model.sweep()
|
||||
model.export("mlin_sweep")
|
||||
55
utils.py
55
utils.py
@@ -1,55 +0,0 @@
|
||||
import requests
|
||||
import time
|
||||
from schemas.paramer import SimulationRequestUnit, SimulationResponseUnit, UuidResponseUnit
|
||||
import skrf as rf
|
||||
from typing import Literal
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
|
||||
def send_get_request(url):
|
||||
try:
|
||||
response = requests.get(url)
|
||||
response.raise_for_status() # Raise an error for bad responses
|
||||
return response.json()
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"An error occurred: {e}")
|
||||
return None
|
||||
|
||||
def get_network(file_path: str) -> rf.Network:
|
||||
network = rf.Network(file_path)
|
||||
return network
|
||||
|
||||
def get_rms_error(vf: rf.VectorFitting,parameter_type:Literal['s','y','z']):
|
||||
rms_error = []
|
||||
for i in range(vf.network.nports):
|
||||
rms_error_row = []
|
||||
for j in range(vf.network.nports):
|
||||
rms_error = vf.get_rms_error(i, j, parameter_type)
|
||||
rms_error_row.append(rms_error)
|
||||
rms_error.append(rms_error_row)
|
||||
return rms_error
|
||||
|
||||
def show_rms_error(vf: rf.VectorFitting,parameter_type:Literal['s','y','z'],show_plot:bool=True,save_path:str|None=None):
|
||||
freqs = vf.network.f
|
||||
nports = vf.network.nports
|
||||
fig, ax = plt.subplots(nports, nports)
|
||||
fig.set_size_inches(6*nports, 4*nports)
|
||||
for i in range(nports):
|
||||
for j in range(nports):
|
||||
vf.plot("mag",0,1,freqs,ax=ax[i][j],parameter=parameter_type)
|
||||
fig.tight_layout()
|
||||
if show_plot:
|
||||
plt.show()
|
||||
if save_path:
|
||||
plt.savefig(save_path)
|
||||
|
||||
def remove_simulation_with_high_rms_error(simulations:list[rf.VectorFitting],limit:float=0.015,parameter_type:Literal['s','y','z']='s'):
|
||||
nports = simulations[0].network.nports
|
||||
index_of_filtered_simulations = []
|
||||
for res in simulations:
|
||||
for i in range(nports):
|
||||
for j in range(nports):
|
||||
rms_error = res.get_rms_error(i, j, parameter_type)
|
||||
if rms_error > limit:
|
||||
index_of_filtered_simulations.append(i*nports+j)
|
||||
break
|
||||
Reference in New Issue
Block a user