
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "examples/plot_28kw_pmsyrm_flux_map_meas.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        :ref:`Go to the end <sphx_glr_download_examples_plot_28kw_pmsyrm_flux_map_meas.py>`
        to download the full example code.

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_examples_plot_28kw_pmsyrm_flux_map_meas.py:


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
:doc:`/examples/plot_6kw_pmsyrm_flux_map_meas`.

.. GENERATED FROM PYTHON SOURCE LINES 11-25

.. code-block:: Python


    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,
    )








.. GENERATED FROM PYTHON SOURCE LINES 26-27

Compute base values based on the nominal values.

.. GENERATED FROM PYTHON SOURCE LINES 27-31

.. code-block:: Python


    nom = utils.NominalValues(U=283, I=78, f=408, P=25e3, tau=49)
    base = utils.BaseValues.from_nominal(nom, n_p=5)








.. GENERATED FROM PYTHON SOURCE LINES 32-33

Set up the paths and parameters.

.. GENERATED FROM PYTHON SOURCE LINES 33-41

.. code-block:: Python


    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








.. GENERATED FROM PYTHON SOURCE LINES 42-43

Train the model.

.. GENERATED FROM PYTHON SOURCE LINES 43-56

.. code-block:: Python


    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,
        )








.. GENERATED FROM PYTHON SOURCE LINES 57-58

Create the GradNet model and its callable.

.. GENERATED FROM PYTHON SOURCE LINES 58-62

.. code-block:: Python


    model = gn.load_gradnet(trained_path)
    flux_map_fcn = gn.FluxMap(model)








.. GENERATED FROM PYTHON SOURCE LINES 63-64

Load the dataset for comparison and split it into training and validation sets.

.. GENERATED FROM PYTHON SOURCE LINES 64-69

.. code-block:: Python


    train_data, val_data = get_training_data(
        str(dataset_path), base=base, subsample=subsample
    )








.. GENERATED FROM PYTHON SOURCE LINES 70-71

Plot the flux map.

.. GENERATED FROM PYTHON SOURCE LINES 71-105

.. code-block:: Python


    # 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,
    )




.. rst-class:: sphx-glr-horizontal


    *

      .. image-sg:: /examples/images/sphx_glr_plot_28kw_pmsyrm_flux_map_meas_001.png
         :alt: plot 28kw pmsyrm flux map meas
         :srcset: /examples/images/sphx_glr_plot_28kw_pmsyrm_flux_map_meas_001.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /examples/images/sphx_glr_plot_28kw_pmsyrm_flux_map_meas_002.png
         :alt: plot 28kw pmsyrm flux map meas
         :srcset: /examples/images/sphx_glr_plot_28kw_pmsyrm_flux_map_meas_002.png
         :class: sphx-glr-multi-img





.. GENERATED FROM PYTHON SOURCE LINES 106-107

Print error metrics.

.. GENERATED FROM PYTHON SOURCE LINES 107-109

.. code-block:: Python


    print_flux_map_errors_meas(flux_map_fcn, val_data, base=base)




.. rst-class:: sphx-glr-script-out

 .. code-block:: none

    Flux-map error metrics: rmse=0.011 p.u., max=0.075 p.u., std=0.007 p.u.





.. rst-class:: sphx-glr-timing

   **Total running time of the script:** (0 minutes 1.877 seconds)


.. _sphx_glr_download_examples_plot_28kw_pmsyrm_flux_map_meas.py:

.. only:: html

  .. container:: sphx-glr-footer sphx-glr-footer-example

    .. container:: sphx-glr-download sphx-glr-download-jupyter

      :download:`Download Jupyter notebook: plot_28kw_pmsyrm_flux_map_meas.ipynb <plot_28kw_pmsyrm_flux_map_meas.ipynb>`

    .. container:: sphx-glr-download sphx-glr-download-python

      :download:`Download Python source code: plot_28kw_pmsyrm_flux_map_meas.py <plot_28kw_pmsyrm_flux_map_meas.py>`

    .. container:: sphx-glr-download sphx-glr-download-zip

      :download:`Download zipped: plot_28kw_pmsyrm_flux_map_meas.zip <plot_28kw_pmsyrm_flux_map_meas.zip>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
