fixed: remove dc_enforce

This commit is contained in:
mayge
2025-10-01 07:04:32 -04:00
parent 8f963e7101
commit 341c957650
2 changed files with 14 additions and 33 deletions

View File

@@ -200,7 +200,6 @@ class VFManager():
pre_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
@@ -215,7 +214,6 @@ class VFManager():
pre_poles=self._poles,
fit_constant=self.fit_constant,
fit_proportional=self.fit_proportional,
dc_enforce=self.dc_enforce,
passivity_enforce=self.passivity_enforce
)
if self.verbose:

View File

@@ -4,7 +4,7 @@ from ovf.core.utils import cond_row_inf, cond_col_one, generate_starting_poles
class MultiPortOrthonormalBasis:
def __init__(self,H,freqs,pre_poles,passivity_enforce=True,dc_enforce=True,fit_constant=True,fit_proportional=False):
def __init__(self,H,freqs,pre_poles,passivity_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
@@ -19,7 +19,6 @@ class MultiPortOrthonormalBasis:
self.dc_tol = 1e-18
self.dc_enforce = dc_enforce
self.fit_constant = fit_constant
self.fit_proportional = fit_proportional
self.passivity_enforce = passivity_enforce
@@ -414,17 +413,9 @@ class MultiPortOrthonormalBasis:
"""
K, N = self.Phi.shape
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:
one = np.ones((K, 1), np.complex128)
Phi_w = np.hstack([one, Phi])
@@ -434,7 +425,7 @@ class MultiPortOrthonormalBasis:
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
M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi_w)]).reshape((K, -1)) # (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
@@ -445,20 +436,14 @@ class MultiPortOrthonormalBasis:
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
M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi)]).reshape((K, -1)) # (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 has_dc:
A_re = np.real(M_kp)
A_im = np.imag(M_kp)
mask = np.ones(K, dtype=bool); mask[k0] = False
else:
A_re = np.real(M_kp)
A_im = np.imag(M_kp)
A_re = np.real(M_kp)
A_im = np.imag(M_kp)
A_blocks = [A_re, A_im]
@@ -467,17 +452,15 @@ class MultiPortOrthonormalBasis:
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_sum[i].append(np.sum(np.abs(H[:,i,j])**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)
mean_row = (beta_ij / len(Phi_w)) * np.sum(Phi_w, axis=0)
A_w0.append(np.concatenate([np.zeros(N*self.ports**2, float),
np.real(mean_row).astype(float)]
).reshape(1, -1))
@@ -489,16 +472,16 @@ class MultiPortOrthonormalBasis:
b = np.zeros(m, float)
b = np.concatenate([b, b_w0])
else:
H_kp = None
H_all = 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 = H_kp.reshape(-1,1)
H_0 = H[:,i,j]
H_all = H_0 if H_all is None else np.hstack([H_all, H_0])
assert H_all is not None
H_all = H_all.reshape(-1,1)
b_re = np.real(d0 * H_kp)
b_im = np.imag(d0 * H_kp)
b_re = np.real(d0 * H_all)
b_im = np.imag(d0 * H_all)
b = np.concatenate([b_re.ravel(), b_im.ravel()]).astype(float)
# ---- build final stacked-real system ----