Note
Go to the end to download the full example code.
28-kW PM-SyRM, train flux map, measured data#
This example trains a GradNet flux-linkage map for a 10-pole 28-kW PM synchronous reluctance machine (Brusa HSM1.10.18.04) from a measured dataset. The procedure is the same as in 5.6-kW PM-SyRM, train flux map, measured data.
from pathlib import Path
import motulator.drive.gradnet as gn
import numpy as np
from motulator.drive import utils
from motulator_gradnet import (
PNormGradient,
get_training_data,
print_flux_map_errors_meas,
train_gradnet,
)
Compute base values based on the nominal values.
nom = utils.NominalValues(U=283, I=78, f=408, P=25e3, tau=49)
base = utils.BaseValues.from_nominal(nom, n_p=5)
Set up the paths and parameters.
p = Path(__file__).resolve().parent if "__file__" in globals() else Path.cwd()
dataset_path = p / "datasets/brusa_meas.npz"
trained_path = p / "trained_models/brusa_meas_flux_map_pnorm_d12_sub100.npz"
subsample = 100
activation = PNormGradient
Train the model.
if not trained_path.exists():
train_gradnet(
dataset_path=dataset_path,
base=base,
save_model_path=trained_path,
is_flux_map=True,
embed_dim=12,
epochs=20000,
subsample=subsample,
activation=activation,
)
Create the GradNet model and its callable.
Load the dataset for comparison and split it into training and validation sets.
train_data, val_data = get_training_data(
str(dataset_path), base=base, subsample=subsample
)
Plot the flux map.
# Sample the map on a grid for plotting
flux_map = flux_map_fcn.as_magnetic_model(
d_range=np.linspace(-1.4, 1.4, 50) * base.i,
q_range=np.linspace(-1.4, 1.4, 50) * base.i,
)
# Constant current contours corresponding to the measured dataset, for visualization
i_d_levels = np.arange(-145, 146, 5) / base.i
i_q_levels = np.arange(-145, 145, 5) / base.i
current_loci = (i_d_levels, i_q_levels)
utils.plot_map(
flux_map,
"d",
base,
lims={"x": (-1.5, 1.5), "y": (-1.5, 1.5), "z": (-0.2, 1.1)},
ticks={"x": [-1, 0, 1], "y": [-1, 0, 1], "z": [0, 0.5, 1]},
raw_data=[val_data, train_data],
current_loci=current_loci,
axlim_clip=False,
)
utils.plot_map(
flux_map,
"q",
base,
lims={"x": (-1.5, 1.5), "y": (-1.5, 1.5), "z": (-1.1, 1.1)},
ticks={"x": [-1, 0, 1], "y": [-1, 0, 1], "z": [-1, 0, 1]},
raw_data=[val_data, train_data],
current_loci=current_loci,
axlim_clip=False,
)
Print error metrics.
Flux-map error metrics: rmse=0.011 p.u., max=0.075 p.u., std=0.007 p.u.
Total running time of the script: (0 minutes 1.877 seconds)

