Skip to content

Commit 81851a1

Browse files
add enhanced Steinmetz equation
1 parent c3375db commit 81851a1

File tree

3 files changed

+69
-4
lines changed

3 files changed

+69
-4
lines changed

docs/wordlist

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,5 @@ popt
7070
rtype
7171
steinmetz
7272
sqrt
73-
linspace
73+
linspace
74+
qT

materialdatabase/processing/complex_permeability.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,21 +104,22 @@ def fit_permeability_amplitude(self):
104104
mu_abs, maxfev=100000)
105105
return popt_mu_abs
106106

107-
def fit_losses(self):
107+
def fit_losses(self, log_pv_fit_function):
108108
"""
109109
Fit the magnetic power loss density p_v as a function of frequency, temperature, and magnetic flux density.
110110
111111
The losses are calculated from the imaginary part of the permeability using the helper function `pv_mag()`,
112112
and then fitted using e.g. the Steinmetz-based `..._steinmetz_...(f, T, b, ...)`.
113113
114+
:param log_pv_fit_function: e.g. mdb.log_steinmetz_qT, mdb.log_enhanced_steinmetz_qT
114115
:return: Fitted parameters (popt_pv) of the Steinmetz-based power loss model.
115116
:rtype: np.ndarray
116117
"""
117118
mu_abs = np.sqrt(self.measurement_data["mu_real"] ** 2 + self.measurement_data["mu_imag"] ** 2)
118119
pv = pv_mag(self.measurement_data["f"],
119120
-self.measurement_data["mu_imag"] * mu_0,
120121
self.measurement_data["b"] / mu_abs / mu_0)
121-
popt_pv, pcov_pv = curve_fit(log_steinmetz_qT,
122+
popt_pv, pcov_pv = curve_fit(log_pv_fit_function,
122123
(self.measurement_data["f"],
123124
self.measurement_data["T"],
124125
self.measurement_data["b"]),

materialdatabase/processing/utils/empirical.py

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def steinmetz_qT(fTb: tuple[float | np.ndarray, float | np.ndarray, float | np.n
4949

5050

5151
def log_steinmetz_qT(fTb: tuple[float | np.ndarray, float | np.ndarray, float | np.ndarray],
52-
alpha: float, beta: float, c_0: float, c_1: float, c_2: float) -> float | np.ndarray:
52+
alpha: float, beta: float, c_0: float, c_1: float, c_2: float) -> float | np.ndarray:
5353
"""
5454
Temperature-dependent Steinmetz model using quadratic temperature function.
5555
@@ -64,6 +64,69 @@ def log_steinmetz_qT(fTb: tuple[float | np.ndarray, float | np.ndarray, float |
6464
return np.log(steinmetz_qT(fTb, alpha, beta, c_0, c_1, c_2))
6565

6666

67+
def enhanced_steinmetz(fb: tuple[float | np.ndarray, float | np.ndarray],
68+
alpha: float, beta: float, k: float,
69+
k_b: float, k_f: float, k_alpha2: float) -> float | np.ndarray:
70+
"""
71+
Enhanced Steinmetz loss model incorporating additional scaling terms dependent on frequency and flux density.
72+
73+
:param fb: Tuple (f, B) of frequency and magnetic flux density
74+
:param alpha: Frequency exponent
75+
:param beta: Flux density exponent
76+
:param k: Base scaling factor
77+
:param k_b: Coefficient for flux density-dependent scaling
78+
:param k_f: Coefficient for frequency-dependent scaling
79+
:param k_alpha2: Exponent for frequency in additional scaling term
80+
:return: Power loss density
81+
"""
82+
f, b = fb
83+
return (k + k_b * b + k_f * f ** k_alpha2) * f ** alpha * b ** beta
84+
85+
86+
def enhanced_steinmetz_qT(fTb: tuple[float | np.ndarray, float | np.ndarray, float | np.ndarray],
87+
alpha: float, beta: float,
88+
k_b: float, k_f: float, k_alpha2: float,
89+
c_0: float, c_1: float, c_2: float) -> float | np.ndarray:
90+
"""
91+
Temperature-dependent enhanced Steinmetz model using quadratic temperature function and additional scaling terms.
92+
93+
:param fTb: Tuple (f, T, B) of frequency, temperature, and flux density
94+
:param alpha: Frequency exponent
95+
:param beta: Flux density exponent
96+
:param k_b: Coefficient for flux density-dependent scaling
97+
:param k_f: Coefficient for frequency-dependent scaling
98+
:param k_alpha2: Exponent for frequency in additional scaling term
99+
:param c_0: Constant coefficient for temperature scaling
100+
:param c_1: Linear temperature coefficient
101+
:param c_2: Quadratic temperature coefficient
102+
:return: Power loss density
103+
"""
104+
f, T, b = fTb
105+
k = quadratic_temperature(T, c_0, c_1, c_2)
106+
return (k + k_b * b + k_f * f ** k_alpha2) * f ** alpha * b ** beta
107+
108+
109+
def log_enhanced_steinmetz_qT(fTb: tuple[float | np.ndarray, float | np.ndarray, float | np.ndarray],
110+
alpha: float, beta: float,
111+
k_b: float, k_f: float, k_alpha2: float,
112+
c_0: float, c_1: float, c_2: float) -> float | np.ndarray:
113+
"""
114+
Logarithm of the temperature-dependent enhanced Steinmetz model with frequency and flux-density dependent scaling.
115+
116+
:param fTb: Tuple (f, T, B) of frequency, temperature, and flux density
117+
:param alpha: Frequency exponent
118+
:param beta: Flux density exponent
119+
:param k_b: Coefficient for flux density-dependent scaling
120+
:param k_f: Coefficient for frequency-dependent scaling
121+
:param k_alpha2: Exponent for frequency in additional scaling term
122+
:param c_0: Constant coefficient for temperature scaling
123+
:param c_1: Linear temperature coefficient
124+
:param c_2: Quadratic temperature coefficient
125+
:return: Logarithm of power loss density
126+
"""
127+
return np.log(enhanced_steinmetz_qT(fTb, alpha, beta, k_b, k_f, k_alpha2, c_0, c_1, c_2))
128+
129+
67130
def fit_mu_abs(fb: tuple[float | np.ndarray, float | np.ndarray],
68131
A: float, beta: float, b0: float, C: float, f0: float, n: float) -> float | np.ndarray:
69132
"""

0 commit comments

Comments
 (0)