{
  "id": "ipm-nonlinear-mtpa",
  "lesson_ids": [
    "II07.1",
    "II07.3",
    "II11.1"
  ],
  "title": "Нелинейная IPM и MTPA: выбор тока по среднему моменту",
  "intro": [
    "У машины с внутренними магнитами поток возбуждения сочетается с магнитной анизотропией ротора. Момент возникает как от взаимодействия тока с полем магнитов, так и от различия магнитных сопротивлений вдоль осей d и q.",
    "MTPA означает максимальный момент при заданной амплитуде вектора тока. В учебной IPM сильное шунтирование магнитов перемычками даёт небольшой момент; это особенность конкретной геометрии, а не показатель качества промышленных IPM. Оптимизировать нужно средний момент по периоду, а не случайный максимум в одном положении."
  ],
  "theory": [
    {
      "heading": "От фазных величин к осям d–q",
      "paragraphs": [
        "Амплитудно-инвариантное преобразование Парка задаёт токи d и q проекциями трёх фаз на вращающиеся оси. При симметрии iA+iB+iC=0 оно сохраняет величину iд²+iк²=2/3Σiф². В этом комплекте физическая ось d имеет смещение 90° относительно программного отсчёта; оно явно сохранено.",
        "Электромагнитный момент следует из производной коэнергии по положению ротора при фиксированных фазных токах. После преобразования в установившуюся синхронную систему получается выражение через Ψд, Ψк, iд, iк. В линейном приближении подстановка Ψд=Ψм+Lд iд и Ψк=Lк iк разделяет магнитный и реактивный вклады.",
        "При насыщении постоянные Lд и Lк теряют универсальность, поэтому в этом исследовании момент берётся непосредственно из FEMM и усредняется по одинаковым механическим положениям. Формула d–q остаётся независимым согласующим контролем."
      ],
      "formulas": [
        {
          "latex": "i_d=\\frac23\\sum_{j=0}^{2}i_j\\cos(\\theta_{\\mathrm{эл}}-2\\pi j/3),\\qquad i_q=-\\frac23\\sum_{j=0}^{2}i_j\\sin(\\theta_{\\mathrm{эл}}-2\\pi j/3)",
          "explanation": "Латинские d и q — общепринятые обозначения осей."
        },
        {
          "latex": "T=\\frac32p(\\Psi_d i_q-\\Psi_q i_d)=\\frac32p\\left[\\Psi_{\\mathrm{м}}i_q+(L_d-L_q)i_d i_q\\right]",
          "explanation": "Второе равенство справедливо для линейной разделённой модели потокосцеплений."
        }
      ]
    },
    {
      "heading": "Как проводится поиск максимума",
      "paragraphs": [
        "На окружности iд=Icosβ, iк=Isinβ перебирается β. Для каждого β ротор и фазные токи согласованно проходят механический период 30°, обусловленный симметрией четырёхполюсной 12-пазовой машины. Затем вычисляют средний момент и размах пульсаций.",
        "После грубого поиска оптимум уточняют по β, проверяют 32 угловыми положениями, отрицательной половиной окружности и отдельным сгущением сетки. Полный переносимый план содержит 1888 полей IPM: 1056 в исходной и уточнённой сетках токовых углов, 736 в отрицательной половине окружности и 96 сеточных контролей. Это отдельные полевые задачи, не один статический расчёт.",
        "При 5 А лучший найденный β равен 100°, при 10 А — 115°. Возрастание отклонения от 90° показывает изменение оптимального соотношения d–q, но не доказывает глобальную оптимальность при любых токах, напряжениях и температурах."
      ],
      "formulas": [
        {
          "latex": "\\overline T(I,\\beta)=\\frac1N\\sum_{j=0}^{N-1}T(I,\\beta,\\theta_j),\\qquad \\beta_{\\mathrm{опт}}=\\arg\\max_\\beta\\overline T(I,\\beta)",
          "explanation": "Критерий выбран для фиксированного I; ограничение напряжения и ослабление поля рассматриваются отдельно."
        }
      ]
    }
  ],
  "parameters": [
    {
      "name": "Амплитуды тока",
      "value": "5;10",
      "unit": "А"
    },
    {
      "name": "Пары полюсов",
      "value": 2,
      "unit": ""
    },
    {
      "name": "Пазы",
      "value": 12,
      "unit": ""
    },
    {
      "name": "Механический период нагруженного момента",
      "value": 30,
      "unit": "°"
    },
    {
      "name": "Положение физической d-оси",
      "value": 90,
      "unit": "°"
    }
  ],
  "steps": [
    "Сначала разберите соглашение об осях: ошибочный сдвиг на 90° поменяет смысл MTPA.",
    "Запустите reproduce.py; он заново решит точку оптимального β и проверит токовую окружность и потокосцепления.",
    "Полные программы, названные далее, запускайте через run-series.py из корня распакованного комплекта: выберите SERIES_NUMBER по списку README.html. Диспетчер сам устанавливает подпапку и контекст исходной программы; прежний рабочий каталог FEMM не важен.",
    "В reference/pm-data.json сравните средние моменты для всей сетки β и двух токов, затем исходные строки fine_angular_checks.",
    "Для полной серии запускайте reference/rebuild-complete-series.py последовательно до завершения контрольного плана; один запуск делает не более 40 полевых задач. Подходящая оболочка run-complete-batch.py устанавливает рабочую папку.",
    "Сравните средний момент WST и d–q; отдельно сравните размах пульсаций и уточнение сетки."
  ],
  "table": {
    "columns": [
      {
        "key": "i",
        "label": "Амплитуда тока",
        "unit": "А"
      },
      {
        "key": "beta",
        "label": "β от физической d-оси",
        "unit": "°"
      },
      {
        "key": "t",
        "label": "Средний момент WST",
        "unit": "Н·м"
      },
      {
        "key": "ripple",
        "label": "Размах",
        "unit": "Н·м"
      }
    ],
    "rows": [
      {
        "i": 5.0,
        "beta": 100.0,
        "t": 0.02334712300463176,
        "ripple": 0.012825730599790208
      },
      {
        "i": 5.0,
        "beta": 90.0,
        "t": 0.022947418442300544,
        "ripple": 0.01273371397663034
      },
      {
        "i": 10.0,
        "beta": 115.0,
        "t": 0.050844550331861985,
        "ripple": 0.030253132398957182
      },
      {
        "i": 10.0,
        "beta": 90.0,
        "t": 0.04681260942110159,
        "ripple": 0.028201572331248433
      }
    ]
  },
  "series": [
    {
      "title": "MTPA при 5 А",
      "x_label": "β от физической d-оси, °",
      "y_label": "Средний момент, Н·м",
      "points": [
        [
          0.0,
          6.209613421473306e-07
        ],
        [
          7.5,
          0.0025692873253488117
        ],
        [
          15.0,
          0.005111155321344909
        ],
        [
          22.5,
          0.007599894071251195
        ],
        [
          30.0,
          0.0100086977249435
        ],
        [
          37.5,
          0.01231013509169148
        ],
        [
          45.0,
          0.014476027434014488
        ],
        [
          52.5,
          0.016477337680946738
        ],
        [
          60.0,
          0.01828426984722997
        ],
        [
          67.5,
          0.01986622231367059
        ],
        [
          75.0,
          0.021191787814632018
        ],
        [
          82.5,
          0.022228834767763644
        ],
        [
          90.0,
          0.022944528937827002
        ],
        [
          97.5,
          0.023305903306429156
        ],
        [
          105.0,
          0.02328087415526
        ],
        [
          112.5,
          0.022839710226970792
        ],
        [
          120.0,
          0.021957064416205308
        ],
        [
          127.5,
          0.02061476600118226
        ],
        [
          135.0,
          0.018805561795778532
        ],
        [
          142.5,
          0.016537394304162928
        ],
        [
          150.0,
          0.013837330903174657
        ],
        [
          157.5,
          0.010754123075629018
        ],
        [
          165.0,
          0.007358691195013191
        ],
        [
          172.5,
          0.0037419364167966956
        ],
        [
          180.0,
          9.982447991626028e-06
        ]
      ]
    },
    {
      "title": "MTPA при 10 А",
      "x_label": "β от физической d-оси, °",
      "y_label": "Средний момент, Н·м",
      "points": [
        [
          0.0,
          1.2752381620405458e-05
        ],
        [
          7.5,
          0.0046361308334127065
        ],
        [
          15.0,
          0.009233837815501137
        ],
        [
          22.5,
          0.013781895273780981
        ],
        [
          30.0,
          0.01825316017515488
        ],
        [
          37.5,
          0.022616340459088613
        ],
        [
          45.0,
          0.02683561854064445
        ],
        [
          52.5,
          0.03087099613911157
        ],
        [
          60.0,
          0.034679842002717565
        ],
        [
          67.5,
          0.038218460006261626
        ],
        [
          75.0,
          0.04144301881791597
        ],
        [
          82.5,
          0.04430737443622863
        ],
        [
          90.0,
          0.046755958084391
        ],
        [
          97.5,
          0.048714844515519454
        ],
        [
          105.0,
          0.05008877878158143
        ],
        [
          112.5,
          0.05075147103295457
        ],
        [
          120.0,
          0.0505316251201164
        ],
        [
          127.5,
          0.04921616515473691
        ],
        [
          135.0,
          0.046576408605419305
        ],
        [
          142.5,
          0.04241524813533657
        ],
        [
          150.0,
          0.03662183588499956
        ],
        [
          157.5,
          0.029218511003508967
        ],
        [
          165.0,
          0.020391990137718197
        ],
        [
          172.5,
          0.010497346747758946
        ],
        [
          180.0,
          2.7833768144570903e-05
        ]
      ]
    }
  ],
  "scope": [
    "Оптимум определяется сеткой токовых углов и двумя уровнями тока; непрерывная глобальная оптимизация не объявляется выполненной.",
    "Это учебная модель с толстыми перемычками и низким полезным магнитным потоком; тепловая допустимость и реальный паспорт отсутствуют.",
    "Часть серии использует малый период по симметрии, поэтому отдельный контроль полной окружности важен. Физические токи, углы и материалы сверяются по хешам."
  ],
  "sources": [
    {
      "title": "Руководство FEMM 5, разделы магнитного поля и встроенного Python",
      "url": "https://www.femm.info/doku/lib/exe/fetch.php?media=femm-qt:docs:manual.pdf"
    },
    {
      "title": "D. Meeker. Rotating Losses in a Surface Mount Permanent Magnet Motor",
      "url": "https://www.femm.info/doku/doku.php?id=SPMLoss"
    }
  ],
  "checks": [
    {
      "name": "Остаток токовой окружности при 5 А, А²",
      "value": 7.105427357601002e-15,
      "limit": "< 10⁻¹⁰",
      "passed": true
    },
    {
      "name": "Остаток токовой окружности при 10 А, А²",
      "value": 2.842170943040401e-14,
      "limit": "< 10⁻¹⁰",
      "passed": true
    }
  ],
  "downloads": [],
  "python": {
    "path": "downloads/audit-native/ipm-nonlinear-mtpa/reproduce.py",
    "description": "Распакуйте ZIP целиком в новую папку. Выполните reproduce.py встроенным Python FEMM 5: проверяются хеши, заново решаются контрольные поля и пересчитываются численные проверки таблиц. Рабочий каталог определяется по пути сохранённого сценария. Полные программы запускайте через run-series.py; номер SERIES_NUMBER выбирается по списку в README.html."
  },
  "provenance": {
    "origin": "Неизменённые ранее выполненные расчёты FEMM 5 и новый читаемый разбор",
    "runtime": "FEMM 5.0 06Oct2026; встроенный MicroPython; без внешнего Python/COM/TCP",
    "files": [
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/checks.json",
        "path": "reference/checks.json",
        "sha256": "df4c1fc7be3e3b515a8b3884e8281631150cedbbb256d996076ab661bdebc9d3",
        "bytes": 35852
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/complete-series-recipe.json",
        "path": "reference/complete-series-recipe.json",
        "sha256": "70f308490a164d2479adea1d760f65bf42fdd128460acefd443afa6f3867f2b6",
        "bytes": 1621850
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/input-64129585ee64.fem",
        "path": "reference/input-64129585ee64.fem",
        "sha256": "64129585ee64ed503a6c0023400353f2cc6c63ac2e21397468a211825a3bf355",
        "bytes": 13925
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/input-84c587bc0d2b.fem",
        "path": "reference/input-84c587bc0d2b.fem",
        "sha256": "84c587bc0d2bc66db15b45fe8eadd1ff1ee91ac874e3004d1cc0ee2c2c2c498e",
        "bytes": 13911
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/IPM-mtpa.png",
        "path": "reference/IPM-mtpa.png",
        "sha256": "c5b07bf347b773cba9bf26cdef5b7f9a4d2bda1326e44352bae33f6927c7d7c6",
        "bytes": 61668
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/native-chunk-driver-receipt.json",
        "path": "reference/native-chunk-driver-receipt.json",
        "sha256": "358bf6d1fa08c2d66cfd18f2c472ac5cf8597a3daf553090210889e1ecce410a",
        "bytes": 848
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/native-full-circle-receipt.json",
        "path": "reference/native-full-circle-receipt.json",
        "sha256": "0251e3eaa11df11a655251c9cce503f065d3580035864edfeae0596ce3d51574",
        "bytes": 826
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/native-mesh-receipt.json",
        "path": "reference/native-mesh-receipt.json",
        "sha256": "f018f800544797025f152b04548197001dde5da19b5d20f157553b6a9be71829",
        "bytes": 1510
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/native-receipt-16.json",
        "path": "reference/native-receipt-16.json",
        "sha256": "94875538ad2b33c1e37f3dff8fcf8879a6c9f5836033215e5b421d5f5bd99a2b",
        "bytes": 9198
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/original-00.py",
        "path": "reference/original-00.py",
        "sha256": "c652d85dcc24379ba3fd1eca2f41bbddf52b6274168988a4e2b248a9d2b3df1f",
        "bytes": 1565
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/original-execution.json",
        "path": "reference/original-execution.json",
        "sha256": "b3f2b8e8ae4d8103c232bf167a87ee3aa07ee38670a6bd7d694c19972ade2a0e",
        "bytes": 383
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/originals-receipt.json",
        "path": "reference/originals-receipt.json",
        "sha256": "cc2bc77846b0bc86a0d439e7d40f081edb502d13139d79740fafcd370d1d4815",
        "bytes": 7379
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/pm-data.json",
        "path": "reference/pm-data.json",
        "sha256": "f22e12ea10c0bdaf9dc2ef632e57ec3373e84d3634caff2e355352c614dd67db",
        "bytes": 2380973
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/rebuild-complete-series.py",
        "path": "reference/rebuild-complete-series.py",
        "sha256": "96729b0ac56c91ac43e8a20e6338c2d1edc1c6fd937bf98c2fdbbc7bef2b8044",
        "bytes": 4761
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/replay-recipe.json",
        "path": "reference/replay-recipe.json",
        "sha256": "a0573cfa9cfe7ae247c67d83cc208656dbd2b3c70e7c26022fe9367686264640",
        "bytes": 4398
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/REPORT.md",
        "path": "reference/REPORT.md",
        "sha256": "7299dfae51c8ebebda98a7deec87fa6e7673f19742236e04c34d906655888d72",
        "bytes": 3982
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/reproduce.py",
        "path": "reference/reproduce.py",
        "sha256": "acfe17247d8e9f3313d122266175cecda310da2e541b8ffba08dca6e9e7cb025",
        "bytes": 3502
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/result.json",
        "path": "reference/result.json",
        "sha256": "bff53b9f08f50fc68a9204398f67de785544eeced6547d8c01f11b57e4c9a0b2",
        "bytes": 62129
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/results.csv",
        "path": "reference/results.csv",
        "sha256": "0d8a9628960889ceecce90962553351eb181197f8e845f1b05f8b008bf23d0c4",
        "bytes": 557
      },
      {
        "origin": "work/assignment-native-280-2026-10-16/python/practice-ii07-3/A/source-manifest.json",
        "path": "reference/source-manifest.json",
        "sha256": "59aa510ef0cb6c359d1ecebb010dce0b3e0f60caef88765a1a1729b415e5e1dc",
        "bytes": 4913
      }
    ],
    "native_key_fields_per_replay": 1,
    "full_series_entrypoints": [
      "reference/run-complete-batch.py"
    ],
    "source_models_mutated": false,
    "original_check_reports": [
      {
        "path": "reference/checks.json",
        "checks": 150,
        "passed": 150
      }
    ],
    "native_replay": {
      "passed": true,
      "fresh_fields": 1,
      "checks": 142,
      "runtime_sha256": "6a79ed0e882d054275347a1f267b57d04a31e900beaa7f6a6251487ed2e1df1b",
      "launch_cwd_differs_from_package": true
    }
  }
}