{"id":311,"date":"2026-04-30T13:55:41","date_gmt":"2026-04-30T05:55:41","guid":{"rendered":"http:\/\/bluespider.top\/?p=311"},"modified":"2026-04-30T20:28:12","modified_gmt":"2026-04-30T12:28:12","slug":"motulator-%e4%b8%ad-mtpv-%e5%8e%9f%e7%90%86%e4%b8%8e%e5%ae%9e%e7%8e%b0%e5%88%86%e6%9e%90","status":"publish","type":"post","link":"http:\/\/bluespider.top\/?p=311","title":{"rendered":"PMSM \u9a71\u52a8\u7cfb\u7edf\u53c2\u6570\u4e0e\u6700\u4f18\u63a7\u5236\u539f\u7406\u5206\u6790"},"content":{"rendered":"<p>\u672c\u6587\u57fa\u4e8e <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/Aalto-Electric-Drives\/motulator\">motulator<\/a> \u6846\u67b6\uff0c\u5bf9\u4e00\u53f0\u5185\u7f6e\u5f0f\u6c38\u78c1\u540c\u6b65\u7535\u673a (IPMSM) \u7684\u9a71\u52a8\u7cfb\u7edf\u8fdb\u884c\u5b8c\u6574\u53c2\u6570\u68b3\u7406\uff0c\u5e76\u7cfb\u7edf\u5206\u6790\u6700\u5927\u8f6c\u77e9\u7535\u6d41\u6bd4 (MTPA)\u3001\u6700\u5927\u8f6c\u77e9\u7535\u538b\u6bd4 (MTPV)\u3001\u53c2\u8003\u6307\u4ee4\u751f\u6210\u94fe\u53ca FluxTorqueControl \u7684\u6838\u5fc3\u539f\u7406\u4e0e\u4ee3\u7801\u5b9e\u73b0\u3002<\/p>\n<hr \/>\n<h2>1. \u7535\u673a\u4e0e\u9a71\u52a8\u7cfb\u7edf\u53c2\u6570<\/h2>\n<p>\u4eff\u771f\u57fa\u4e8e <code>config.py<\/code> \u4e2d\u5b9a\u4e49\u7684\u53c2\u6570\u6784\u5efa\u3002\u4ee5\u4e0b\u5206\u522b\u5217\u51fa\u7535\u673a\u672c\u4f53\u3001\u4e24\u79cd\u76f4\u6d41\u6bcd\u7ebf\u65b9\u6848\uff08\u4f20\u7edf\u5927\u7535\u5bb9 vs Slim DC-link\uff09\u3001\u673a\u68b0\u7cfb\u7edf\u3001\u63a7\u5236\u5668\u53ca\u6807\u5e7a\u503c\u57fa\u503c\u3002<\/p>\n<h3>1.1 \u6c38\u78c1\u540c\u6b65\u7535\u673a\u53c2\u6570<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u53c2\u6570<\/th>\n<th align=\"left\">\u7b26\u53f7<\/th>\n<th align=\"left\">\u6570\u503c<\/th>\n<th align=\"left\">\u5355\u4f4d<\/th>\n<th align=\"left\">\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u6781\u5bf9\u6570<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(n_p&#092;)<\/span><\/td>\n<td align=\"left\">3<\/td>\n<td align=\"left\">\u2014<\/td>\n<td align=\"left\">6 \u6781\u7535\u673a<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u5b9a\u5b50\u7535\u963b<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(R_s&#092;)<\/span><\/td>\n<td align=\"left\">0.65<\/td>\n<td align=\"left\">\u03a9<\/td>\n<td align=\"left\"><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">d \u8f74\u7535\u611f<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(L_d&#092;)<\/span><\/td>\n<td align=\"left\">2.6<\/td>\n<td align=\"left\">mH<\/td>\n<td align=\"left\"><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">q \u8f74\u7535\u611f<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(L_q&#092;)<\/span><\/td>\n<td align=\"left\">3.49<\/td>\n<td align=\"left\">mH<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(L_q \\gt L_d&#092;)<\/span>\uff0c\u8bc1\u5b9e\u4e3a\u5185\u7f6e\u5f0f (IPMSM)<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u6c38\u78c1\u4f53\u78c1\u94fe<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\psi_f&#092;)<\/span><\/td>\n<td align=\"left\">0.1333<\/td>\n<td align=\"left\">Vs<\/td>\n<td align=\"left\"><code>0.4 \/ 3<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u6700\u5927\u5b9a\u5b50\u7535\u6d41<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(I_{s,\\max}&#092;)<\/span><\/td>\n<td align=\"left\">58<\/td>\n<td align=\"left\">A (\u5cf0\u503c)<\/td>\n<td align=\"left\">\u5bf9\u5e94 2.0 pu<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u989d\u5b9a\u8f6c\u901f<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\omega_{M,\\text{nom}}&#092;)<\/span><\/td>\n<td align=\"left\">376.99<\/td>\n<td align=\"left\">rad\/s<\/td>\n<td align=\"left\">3600 rpm<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u989d\u5b9a\u529f\u7387<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(P_{\\text{nom}}&#092;)<\/span><\/td>\n<td align=\"left\">2765<\/td>\n<td align=\"left\">W<\/td>\n<td align=\"left\"><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u989d\u5b9a\u8f6c\u77e9<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\tau_{\\text{nom}}&#092;)<\/span><\/td>\n<td align=\"left\">7.33<\/td>\n<td align=\"left\">Nm<\/td>\n<td align=\"left\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>1.2 \u76f4\u6d41\u6bcd\u7ebf\u53c2\u6570<\/h3>\n<p>\u672c\u9879\u76ee\u5bf9\u6bd4\u4e24\u79cd\u76f4\u6d41\u6bcd\u7ebf\u65b9\u6848\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u53c2\u6570<\/th>\n<th align=\"left\">\u4f20\u7edf\u5927\u7535\u5bb9 (post_222)<\/th>\n<th align=\"left\">Slim DC-link (\u672c\u4eff\u771f)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u76f4\u6d41\u7535\u5bb9 <span class=\"math-inline\">&#092;(C_{dc}&#092;)<\/span><\/td>\n<td align=\"left\">22 mF<\/td>\n<td align=\"left\">88 \u00b5F<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u76f4\u6d41\u4fa7\u7535\u611f <span class=\"math-inline\">&#092;(L_{dc}&#092;)<\/span><\/td>\n<td align=\"left\">\u2014<\/td>\n<td align=\"left\">0.9516 mH<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u7f51\u7ebf\u7535\u538b <span class=\"math-inline\">&#092;(U_g&#092;)<\/span><\/td>\n<td align=\"left\">220 V (RMS)<\/td>\n<td align=\"left\">127.3 V (RMS)<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u7f51\u9891\u7387 <span class=\"math-inline\">&#092;(f_g&#092;)<\/span><\/td>\n<td align=\"left\">50 Hz<\/td>\n<td align=\"left\">60 Hz<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Slim DC-link \u91c7\u7528\u5c0f\u7535\u5bb9 (88 \u00b5F) \u65b9\u6848\uff0c\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b\u5b58\u5728\u663e\u8457\u7684\u516d\u8109\u6ce2\u52a8\u3002<code>FrequencyConverter<\/code> \u6a21\u578b\u5185\u90e8\u5df2\u5305\u542b <span class=\"math-inline\">&#092;(C_{dc}&#092;)<\/span> \u548c <span class=\"math-inline\">&#092;(L_{dc}&#092;)<\/span> \u7684\u52a8\u6001\u72b6\u6001\u3002<\/p>\n<h3>1.3 \u673a\u68b0\u7cfb\u7edf\u53c2\u6570<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u53c2\u6570<\/th>\n<th align=\"left\">\u7b26\u53f7<\/th>\n<th align=\"left\">\u6570\u503c<\/th>\n<th align=\"left\">\u5355\u4f4d<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u8f6c\u52a8\u60ef\u91cf<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(J&#092;)<\/span><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(4.9 \\times 10^{-4}&#092;)<\/span><\/td>\n<td align=\"left\">kg\u00b7m\u00b2<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u6469\u64e6\u7cfb\u6570<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(B_L&#092;)<\/span><\/td>\n<td align=\"left\">0<\/td>\n<td align=\"left\">Nm\/(rad\/s)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>1.4 \u63a7\u5236\u5668\u53c2\u6570<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u53c2\u6570<\/th>\n<th align=\"left\">\u7b26\u53f7<\/th>\n<th align=\"left\">\u6570\u503c<\/th>\n<th align=\"left\">\u5355\u4f4d<\/th>\n<th align=\"left\">\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u91c7\u6837\u5468\u671f<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(T_s&#092;)<\/span><\/td>\n<td align=\"left\">125<\/td>\n<td align=\"left\">\u00b5s<\/td>\n<td align=\"left\">\u5f00\u5173\u9891\u7387 8 kHz<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u8f6c\u77e9\u73af\u5e26\u5bbd<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\alpha_\\tau&#092;)<\/span><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(2\\pi \\times 100&#092;)<\/span><\/td>\n<td align=\"left\">rad\/s<\/td>\n<td align=\"left\"><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u78c1\u94fe\u73af\u5e26\u5bbd<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\alpha_\\psi&#092;)<\/span><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(2\\pi \\times 100&#092;)<\/span><\/td>\n<td align=\"left\">rad\/s<\/td>\n<td align=\"left\"><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u79ef\u5206\u4f5c\u7528\u5e26\u5bbd<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\alpha_i&#092;)<\/span><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(2\\pi \\times 100&#092;)<\/span><\/td>\n<td align=\"left\">rad\/s<\/td>\n<td align=\"left\"><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u89c2\u6d4b\u5668\u6781\u70b9<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\alpha_o&#092;)<\/span><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(2\\pi \\times 50&#092;)<\/span><\/td>\n<td align=\"left\">rad\/s<\/td>\n<td align=\"left\"><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u538b\u5229\u7528\u7cfb\u6570<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(k_u&#092;)<\/span><\/td>\n<td align=\"left\">0.9<\/td>\n<td align=\"left\">\u2014<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(u_{s,\\max} = k_u u_{dc}\/\\sqrt{3}&#092;)<\/span><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">MTPV \u88d5\u91cf<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(k_{\\text{mtpv}}&#092;)<\/span><\/td>\n<td align=\"left\">0.85<\/td>\n<td align=\"left\">\u2014<\/td>\n<td align=\"left\">\u8f6c\u77e9\u8f6f\u4e0a\u9650\u7cfb\u6570<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u63a7\u5236\u65b9\u5f0f<\/td>\n<td align=\"left\">\u2014<\/td>\n<td align=\"left\">\u65e0\u4f20\u611f\u5668<\/td>\n<td align=\"left\">\u2014<\/td>\n<td align=\"left\"><code>sensorless=True<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>1.5 \u6807\u5e7a\u503c\u7cfb\u7edf\u57fa\u503c<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u57fa\u503c<\/th>\n<th align=\"left\">\u8868\u8fbe\u5f0f<\/th>\n<th align=\"left\">\u6570\u503c<\/th>\n<th align=\"left\">\u5355\u4f4d<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u7535\u89d2\u9891\u7387<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\omega_{\\text{base}} = n_p \\omega_{M,\\text{nom}}&#092;)<\/span><\/td>\n<td align=\"left\">1131.0<\/td>\n<td align=\"left\">rad\/s<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u538b<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(u_{\\text{base}} = \\psi_f \\omega_{\\text{base}}&#092;)<\/span><\/td>\n<td align=\"left\">150.8<\/td>\n<td align=\"left\">V<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u6d41<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(i_{\\text{base}} = I_{s,\\max}\/2&#092;)<\/span><\/td>\n<td align=\"left\">29.0<\/td>\n<td align=\"left\">A<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u78c1\u94fe<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\psi_{\\text{base}} = u_{\\text{base}}\/\\omega_{\\text{base}}&#092;)<\/span><\/td>\n<td align=\"left\">0.1333<\/td>\n<td align=\"left\">Vs<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u529f\u7387<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(p_{\\text{base}} = 1.5 u_{\\text{base}} i_{\\text{base}}&#092;)<\/span><\/td>\n<td align=\"left\">6561<\/td>\n<td align=\"left\">W<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u963b\u6297<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(Z_{\\text{base}} = u_{\\text{base}}\/i_{\\text{base}}&#092;)<\/span><\/td>\n<td align=\"left\">5.20<\/td>\n<td align=\"left\">\u03a9<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u611f<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(L_{\\text{base}} = Z_{\\text{base}}\/\\omega_{\\text{base}}&#092;)<\/span><\/td>\n<td align=\"left\">4.60<\/td>\n<td align=\"left\">mH<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u8f6c\u77e9<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\tau_{\\text{base}} = 3 p_{\\text{base}}\/\\omega_{\\text{base}}&#092;)<\/span><\/td>\n<td align=\"left\">17.4<\/td>\n<td align=\"left\">Nm<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2>2. MTPA \u539f\u7406\u4e0e motulator \u5b9e\u73b0<\/h2>\n<h3>2.1 \u6570\u5b66\u6761\u4ef6<\/h3>\n<p>MTPA\uff08Maximum Torque Per Ampere\uff0c\u6700\u5927\u8f6c\u77e9\u7535\u6d41\u6bd4\uff09\u6761\u4ef6\u5b9a\u4e49\u4e3a\uff1a\u5728\u6052\u5b9a\u7535\u6d41\u5e45\u503c\u4e0b\uff0c\u8f6c\u77e9\u5bf9\u7535\u6d41\u89d2\u7684\u5bfc\u6570\u4e3a\u96f6\u3002<\/p>\n<div class=\"math-display\">\\[\\tau_M = 1.5 \\cdot n_p \\cdot \\operatorname{Im}(\\psi_s \\cdot i_s^*)\\]<\/div>\n<p>MTPA \u6761\u4ef6\uff1a<span class=\"math-inline\">&#092;(d\\tau_M\/d\\gamma = 0&#092;)<\/span>\uff0c\u5176\u4e2d <span class=\"math-inline\">&#092;(\\gamma&#092;)<\/span> \u4e3a\u7535\u6d41\u89d2\u3002<\/p>\n<p>\u901a\u8fc7<strong>\u8f85\u52a9\u78c1\u94fe<\/strong> <span class=\"math-inline\">&#092;(\\psi_a&#092;)<\/span>\uff08auxiliary flux\uff09\uff0c\u53ef\u5c06\u8be5\u6761\u4ef6\u5199\u6210\u6b63\u4ea4\u5f62\u5f0f\uff1a<\/p>\n<div class=\"math-display\">\\[\\boxed{\\operatorname{Re}(\\psi_a \\cdot i_s^*) = 0}\\]<\/div>\n<h3>2.2 \u8f85\u52a9\u78c1\u94fe <span class=\"math-inline\">&#092;(\\psi_a&#092;)<\/span> \u7684\u4e09\u79cd\u7b49\u4ef7\u5f62\u5f0f<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u5f62\u5f0f<\/th>\n<th align=\"left\">\u8868\u8fbe\u5f0f<\/th>\n<th align=\"left\">\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u7406\u8bba\u5b9a\u4e49<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\psi_a = \\psi_s + j \\cdot \\partial\\psi_s\/\\partial\\delta&#092;)<\/span><\/td>\n<td align=\"left\">\u5bf9\u7535\u6d41\u89d2\u6c42\u5bfc\u540e\u6784\u9020<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">dq \u5c55\u5f00\u5f0f<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\psi_a = \\psi_s &#8211; L_{qq} i_d &#8211; j L_{dd} i_q + j L_{dq} i_s^*&#092;)<\/span><\/td>\n<td align=\"left\">\u7528\u589e\u91cf\u7535\u611f\u5c55\u5f00<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u5411\u91cf\u5f62\u5f0f<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\psi_a = \\psi_s + J \\cdot \\partial\\psi_s\/\\partial\\delta&#092;)<\/span><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(J&#092;)<\/span> \u4e3a 90\u00b0 \u65cb\u8f6c\u77e9\u9635<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>2.3 \u6e90\u7801\u5b9e\u73b0<\/h3>\n<p><code>ControlLoci.compute_mtpa_locus(i_s_max)<\/code> \u7684\u5b9e\u73b0\u6b65\u9aa4\uff1a<\/p>\n<ol>\n<li>\u5728 <span class=\"math-inline\">&#092;([0, i_{s,\\max}]&#092;)<\/span> \u5185\u7ebf\u6027\u53d6 16 \u4e2a\u7535\u6d41\u5e45\u503c\u70b9<\/li>\n<li>\u5bf9\u6bcf\u4e2a\u5e45\u503c\uff0c\u7528 Brentq \u6c42\u6839 <span class=\"math-inline\">&#092;(\\operatorname{Re}(\\psi_a \\cdot i_s^*) = 0&#092;)<\/span>\uff0c\u5f97\u5230 MTPA \u7535\u6d41\u89d2 <span class=\"math-inline\">&#092;(\\gamma&#092;)<\/span><\/li>\n<li>\u8ba1\u7b97 <span class=\"math-inline\">&#092;(i_{s,dq} = |i_s| \\cdot \\exp(1j \\cdot \\gamma)&#092;)<\/span>\uff0c\u5e76\u901a\u8fc7 <code>psi_s_dq()<\/code> \u5f97\u5230\u5bf9\u5e94\u78c1\u94fe<\/li>\n<li>\u8ba1\u7b97\u8f6c\u77e9 <span class=\"math-inline\">&#092;(\\tau_M = 1.5 \\cdot n_p \\cdot \\operatorname{Im}(i_{s,dq} \\cdot \\psi_{s,dq}^*)&#092;)<\/span><\/li>\n<li>\u5c01\u88c5\u4e3a <code>MTPALocus<\/code>\uff08\u542b <span class=\"math-inline\">&#092;(i_{s,dq}&#092;)<\/span> vs <span class=\"math-inline\">&#092;(\\tau_M&#092;)<\/span> \u63d2\u503c\u5668\uff09<\/li>\n<\/ol>\n<pre><code class=\"language-python line-numbers\"># _sm_control_loci.py\nclass ControlLoci:\n    def compute_mtpa_current_angle(self, i_s_abs: float) -&gt; float:\n        def mtpa_cond(gamma: float) -&gt; float:\n            i_s_dq = i_s_abs * np.exp(1j * gamma)\n            psi_a_dq = self.par.aux_flux(i_s_dq)\n            return np.real(psi_a_dq * np.conj(i_s_dq))\n\n        gamma_range = (0.5 * np.pi, np.pi)  # IPMSM: gamma \u5728\u7b2c\u4e8c\u8c61\u9650\n        if mtpa_cond(gamma_range[0]) * mtpa_cond(gamma_range[1]) &gt; 0:\n            return 0.0  # \u533a\u95f4\u5185\u65e0\u6839\n        return root_scalar(mtpa_cond, bracket=gamma_range, method=\"brentq\").root\n\n    def compute_mtpa_locus(self, i_s_max: float, num: int = 16) -&gt; MTPALocus:\n        current_magnitudes = np.linspace(0, i_s_max, num)\n        gamma = np.zeros_like(current_magnitudes)\n        for idx, i_s_abs in enumerate(current_magnitudes):\n            gamma[idx] = self.compute_mtpa_current_angle(float(i_s_abs))\n        i_s_dq = current_magnitudes * np.exp(1j * gamma)\n        psi_s_dq = self.par.psi_s_dq(i_s_dq)\n        tau_M = 1.5 * self.par.n_p * np.imag(i_s_dq * np.conj(psi_s_dq))\n        return MTPALocus(\n            i_s_dq=i_s_dq, psi_s_dq=psi_s_dq, tau_M=tau_M,\n            i_s_dq_vs_tau_M=lambda x: np.interp(x, tau_M, i_s_dq),\n        )\n<\/code><\/pre>\n<hr \/>\n<h2>3. MTPV \u539f\u7406\u4e0e motulator \u5b9e\u73b0<\/h2>\n<h3>3.1 \u95ee\u9898\u8bbe\u5b9a<\/h3>\n<p>\u5728\u9ad8\u901f\u5f31\u78c1\u533a\uff0c\u7535\u673a\u7535\u538b\u53d7\u9650\u4e8e\u76f4\u6d41\u6bcd\u7ebf\uff1a<\/p>\n<div class=\"math-display\">\\[|u_s| \\le \\frac{k_u u_{dc}}{\\sqrt{3}} \\approx \\omega_m |\\psi_s|\\]<\/div>\n<p>\u5bf9\u4e8e\u7ed9\u5b9a\u8f6c\u901f <span class=\"math-inline\">&#092;(\\omega_m&#092;)<\/span>\uff0c\u78c1\u94fe\u5e45\u503c <span class=\"math-inline\">&#092;(|\\psi_s|&#092;)<\/span> \u88ab\u9650\u5236\u5728\u6700\u5927\u503c\u4ee5\u4e0b\u3002\u6b64\u65f6<strong>\u6700\u5927\u8f6c\u77e9\u7535\u538b\u6bd4 (MTPV)<\/strong> \u7684\u95ee\u9898\u53ef\u8868\u8ff0\u4e3a\uff1a<\/p>\n<blockquote><p>\n  \u5728\u78c1\u94fe\u5e45\u503c <span class=\"math-inline\">&#092;(|\\psi_s|&#092;)<\/span> \u6052\u5b9a\u7684\u7ea6\u675f\u4e0b\uff0c\u5bfb\u627e\u4f7f\u7535\u78c1\u8f6c\u77e9\u6700\u5927\u7684\u5de5\u4f5c\u70b9\u3002\n<\/p><\/blockquote>\n<h3>3.2 \u89e3\u6790\u6761\u4ef6<\/h3>\n<p>\u66f4\u7cbe\u786e\u5730\u8bf4\uff0cMTPV \u662f\u7535\u538b\u6781\u9650\u4e0b\u4e0d\u540c\u8f6c\u901f\u5bf9\u5e94\u7684<strong>\u6700\u4f18\u8f68\u8ff9<\/strong>\u3002\u5f53\u8f6c\u901f\u7ee7\u7eed\u5347\u9ad8\u3001\u7535\u538b\u6781\u9650\u5706\u6536\u7f29\u65f6\uff0cMTPV \u8f68\u8ff9\u7ed9\u51fa\u4e86\u6bcf\u4e2a\u78c1\u94fe\u6c34\u5e73\u4e0b\u80fd\u4ea7\u751f\u7684<strong>\u6700\u5927\u8f6c\u77e9<\/strong>\u3002\u5176\u6570\u5b66\u6761\u4ef6\u4e3a\uff1a<\/p>\n<div class=\"math-display\">\\[\\boxed{\\frac{\\partial \\tau_M}{\\partial \\delta}\\bigg|_{|\\psi_s|=\\text{const}} = 0}\\]<\/div>\n<p>\u5176\u4e2d <span class=\"math-inline\">&#092;(\\delta&#092;)<\/span> \u662f\u78c1\u94fe\u77e2\u91cf\u5728 dq \u5750\u6807\u7cfb\u4e2d\u7684\u89d2\u5ea6\uff0c<span class=\"math-inline\">&#092;(\\psi_s = |\\psi_s| e^{j\\delta}&#092;)<\/span>\u3002<\/p>\n<h3>3.3 \u8f85\u52a9\u7535\u6d41 <span class=\"math-inline\">&#092;(i_a&#092;)<\/span> \u7684\u5b9a\u4e49\u4e0e\u63a8\u5bfc<\/h3>\n<p>\u5728 MTPA \u5206\u6790\u4e2d\uff0cmotulator \u4f7f\u7528<strong>\u8f85\u52a9\u78c1\u94fe<\/strong> <span class=\"math-inline\">&#092;(\\psi_a&#092;)<\/span> \u5c06 MTPA \u6761\u4ef6\u5199\u6210\u6b63\u4ea4\u5f62\u5f0f\uff1a<\/p>\n<div class=\"math-display\">\\[\\text{MTPA:}\\quad \\operatorname{Re}(\\psi_a \\cdot i_s^*) = 0\\]<\/div>\n<p>\u7c7b\u4f3c\u5730\uff0cMTPV \u5f15\u5165<strong>\u8f85\u52a9\u7535\u6d41<\/strong> <span class=\"math-inline\">&#092;(i_a&#092;)<\/span>\uff08motulator \u6e90\u7801\u4e2d\u540d\u4e3a <code>i_a_dq<\/code>\uff09\uff0c\u5c06\u6761\u4ef6\u5199\u6210\u5bf9\u5076\u5f62\u5f0f\uff1a<\/p>\n<div class=\"math-display\">\\[\\boxed{\\text{MTPV:}\\quad \\operatorname{Re}(i_a \\cdot \\psi_s^*) = 0}\\]<\/div>\n<p>\u5728 <code>_parameters.py<\/code> \u7684 <code>aux_current()<\/code> \u65b9\u6cd5\u4e2d\uff1a<\/p>\n<pre><code class=\"language-python line-numbers\">def aux_current(self, i_s_dq):\n    L_s = self.incr_ind_mat(i_s_dq)\n    inv_L_s = np.linalg.inv(L_s)\n    G_dd, G_dq, G_qq = inv_L_s[0,0], inv_L_s[0,1], inv_L_s[1,1]\n    psi_s_dq = self.psi_s_dq(i_s_dq)\n    return (\n        (G_qq * np.real(psi_s_dq) + 1j * G_dd * np.imag(psi_s_dq))\n        - 1j * G_dq * np.conj(psi_s_dq)\n        - i_s_dq\n    )\n<\/code><\/pre>\n<h3>3.4 \u7ebf\u6027\u4e0d\u9971\u548c\u7535\u673a\u7279\u4f8b<\/h3>\n<p>\u5f53 <span class=\"math-inline\">&#092;(L_{dq}=0&#092;)<\/span>\uff0c<span class=\"math-inline\">&#092;(L_{dd}=L_d&#092;)<\/span>\uff0c<span class=\"math-inline\">&#092;(L_{qq}=L_q&#092;)<\/span> \u65f6\uff1a<\/p>\n<div class=\"math-display\">\\[i_a = \\frac{\\psi_d}{L_q} + j\\frac{\\psi_q}{L_d} &#8211; i_s\\]<\/div>\n<p>\u4ee3\u5165 <span class=\"math-inline\">&#092;(\\psi_d = L_d i_d + \\psi_f&#092;)<\/span>\uff0c<span class=\"math-inline\">&#092;(\\psi_q = L_q i_q&#092;)<\/span>\uff1a<\/p>\n<p><span class=\"katex math multi-line\">\\begin{aligned}<br \/>\ni_a &amp;= \\frac{L_d i_d + \\psi_f}{L_q} + j\\frac{L_q i_q}{L_d} &#8211; i_d &#8211; j i_q &#092;<br \/>\n    &amp;= \\frac{\\psi_f}{L_q} + i_d\\left(\\frac{L_d}{L_q}-1\\right) + j i_q\\left(\\frac{L_q}{L_d}-1\\right)<br \/>\n\\end{aligned}<\/span><\/p>\n<p>MTPV \u6761\u4ef6 <span class=\"math-inline\">&#092;(\\operatorname{Re}(i_a \\cdot \\psi_s^*) = 0&#092;)<\/span> \u5c55\u5f00\u4e3a\uff1a<\/p>\n<div class=\"math-display\">\\[\\left[\\psi_f + i_d(L_d-L_q)\\right](L_d i_d + \\psi_f) + i_q^2 (L_q-L_d)L_q = 0\\]<\/div>\n<p>\u6574\u7406\u540e\u6b63\u662f IPMSM \u7684\u7ecf\u5178 MTPV \u53cc\u66f2\u7ebf\u65b9\u7a0b\uff1a<\/p>\n<div class=\"math-display\">\\[\\psi_f i_d + (L_d-L_q)i_d^2 = \\frac{L_q-L_d}{L_q}\\psi_q^2\\]<\/div>\n<p>\u6216\u5199\u6210\uff1a<\/p>\n<div class=\"math-display\">\\[\\psi_d \\left[\\psi_f + i_d(L_d-L_q)\\right] = \\psi_q^2 \\frac{L_d-L_q}{L_q}\\]<\/div>\n<h3>3.5 MTPV \u8f68\u8ff9\u9884\u8ba1\u7b97<\/h3>\n<pre><code class=\"language-python line-numbers\"># _sm_control_loci.py\nclass ControlLoci:\n    def compute_mtpv_flux_angle(self, psi_s_abs: float) -&gt; float:\n        def mtpv_cond(delta: float) -&gt; float:\n            psi_s_dq = psi_s_abs * np.exp(1j * delta)\n            i_s_dq = self.par.iterate_i_s_dq(psi_s_dq)\n            i_a_dq = self.par.aux_current(i_s_dq)\n            return np.real(i_a_dq * np.conj(psi_s_dq))\n\n        delta_range = (0.5 * np.pi, np.pi)\n        if mtpv_cond(delta_range[0]) * mtpv_cond(delta_range[1]) &gt; 0:\n            return np.nan  # \u4e0d\u5b58\u5728 MTPV\uff08\u5982\u8868\u8d34\u5f0f\u7535\u673a L_d=L_q\uff09\n        return root_scalar(mtpv_cond, bracket=delta_range, method=\"brentq\").root\n\n    def compute_mtpv_locus(self, psi_s_max: float, num: int = 16) -&gt; MTPVLocus:\n        flux_magnitudes = np.linspace(0, psi_s_max, num)\n        delta = np.zeros_like(flux_magnitudes)\n        for idx, psi_s_abs in enumerate(flux_magnitudes):\n            delta[idx] = self.compute_mtpv_flux_angle(float(psi_s_abs))\n        psi_s_dq = flux_magnitudes * np.exp(1j * delta)\n        i_s_dq = np.array([self.par.iterate_i_s_dq(psi) for psi in psi_s_dq])\n        tau_M = 1.5 * self.par.n_p * np.imag(i_s_dq * np.conj(psi_s_dq))\n        return MTPVLocus(\n            psi_s_dq=psi_s_dq, i_s_dq=i_s_dq, tau_M=tau_M,\n            tau_M_vs_psi_s_abs=lambda x: np.interp(x, abs(psi_s_dq), tau_M),\n            i_s_dq_vs_psi_s_abs=lambda x: np.interp(x, abs(psi_s_dq), i_s_dq),\n        )\n<\/code><\/pre>\n<hr \/>\n<h2>4. \u53c2\u8003\u6307\u4ee4\u751f\u6210\u6d41\u7a0b\u4e0e\u4ee3\u7801\u5206\u6790<\/h2>\n<h3>4.1 \u4e94\u6b65\u5207\u6362\u94fe\uff1a<code>compute_flux_and_torque_refs()<\/code><\/h3>\n<pre><code class=\"language-python line-numbers\">def compute_flux_and_torque_refs(self, tau_M_ref, w_m, u_dc):\n    # Step 1: MTPA \u78c1\u94fe\n    psi_s_abs_mtpa = abs(self._get_mtpa_flux(tau_M_ref))\n\n    # Step 2: \u78c1\u94fe\u9650\u5e45\n    psi_s_abs_ref = clip(psi_s_abs_mtpa, psi_s_min, psi_s_max)\n\n    # Step 3: \u7535\u538b\u6781\u9650\u5f31\u78c1\n    psi_s_max_voltage = u_s_max \/ abs(w_m)\n    psi_s_abs_ref = min(psi_s_abs_ref, psi_s_max_voltage)\n\n    # Step 4: \u7535\u6d41\u6781\u9650\u8f6c\u77e9\u622a\u65ad\n    tau_M_cl = self._get_current_limit_torque(psi_s_abs_ref)\n    tau_M_ref = min(tau_M_cl, abs(tau_M_ref)) * sign(tau_M_ref)\n\n    # Step 5: MTPV \u6781\u9650\n    psi_s_mtpv, tau_M_mtpv = self._get_mtpv_flux_and_torque(psi_s_abs_ref)\n    if tau_M_mtpv &gt; 0:\n        tau_M_ref = min(k_mtpv * tau_M_mtpv, abs(tau_M_ref)) * sign(tau_M_ref)\n\n    return psi_s_abs_ref, tau_M_ref\n<\/code><\/pre>\n<h3>4.2 \u5404\u6b65\u9aa4\u7684\u7269\u7406\u610f\u4e49\u4e0e\u5207\u6362\u6761\u4ef6<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u6b65\u9aa4<\/th>\n<th align=\"left\">\u64cd\u4f5c<\/th>\n<th align=\"left\">\u7269\u7406\u610f\u4e49<\/th>\n<th align=\"left\">\u5207\u6362\u5224\u636e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><strong>1<\/strong><\/td>\n<td align=\"left\"><code>psi_s_abs_mtpa = abs(psi_s_mtpa(tau_M_ref))<\/code><\/td>\n<td align=\"left\">\u6309 MTPA \u66f2\u7ebf\u8ba1\u7b97\u76ee\u6807\u78c1\u94fe<\/td>\n<td align=\"left\">\u9ed8\u8ba4\u4f18\u5148 MTPA<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>2<\/strong><\/td>\n<td align=\"left\"><code>clip(psi_s, psi_s_min, psi_s_max)<\/code><\/td>\n<td align=\"left\">\u78c1\u94fe\u786c\u9650\u5e45<\/td>\n<td align=\"left\">\u82e5 <span class=\"math-inline\">&#092;(\\psi_{s,\\text{MTPA}} \\lt \\psi_{s,\\min}&#092;)<\/span> \u6216 <span class=\"math-inline\">&#092;(\\gt \\psi_{s,\\max}&#092;)<\/span><\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>3<\/strong><\/td>\n<td align=\"left\"><code>min(psi_s, psi_s_max_voltage)<\/code><\/td>\n<td align=\"left\"><strong>\u7535\u538b\u6781\u9650\u5f31\u78c1<\/strong>\uff1a\u8f6c\u901f\u5347\u9ad8\u5bfc\u81f4 <span class=\"math-inline\">&#092;(\\psi_{s,\\max} = u_{s,\\max}\/\\omega&#092;)<\/span> \u51cf\u5c0f<\/td>\n<td align=\"left\">\u5f53 <span class=\"math-inline\">&#092;(\\omega \\gt u_{s,\\max}\/\\psi_{s,\\text{MTPA}}&#092;)<\/span> \u65f6\u89e6\u53d1<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>4<\/strong><\/td>\n<td align=\"left\"><code>min(tau_cl, \\|tau_{ref}\\|) * sign<\/code><\/td>\n<td align=\"left\"><strong>\u7535\u6d41\u6781\u9650<\/strong>\uff1a\u7ed9\u5b9a\u78c1\u94fe\u4e0b\u67e5\u7535\u6d41\u6781\u9650\u5706\u7684\u6700\u5927\u8f6c\u77e9<\/td>\n<td align=\"left\">\u5f53\u6240\u9700\u8f6c\u77e9\u8d85\u51fa\u7535\u6d41\u5706\u4e0e\u7535\u538b\u5706\u4ea4\u96c6\u65f6\u89e6\u53d1<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>5<\/strong><\/td>\n<td align=\"left\"><code>min(k_{mtpv} * tau_{mtpv}, \\|tau_{ref}\\|) * sign<\/code><\/td>\n<td align=\"left\"><strong>MTPV \u6781\u9650<\/strong>\uff1a\u8fdb\u4e00\u6b65\u9650\u5236\u5230 MTPV \u8f68\u8ff9\u5bf9\u5e94\u7684\u8f6c\u77e9<\/td>\n<td align=\"left\">\u5f53\u5de5\u4f5c\u70b9\u8d8a\u8fc7 MTPV \u8f68\u8ff9\u65f6\u89e6\u53d1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote><p>\n  <strong>\u5173\u4e8e Step 2 \u7684\u8865\u5145\u8bf4\u660e<\/strong>\uff1a<code>clip<\/code> \u7684\u4e0a\u4e0b\u9650\u7531 <code>psi_s_limits = (psi_s_min, psi_s_max)<\/code> \u51b3\u5b9a\u3002\u672c\u4eff\u771f\u4e2d <code>psi_s_min = psi_f<\/code> <span class=\"math-inline\">&#092;(\\approx 0.1333&#092;)<\/span> Vs<code>\uff08\u9ed8\u8ba4\u503c\uff0c\u7b49\u4e8e\u6c38\u78c1\u4f53\u78c1\u94fe\uff09\uff0c<\/code>psi_s_max = inf`\uff08\u672a\u8bbe\u4e0a\u9650\uff09\u3002\u7531\u4e8e\u6b64 IPMSM \u5728\u6b63\u8f6c\u77e9\u533a\u7684 MTPA \u78c1\u94fe\u59cb\u7ec8\u4e0d\u4f4e\u4e8e <span class=\"math-inline\">&#092;(\\psi_f&#092;)<\/span>\uff0c\u4e14\u4e0a\u9650\u65e0\u754c\uff0cStep 2 \u5728\u672c\u6b21\u4eff\u771f\u4e2d\u672a\u5b9e\u9645\u89e6\u53d1\uff0c\u4f46\u5176\u4f5c\u4e3a\u5b89\u5168\u515c\u5e95\u7684\u9650\u5e45\u903b\u8f91\u4ecd\u4fdd\u7559\u5728\u4ee3\u7801\u4e2d\u3002\n<\/p><\/blockquote>\n<h3>4.3 \u6e10\u8fdb\u5f0f\u7ea6\u675f\u673a\u5236<\/h3>\n<p>motulator \u4f7f\u7528 <code>clip<\/code> + <code>min<\/code> \u7684\u7ec4\u5408\u5b9e\u73b0<strong>\u6e10\u8fdb\u5f0f\u7ea6\u675f<\/strong>\uff0c\u800c\u975e\u786c\u5207\u6362\uff1a<\/p>\n<ol>\n<li><strong>\u65e0\u4f18\u5148\u7ea7\u51b2\u7a81<\/strong>\uff1a\u6bcf\u4e2a\u7ea6\u675f\u72ec\u7acb\u65bd\u52a0\uff0c\u540e\u4e00\u6b65\u7684\u8f93\u5165\u662f\u524d\u4e00\u6b65\u7684\u8f93\u51fa<\/li>\n<li><strong>\u81ea\u52a8\u8fc7\u6e21<\/strong>\uff1a\u5f53\u8f6c\u901f\u4ece\u4f4e\u5230\u9ad8\u53d8\u5316\u65f6\uff0cStep 3 \u7684 <code>psi_s_max_voltage<\/code> \u81ea\u7136\u51cf\u5c0f\uff0cMTPA \u78c1\u94fe\u9010\u6e10\u88ab&#8221;\u538b&#8221;\u5230\u7535\u538b\u6781\u9650\u4ee5\u4e0b<\/li>\n<li><strong>MTPV \u662f\u6700\u540e\u7684\u8f6c\u77e9\u8f6f\u4e0a\u9650<\/strong>\uff1a\u5373\u4f7f\u78c1\u94fe\u88ab\u7535\u538b\u9650\u5236\u4f4f\uff0c\u8f6c\u77e9\u8fd8\u53ef\u80fd\u53d7 MTPV \u7ea6\u675f\u8fdb\u4e00\u6b65\u4e0b\u964d<\/li>\n<\/ol>\n<h3>4.4 <code>_get_mtpv_flux_and_torque()<\/code> \u7684 LUT \u67e5\u8868<\/h3>\n<pre><code class=\"language-python line-numbers\">def _get_mtpv_flux_and_torque(self, psi_s_abs_ref):\n    i_s = self.i_s_mtpv(psi_s_abs_ref)      # LUT \u63d2\u503c\u67e5\u7535\u6d41\n    psi_s = complex(self.par.psi_s_dq(i_s)) # \u7535\u6d41\u2192\u78c1\u94fe\n    tau_M = 1.5 * self.par.n_p * (i_s * psi_s.conjugate()).imag\n    return psi_s, tau_M\n<\/code><\/pre>\n<p>\u6ce8\u610f\uff1a\u8fd9\u91cc\u4ee5 <strong><span class=\"math-inline\">&#092;(\\psi_s&#092;)<\/span> \u5e45\u503c<\/strong> \u4e3a\u81ea\u53d8\u91cf\u67e5 MTPV \u7535\u6d41\u8868\uff0c\u518d\u53cd\u7b97\u78c1\u94fe\u548c\u8f6c\u77e9\u3002\u5982\u679c\u8bf7\u6c42\u70b9 <span class=\"math-inline\">&#092;(\\psi_{s,\\text{ref}}&#092;)<\/span> \u8d85\u51fa\u4e86\u9884\u8ba1\u7b97\u7684 MTPV \u8868\u8303\u56f4\uff0c\u63d2\u503c\u5668\u4f1a\u5916\u63a8\uff0c\u4f46\u5b9e\u9645\u4e2d Step 3 \u5df2\u5c06\u78c1\u94fe\u9650\u5236\u5728\u5408\u7406\u8303\u56f4\u5185\u3002<\/p>\n<hr \/>\n<h2>5. FluxTorqueControl \u6d41\u7a0b\u4e0e\u4ee3\u7801\u5206\u6790<\/h2>\n<p><code>FluxVectorController<\/code> \u7684\u6838\u5fc3\u7531\u4e24\u4e2a\u5b50\u6a21\u5757\u7ec4\u6210\uff1a<code>ReferenceGenerator<\/code>\uff08\u7b2c 4 \u8282\uff09\u8d1f\u8d23\u751f\u6210\u53d7\u9650\u7684\u78c1\u94fe\/\u8f6c\u77e9\u53c2\u8003\u503c\uff0c<code>FluxTorqueController<\/code> \u8d1f\u8d23\u5c06\u53c2\u8003\u503c\u8f6c\u5316\u4e3a\u7535\u538b\u6307\u4ee4\u3002\u672c\u8282\u5206\u6790\u540e\u8005\u7684\u6570\u5b66\u539f\u7406\u4e0e\u4ee3\u7801\u5b9e\u73b0\u3002<\/p>\n<h3>5.1 \u6574\u4f53\u67b6\u6784<\/h3>\n<p><code>FluxVectorController.compute_output()<\/code> \u7684\u8c03\u7528\u94fe\uff1a<\/p>\n<pre><code class=\"line-numbers\">tau_M_ref \u2192 ReferenceGenerator.compute_flux_and_torque_refs()\n                \u2192 psi_s_ref, tau_M_ref (\u5df2\u9650\u5e45)\n          \u2192 FluxTorqueController.compute_output(psi_s_ref, tau_M_ref, fbk)\n                \u2192 u_s_ref (\u7535\u538b\u53c2\u8003\u77e2\u91cf)\n<\/code><\/pre>\n<pre><code class=\"language-python line-numbers\"># _sm_flux_vector.py\nclass FluxVectorController:\n    def compute_output(self, tau_M_ref: float, fbk: ObserverOutputs) -&gt; References:\n        ref = References(T_s=self.T_s, tau_M=tau_M_ref)\n        ref.psi_s, ref.tau_M = self.reference_gen.compute_flux_and_torque_refs(\n            ref.tau_M, fbk.w_m, fbk.u_dc\n        )\n        ref.u_s = self.flux_torque_ctrl.compute_output(ref.psi_s, ref.tau_M, fbk)\n        return ref\n<\/code><\/pre>\n<h3>5.2 <code>FluxTorqueController.compute_output()<\/code><\/h3>\n<p>\u8be5\u65b9\u6cd5\u57fa\u4e8e<strong>\u8f93\u5165-\u8f93\u51fa\u7ebf\u6027\u5316<\/strong>\uff08input-output linearization\uff09\u601d\u60f3\uff0c\u5206\u522b\u5bf9\u78c1\u94fe\u5e45\u503c\u548c\u7535\u78c1\u8f6c\u77e9\u6784\u9020\u89e3\u8026\u7684\u63a7\u5236\u5f8b\u3002<\/p>\n<pre><code class=\"language-python line-numbers\">class FluxTorqueController:\n    def compute_output(self, psi_s_ref, tau_M_ref, fbk):\n        par = self.par\n        gain = self.gain\n\n        # \u8f85\u52a9\u7535\u6d41\u4e0e\u8f6c\u77e9\u4ea7\u751f\u56e0\u5b50\n        i_a = complex(par.aux_current(fbk.i_s))\n        c_tau = 1.5 * par.n_p * (i_a * fbk.psi_s.conjugate()).real\n\n        # \u63a7\u5236\u65b9\u5411\u5411\u91cf\n        t_psi = 1.5 * par.n_p * abs(fbk.psi_s) * i_a \/ c_tau if c_tau &gt; 0 else 1\n        t_tau = 1j * fbk.psi_s \/ c_tau if c_tau &gt; 0 else 0\n\n        # \u8bef\u5dee\u4fe1\u53f7\n        e_psi = psi_s_ref - abs(fbk.psi_s)\n        e_tau = tau_M_ref - fbk.tau_M\n        e_u = gain.alpha_psi * e_psi * t_psi + gain.alpha_tau * e_tau * t_tau\n        u_i = self.x_psi * t_psi + self.x_tau * t_tau\n        e_v = u_i - gain.alpha_i * (abs(fbk.psi_s) * t_psi + fbk.tau_M * t_tau)\n\n        # \u7535\u538b\u53c2\u8003 = \u524d\u9988 + \u53cd\u9988\n        v = par.R_s * fbk.i_s + 1j * fbk.w_m * fbk.psi_s + e_v\n        u_s_ref = v + e_u\n\n        self._i_a = i_a\n        self._v = v\n        return u_s_ref\n<\/code><\/pre>\n<p><strong>\u5173\u952e\u53d8\u91cf\u89e3\u6790<\/strong>\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u53d8\u91cf<\/th>\n<th align=\"left\">\u6570\u5b66\u542b\u4e49<\/th>\n<th align=\"left\">\u7269\u7406\u610f\u4e49<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><code>i_a<\/code><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(i_a = \\text{aux&#095;current}(i_s)&#092;)<\/span><\/td>\n<td align=\"left\">\u8f85\u52a9\u7535\u6d41\uff08\u89c1\u7b2c 3.3 \u8282\uff09<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>c_tau<\/code><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(c_\\tau = 1.5 n_p \\operatorname{Re}(i_a \\psi_s^*)&#092;)<\/span><\/td>\n<td align=\"left\">\u8f6c\u77e9\u5bf9\u7535\u538b\u65b9\u5411\u7684\u654f\u611f\u5ea6<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>t_psi<\/code><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(t_\\psi&#092;)<\/span><\/td>\n<td align=\"left\">\u78c1\u94fe\u5e45\u503c\u7684\u63a7\u5236\u65b9\u5411<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>t_tau<\/code><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(t_\\tau&#092;)<\/span><\/td>\n<td align=\"left\">\u7535\u78c1\u8f6c\u77e9\u7684\u63a7\u5236\u65b9\u5411<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>e_u<\/code><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\alpha_\\psi e_\\psi t_\\psi + \\alpha_\\tau e_\\tau t_\\tau&#092;)<\/span><\/td>\n<td align=\"left\">\u6bd4\u4f8b\u63a7\u5236\u5f8b<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>u_i<\/code><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(u_i = x_\\psi t_\\psi + x_\\tau t_\\tau&#092;)<\/span><\/td>\n<td align=\"left\">\u79ef\u5206\u4f5c\u7528\u8f93\u51fa<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>v<\/code><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(v = R_s i_s + j\\omega_m \\psi_s + e_v&#092;)<\/span><\/td>\n<td align=\"left\">\u7a33\u6001\u524d\u9988 + \u79ef\u5206\u4fee\u6b63<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u65b9\u5411\u5411\u91cf\u7684\u63a8\u5bfc<\/strong>\uff1a<\/p>\n<p>\u78c1\u94fe\u5e45\u503c <span class=\"math-inline\">&#092;(|\\psi_s|&#092;)<\/span> \u548c\u8f6c\u77e9 <span class=\"math-inline\">&#092;(\\tau_M&#092;)<\/span> \u5bf9\u7535\u538b\u77e2\u91cf\u7684\u53d8\u5316\u7387\u53ef\u901a\u8fc7\u8f85\u52a9\u7535\u6d41 <span class=\"math-inline\">&#092;(i_a&#092;)<\/span> \u8868\u8fbe\uff1a<\/p>\n<ul>\n<li>\u78c1\u94fe\u65b9\u5411\uff1a<span class=\"math-inline\">&#092;(t_\\psi \\propto i_a&#092;)<\/span>\uff08\u4e0e\u8f85\u52a9\u7535\u6d41\u540c\u5411\uff09<\/li>\n<li>\u8f6c\u77e9\u65b9\u5411\uff1a<span class=\"math-inline\">&#092;(t_\\tau \\propto j\\psi_s&#092;)<\/span>\uff08\u4e0e\u78c1\u94fe\u6b63\u4ea4\uff09<\/li>\n<\/ul>\n<p>\u4e24\u8005\u7684\u70b9\u79ef\u6ee1\u8db3 <span class=\"math-inline\">&#092;(t_\\psi \\cdot t_\\tau^* = 0&#092;)<\/span>\uff0c\u5b9e\u73b0\u4e86\u89e3\u8026\u63a7\u5236\u3002<\/p>\n<h3>5.3 <code>FluxTorqueController.update()<\/code><\/h3>\n<p>\u79ef\u5206\u72b6\u6001\u66f4\u65b0\u91c7\u7528\u89c2\u6d4b\u5668\u7535\u538b\u4e0e\u5b9e\u9645\u8f93\u51fa\u7535\u538b\u7684\u8bef\u5dee\u9a71\u52a8\uff1a<\/p>\n<pre><code class=\"language-python line-numbers\">def update(self, T_s: float, fbk: ObserverOutputs) -&gt; None:\n    par = self.par\n    gain = self.gain\n    e = fbk.u_s - self._v                    # \u7535\u538b\u8bef\u5dee\n    k_psi = gain.alpha_i \/ abs(fbk.psi_s) if abs(fbk.psi_s) &gt; 0 else 0\n    k_tau = 1.5 * par.n_p * gain.alpha_i\n    self.x_psi += T_s * k_psi * (fbk.psi_s * e.conjugate()).real\n    self.x_tau += T_s * k_tau * (1j * self._i_a * e.conjugate()).real\n<\/code><\/pre>\n<p>\u79ef\u5206\u589e\u76ca <span class=\"math-inline\">&#092;(k_\\psi&#092;)<\/span> \u548c <span class=\"math-inline\">&#092;(k_\\tau&#092;)<\/span> \u5206\u522b\u4e0e\u78c1\u94fe\u5e45\u503c\u548c\u8f85\u52a9\u7535\u6d41\u7684\u5185\u79ef\u76f8\u5173\uff0c\u4fdd\u8bc1\u79ef\u5206\u4f5c\u7528\u4ec5\u5728\u5bf9\u5e94\u7684\u65b9\u5411\u4e0a\u7d2f\u79ef\u3002<\/p>\n<hr \/>\n<h2>6. \u4eff\u771f\u9a8c\u8bc1\u4e0e\u5206\u6790<\/h2>\n<p>\u4ee5\u4e0b\u901a\u8fc7 motulator \u5bf9\u4e00\u53f0\u5185\u7f6e\u5f0f\u6c38\u78c1\u540c\u6b65\u7535\u673a (IPMSM) \u8fdb\u884c 3600 rpm \u98ce\u673a\u8d1f\u8f7d\u4eff\u771f\uff0c\u5c06\u5b9e\u9645\u7535\u6d41\u8f68\u8ff9\u7ed8\u5236\u5728 <span class=\"math-inline\">&#092;(i_d&#092;)<\/span>&#8211;<span class=\"math-inline\">&#092;(i_q&#092;)<\/span> \u5e73\u9762\u4e0a\uff0c\u5e76\u901a\u8fc7<strong>\u8f68\u8ff9\u7740\u8272<\/strong>\u76f4\u89c2\u5c55\u793a\u63a7\u5236\u5668\u5728 MTPA \u2192 \u5f31\u78c1 \u2192 MTPV \u5404\u6a21\u5f0f\u95f4\u7684\u5b9e\u65f6\u5207\u6362\u8fc7\u7a0b\u3002<\/p>\n<h3>6.1 \u4eff\u771f\u8bbe\u7f6e<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u53c2\u6570<\/th>\n<th align=\"left\">\u6570\u503c<\/th>\n<th align=\"left\">\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u989d\u5b9a\u8f6c\u901f<\/td>\n<td align=\"left\">3600 rpm<\/td>\n<td align=\"left\">\u98ce\u673a\u8d1f\u8f7d\u7684\u989d\u5b9a\u5de5\u4f5c\u70b9<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b<\/td>\n<td align=\"left\">180 V \/ 150 V<\/td>\n<td align=\"left\">\u4e24\u7ec4\u5bf9\u6bd4\u5de5\u51b5<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u6d41\u6781\u9650 <span class=\"math-inline\">&#092;(I_{s,\\max}&#092;)<\/span><\/td>\n<td align=\"left\">58 A (<span class=\"math-inline\">&#092;(\\approx&#092;)<\/span>2.0 pu)<\/td>\n<td align=\"left\">\u9ed1\u8272\u5b9e\u7ebf\u5706<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u538b\u5229\u7528\u7cfb\u6570 <span class=\"math-inline\">&#092;(k_u&#092;)<\/span><\/td>\n<td align=\"left\">0.9<\/td>\n<td align=\"left\">\u7535\u538b\u6781\u9650\u692d\u5706\u6309 <span class=\"math-inline\">&#092;(u_{s,\\max}=k_u u_{dc}\/\\sqrt{3}&#092;)<\/span> \u8ba1\u7b97<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u8d1f\u8f7d\u7c7b\u578b<\/td>\n<td align=\"left\">\u5e73\u65b9\u5f8b\u98ce\u673a\u8d1f\u8f7d<\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\tau_L \\propto \\omega_m^2&#092;)<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4eff\u771f\u4ece\u9759\u6b62\u542f\u52a8\uff0c0.1 s \u540e\u8f6c\u901f\u7ed9\u5b9a\u9636\u8dc3\u81f3 3600 rpm\u3002\u63a7\u5236\u5668\u91c7\u7528\u4e94\u6b65\u53c2\u8003\u751f\u6210\u94fe\uff08\u7b2c 4 \u8282\uff09\uff0c\u5305\u542b MTPA\u3001\u7535\u538b\u6781\u9650\u5f31\u78c1\u3001\u7535\u6d41\u6781\u9650\u622a\u65ad\u548c MTPV \u6781\u9650\u3002<\/p>\n<h3>6.2 \u65f6\u57df\u4eff\u771f\u6ce2\u5f62\u4e0e <span class=\"math-inline\">&#092;(i_d&#092;)<\/span>&#8211;<span class=\"math-inline\">&#092;(i_q&#092;)<\/span> \u8f68\u8ff9\u5206\u6790<\/h3>\n<p>\u9996\u5148\uff0c\u4e0b\u9762\u4e24\u56fe\u5206\u522b\u5c55\u793a\u4e86\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b <span class=\"math-inline\">&#092;(V_{\\mathrm{dc}} = 180\\,\\mathrm{V}&#092;)<\/span>\uff08\u6807\u79f0\uff09\u548c <span class=\"math-inline\">&#092;(V_{\\mathrm{dc}} = 150\\,\\mathrm{V}&#092;)<\/span>\uff08\u964d\u4f4e\uff09\u4e0b\u7684\u65f6\u57df\u4eff\u771f\u6ce2\u5f62\u3002\u6bcf\u7ec4\u6ce2\u5f62\u5305\u542b\u8f6c\u901f\u3001\u7535\u78c1\u8f6c\u77e9\u3001<span class=\"math-inline\">&#092;(d&#092;)<\/span>\/<span class=\"math-inline\">&#092;(q&#092;)<\/span> \u8f74\u7535\u6d41\u3001\u5b9a\u5b50\u7535\u538b\u5e45\u503c\u3001\u78c1\u94fe\u5e45\u503c\u4ee5\u53ca\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b\u6807\u5e7a\u503c\u516d\u4e2a\u5b50\u56fe\u3002<\/p>\n<figure style=\"margin: 1em 0;text-align: center\"><img decoding=\"async\" src=\"http:\/\/bluespider.top\/wp-content\/uploads\/2026\/04\/waveforms_vdc180-6.png\" alt=\"\u65f6\u57df\u4eff\u771f\u6ce2\u5f62 &#092;(V_{\\mathrm{dc}} = 180\\,\\mathrm{V}&#092;)\" style=\"max-width: 100%;height: auto\"><\/figure>\n<p><em>\u56fe\uff1a\u6807\u79f0\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b\uff08<span class=\"math-inline\">&#092;(V_{\\mathrm{dc}} = 180\\,\\mathrm{V}&#092;)<\/span>\uff09\u4e0b\u7684\u65f6\u57df\u4eff\u771f\u6ce2\u5f62\u3002<span class=\"math-inline\">&#092;(V_{\\mathrm{dc},\\,\\mathrm{nom}}&#092;)<\/span> \u6807\u5e7a\u503c\u4e3a 1.0\u3002<\/em><\/p>\n<figure style=\"margin: 1em 0;text-align: center\"><img decoding=\"async\" src=\"http:\/\/bluespider.top\/wp-content\/uploads\/2026\/04\/waveforms_vdc150-6.png\" alt=\"\u65f6\u57df\u4eff\u771f\u6ce2\u5f62 &#092;(V_{\\mathrm{dc}} = 150\\,\\mathrm{V}&#092;)\" style=\"max-width: 100%;height: auto\"><\/figure>\n<p><em>\u56fe\uff1a\u964d\u4f4e\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b\uff08<span class=\"math-inline\">&#092;(V_{\\mathrm{dc}} = 150\\,\\mathrm{V}&#092;)<\/span>\uff09\u4e0b\u7684\u65f6\u57df\u4eff\u771f\u6ce2\u5f62\u3002<span class=\"math-inline\">&#092;(V_{\\mathrm{dc},\\,\\mathrm{nom}}&#092;)<\/span> \u6807\u5e7a\u503c\u4e3a <span class=\"math-inline\">&#092;(150\/180 \\approx 0.833&#092;)<\/span>\u3002\u7531\u4e8e\u53ef\u7528\u7535\u538b\u4e0b\u964d\uff0c\u7a33\u6001\u78c1\u94fe\u88ab\u8fdb\u4e00\u6b65\u538b\u4f4e\uff0c\u5f31\u78c1\u6df1\u5ea6\u589e\u52a0\u3002<\/em><\/p>\n<hr \/>\n<p>\u4e0b\u56fe\u5206\u522b\u5c55\u793a\u4e86\u4e24\u79cd\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b\u4e0b\u7684 <span class=\"math-inline\">&#092;(i_d&#092;)<\/span>&#8211;<span class=\"math-inline\">&#092;(i_q&#092;)<\/span> \u8f68\u8ff9\uff0c\u5176\u4e2d<strong>\u8f68\u8ff9\u6309\u63a7\u5236\u5668 active mode \u5206\u6bb5\u7740\u8272<\/strong>\uff1a<\/p>\n<figure style=\"margin: 1em 0;text-align: center\"><img decoding=\"async\" src=\"http:\/\/bluespider.top\/wp-content\/uploads\/2026\/04\/mtpv_analysis_vdc180-5.png\" alt=\"MTPV \u4eff\u771f\u8f68\u8ff9\u5206\u6790 &#092;(V_{\\mathrm{dc}} = 180\\,\\mathrm{V}&#092;)\" style=\"max-width: 100%;height: auto\"><\/figure>\n<p><em>\u56fe\uff1a\u6807\u79f0\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b\uff08<span class=\"math-inline\">&#092;(V_{\\mathrm{dc}} = 180\\,\\mathrm{V}&#092;)<\/span>\uff09\u4e0b\u7684 <span class=\"math-inline\">&#092;(i_d&#092;)<\/span>&#8211;<span class=\"math-inline\">&#092;(i_q&#092;)<\/span> \u8f68\u8ff9\u3002<\/em><\/p>\n<figure style=\"margin: 1em 0;text-align: center\"><img decoding=\"async\" src=\"http:\/\/bluespider.top\/wp-content\/uploads\/2026\/04\/mtpv_analysis_vdc150-5.png\" alt=\"MTPV \u4eff\u771f\u8f68\u8ff9\u5206\u6790 &#092;(V_{\\mathrm{dc}} = 150\\,\\mathrm{V}&#092;)\" style=\"max-width: 100%;height: auto\"><\/figure>\n<p><em>\u56fe\uff1a\u964d\u4f4e\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b\uff08<span class=\"math-inline\">&#092;(V_{\\mathrm{dc}} = 150\\,\\mathrm{V}&#092;)<\/span>\uff09\u4e0b\u7684 <span class=\"math-inline\">&#092;(i_d&#092;)<\/span>&#8211;<span class=\"math-inline\">&#092;(i_q&#092;)<\/span> \u8f68\u8ff9\u3002\u7535\u538b\u692d\u5706\u6574\u4f53\u7f29\u5c0f\uff0c\u5f31\u78c1\u8d77\u59cb\u70b9\u66f4\u65e9\uff0c\u7a33\u6001\u5de5\u4f5c\u70b9\u66f4\u9760\u8fd1\u7535\u6d41\u6781\u9650\u5706\u4e0e MTPV \u6781\u9650\u7684\u4ea4\u96c6\u3002<\/em><\/p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u989c\u8272<\/th>\n<th align=\"left\">\u6a21\u5f0f<\/th>\n<th align=\"left\">\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u9752\u8272<\/td>\n<td align=\"left\"><strong>MTPA<\/strong><\/td>\n<td align=\"left\">\u65e0\u7ea6\u675f\uff0c\u6309 MTPA \u66f2\u7ebf\u67e5\u8868<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u6a59\u8272<\/td>\n<td align=\"left\"><strong>Voltage weakening<\/strong><\/td>\n<td align=\"left\">\u7535\u538b\u6781\u9650\u5bfc\u81f4\u78c1\u94fe\u88ab\u538b\u4f4e<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7ea2\u8272<\/td>\n<td align=\"left\"><strong>Current limit<\/strong><\/td>\n<td align=\"left\">\u7535\u6d41\u6781\u9650\u5bfc\u81f4\u8f6c\u77e9\u88ab\u622a\u65ad<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u54c1\u7ea2\u8272<\/td>\n<td align=\"left\"><strong>MTPV limit<\/strong><\/td>\n<td align=\"left\">MTPV \u8f68\u8ff9\u5bfc\u81f4\u8f6c\u77e9\u8fdb\u4e00\u6b65\u53d7\u9650<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote><p>\n  <strong>\u6ce8<\/strong>\uff1a\u672c\u6b21\u4eff\u771f\u4e2d <strong>Mode 2\uff08Flux limit\uff0c\u91d1\u8272\uff09\u672a\u89e6\u53d1<\/strong>\u3002\u539f\u56e0\u662f\u63a7\u5236\u5668\u914d\u7f6e\u4e2d <code>psi_s_min = psi_f \\approx 0.1333$ Vs<\/code>\uff08\u6c38\u78c1\u4f53\u78c1\u94fe\uff09\uff0c\u800c\u6b64 IPMSM \u5728 MTPA \u4e0b\u7684\u78c1\u94fe\u5e45\u503c\u59cb\u7ec8\u4e0d\u4f4e\u4e8e\u8be5\u4e0b\u9650\uff1b\u540c\u65f6 <code>psi_s_max = \\infty$<\/code>\uff0c\u4e0a\u9650\u4ea6\u65e0\u7ea6\u675f\u3002\u56e0\u6b64\u4e94\u6b65\u94fe\u5b9e\u9645\u8868\u73b0\u4e3a&#8221;\u56db\u6b65&#8221;\u53ef\u89c1\uff0c\u4f46 Step 2 \u7684\u9650\u5e45\u903b\u8f91\u4ecd\u4fdd\u7559\u5728\u4ee3\u7801\u4e2d\u4f5c\u4e3a\u5b89\u5168\u515c\u5e95\u3002\n<\/p><\/blockquote>\n<p>\u56fe\u4e2d\u53e0\u52a0\u4e86\u78c1\u94fe\u7b49\u9ad8\u7ebf\u3001\u7535\u6d41\u6781\u9650\u5706\uff08\u9ed1\u8272\u5b9e\u7ebf\uff09\u3001\u7535\u538b\u6781\u9650\u692d\u5706\uff08\u7070\u8272\u865a\u7ebf\uff09\u548c MTPA \u7406\u8bba\u66f2\u7ebf\uff08\u9752\u8272\u865a\u7ebf\uff09\u3002<strong>\u6ce8\u610f<\/strong>\uff1a\u7531\u4e8e\u4eff\u771f\u4e2d\u8f6c\u901f\u5b9e\u65f6\u53d8\u5316\uff0c\u56fa\u5b9a\u8f6c\u901f\u4e0b\u7684 MTPV \u7406\u8bba\u66f2\u7ebf\u4e0d\u518d\u53e0\u52a0\u3002\u8f68\u8ff9\u4e0a\u7684\u7eff\u8272\u5706\u70b9\u4e3a\u8d77\u70b9\uff0c\u7ea2\u8272\u5706\u70b9\u4e3a\u7a33\u6001\u7ec8\u70b9\uff0c\u7bad\u5934\u8868\u793a\u8fd0\u52a8\u65b9\u5411\u3002<\/p>\n<h4>\u4f4e\u8f6c\u901f\u533a\uff1aMTPA \u4e3b\u5bfc\uff08\u9752\u8272\u6bb5\uff09<\/h4>\n<p>\u8f68\u8ff9\u4ece\u539f\u70b9 <span class=\"math-inline\">&#092;((0,0)&#092;)<\/span> \u51fa\u53d1\u540e\uff0c\u8fc5\u901f\u5411\u53f3\u4e0a\u65b9\u7684 MTPA \u66f2\u7ebf\uff08\u9752\u8272\u865a\u7ebf\uff09\u9760\u8fd1\u3002\u5728\u6b64\u9636\u6bb5\uff0c\u8f6c\u901f\u8f83\u4f4e\uff0c\u7535\u538b\u6781\u9650\u692d\u5706\u5f88\u5927\uff08\u5c24\u5176\u662f 1000 rpm \u7684\u7070\u8272\u692d\u5706\uff09\uff0c\u78c1\u94fe\u5c1a\u672a\u53d7\u5230\u7535\u538b\u7ea6\u675f\u3002\u63a7\u5236\u5668\u6267\u884c Step 1\uff08MTPA \u67e5\u8868\uff09\uff0c\u8f68\u8ff9\u5448\u73b0<strong>\u9752\u8272<\/strong>\uff0c\u7535\u6d41\u5de5\u4f5c\u70b9\u7531\u8f6c\u77e9\u9700\u6c42\u51b3\u5b9a\uff0c\u4f4d\u4e8e MTPA \u66f2\u7ebf\u4e0a\u6216\u5176\u9644\u8fd1\u3002<\/p>\n<h4>\u4e2d\u8f6c\u901f\u533a\uff1a\u7535\u538b\u6781\u9650\u5f31\u78c1\uff08\u6a59\u8272\/\u7ea2\u8272\u6bb5\uff09<\/h4>\n<p>\u968f\u7740\u8f6c\u901f\u5347\u9ad8\uff0c\u7535\u538b\u6781\u9650\u692d\u5706\u9010\u6e10\u6536\u7f29\u3002\u5f53\u8f6c\u901f\u8d85\u8fc7\u7ea6 2000\u20133000 rpm \u65f6\uff0cMTPA \u5bf9\u5e94\u7684\u78c1\u94fe\u5df2\u8d85\u51fa\u5f53\u524d\u8f6c\u901f\u4e0b\u7684\u7535\u538b\u6781\u9650\uff08\u692d\u5706\u8fb9\u754c\uff09\u3002\u6b64\u65f6 Step 3 \u7684 <code>min(psi_s, psi_s_max_voltage)<\/code> \u751f\u6548\uff0c\u78c1\u94fe\u88ab\u5f3a\u5236\u538b\u4f4e\uff0c\u8f68\u8ff9\u8f6c\u4e3a<strong>\u6a59\u8272<\/strong>\u3002\u5728\u52a0\u901f\u8fc7\u7a0b\u4e2d\uff0c\u82e5\u6240\u9700\u8f6c\u77e9\u8d85\u51fa\u7535\u6d41\u6781\u9650\u5706\u4e0e\u7535\u538b\u5706\u4ea4\u96c6\uff0cStep 4 \u8fdb\u4e00\u6b65\u622a\u65ad\u8f6c\u77e9\uff0c\u8f68\u8ff9\u51fa\u73b0\u77ed\u6682\u7684<strong>\u7ea2\u8272<\/strong>\u6bb5\u3002\u7535\u6d41\u5de5\u4f5c\u70b9\u4ece MTPA \u66f2\u7ebf\u6ed1\u5411\u7535\u538b\u6781\u9650\u692d\u5706\u4e0e\u7535\u6d41\u6781\u9650\u5706\u7684\u4ea4\u96c6\u533a\u57df\u3002<\/p>\n<h4>\u9ad8\u8f6c\u901f\u533a\uff1aMTPV \u6781\u9650\uff08\u54c1\u7ea2\u8272\u6bb5\uff09<\/h4>\n<p>\u5728 3600 rpm \u53ca\u66f4\u9ad8\u8f6c\u901f\u4e0b\uff0c\u7535\u538b\u6781\u9650\u692d\u5706\u8fdb\u4e00\u6b65\u6536\u7f29\uff0c\u5373\u4f7f\u78c1\u94fe\u5df2\u88ab\u7535\u538b\u9650\u5236\uff0c\u8f6c\u77e9\u4ecd\u53ef\u80fd\u8d85\u51fa MTPV \u6781\u9650\u5141\u8bb8\u7684\u6700\u5927\u503c\u3002Step 5 \u5c06\u8f6c\u77e9\u53c2\u8003\u622a\u65ad\u5230 MTPV \u6781\u9650\u4ee5\u4e0b\uff0c\u8f68\u8ff9\u53d8\u4e3a<strong>\u54c1\u7ea2\u8272<\/strong>\u3002\u6700\u7ec8\u7a33\u6001\u5de5\u4f5c\u70b9\u843d\u5728 MTPV \u6781\u9650\u533a\u57df\uff08\u7565\u504f\u5185\u4fa7\uff0c\u7531\u7cfb\u6570 <span class=\"math-inline\">&#092;(k_{\\text{mtpv}}=0.85&#092;)<\/span> \u51b3\u5b9a\u88d5\u91cf\uff09\u3002\u56fe\u4e2d\u54c1\u7ea2\u8272\u7ec8\u70b9\u9a8c\u8bc1\u4e86\u4e94\u6b65\u94fe\u7684\u6700\u7ec8\u7ea6\u675f\u6548\u679c\u3002<\/p>\n<h4>\u6682\u6001 <span class=\"math-inline\">&#092;(i_d \\gt 0&#092;)<\/span> \u533a\u6bb5\u7684\u673a\u7406<\/h4>\n<p>\u4ece <span class=\"math-inline\">&#092;(i_d&#092;)<\/span>&#8211;<span class=\"math-inline\">&#092;(i_q&#092;)<\/span> \u8f68\u8ff9\u53ef\u4ee5\u89c2\u5bdf\u5230\uff0c\u4eff\u771f\u4e2d\u5b58\u5728\u4e00\u6bb5\u660e\u663e\u7684 <span class=\"math-inline\">&#092;(i_d \\gt 0&#092;)<\/span>\uff08\u7b2c\u4e00\u8c61\u9650\uff09\u6682\u6001\u8f68\u8ff9\u3002\u8be5\u73b0\u8c61\u7684\u4ea7\u751f\u673a\u7406\u5982\u4e0b\uff1a<\/p>\n<ol>\n<li><strong>\u521d\u59cb\u52a0\u901f<\/strong>\uff1a\u8f6c\u901f\u9636\u8dc3\u540e\uff0c\u63a7\u5236\u5668\u9996\u5148\u6309 MTPA \u89c4\u5212\uff0c\u8f68\u8ff9\u4ece\u539f\u70b9\u8fc5\u901f\u5411\u4e0a\u534a\u5e73\u9762\u79fb\u52a8\uff0c\u6b64\u65f6 <span class=\"math-inline\">&#092;(i_d \\lt 0&#092;)<\/span>\u3001<span class=\"math-inline\">&#092;(i_q \\gt 0&#092;)<\/span>\u3002<\/li>\n<li><strong>MTPV \u6fc0\u6d3b<\/strong>\uff1a\u968f\u7740\u8f6c\u901f\u5347\u9ad8\uff0cMTPV \u6a21\u5f0f\u6fc0\u6d3b\uff0c<span class=\"math-inline\">&#092;(i_d&#092;)<\/span> \u88ab\u63a8\u5411\u66f4\u8d1f\u7684\u65b9\u5411\uff08\u5de6\u534a\u5e73\u9762\u79fb\u52a8\uff09\u3002<\/li>\n<li><strong>\u9000\u51fa MTPV\u3001\u8fdb\u5165\u7535\u6d41\u6781\u9650<\/strong>\uff1a\u5728\u6682\u6001\u8fc7\u7a0b\u4e2d\uff0c\u7531\u4e8e flux-torque \u63a7\u5236\u5668\u6ca1\u6709\u76f4\u63a5\u7535\u6d41\u5185\u73af\uff0c\u7535\u6d41\u77e2\u91cf\u51fa\u73b0\u632f\u8361\u3002\u4e2d\u9014\u9000\u51fa MTPV \u7ea6\u675f\u3001\u8fdb\u5165\u7535\u6d41\u6781\u9650\u6a21\u5f0f\u540e\uff0c<span class=\"math-inline\">&#092;(i_d&#092;)<\/span> \u518d\u6b21\u5448\u73b0\u589e\u52a0\u8d8b\u52bf\u3002<\/li>\n<li><strong>\u7b2c\u4e8c\u6b21 MTPA \u8fc7\u6e21<\/strong>\uff1a\u4e0a\u8ff0 <span class=\"math-inline\">&#092;(i_d&#092;)<\/span> \u589e\u52a0\u8d8b\u52bf\u89e6\u53d1\u4e86\u7b2c\u4e8c\u6b21 MTPA \u9636\u6bb5\uff0c\u63a7\u5236\u5668\u5c06 <span class=\"math-inline\">&#092;(i_d&#092;)<\/span> \u4ece\u7b2c\u4e00\u8c61\u9650\u91cd\u65b0\u62c9\u56de\u7b2c\u4e8c\u8c61\u9650\uff0c\u4f46\u8fc7\u7a0b\u4e2d\u4f34\u968f\u660e\u663e\u7684\u632f\u8361\u73af\uff08\u8f68\u8ff9\u56fe\u4e2d\u53ef\u89c1\u7684\u5927\u56de\u73af\uff09\u3002<\/li>\n<\/ol>\n<p>\u8be5 <span class=\"math-inline\">&#092;(i_d \\gt 0&#092;)<\/span> \u533a\u6bb5\u5e76\u975e\u7a33\u6001\u5de5\u4f5c\u70b9\uff0c\u800c\u662f\u5927\u4fe1\u53f7\u6682\u6001\u4e0b flux-torque \u63a7\u5236\u65e0\u7535\u6d41\u5185\u73af\u7684\u76f4\u63a5\u540e\u679c\u3002\u7a33\u6001\u540e\u7535\u6d41\u59cb\u7ec8\u4f4d\u4e8e <span class=\"math-inline\">&#092;(i_d \\lt 0&#092;)<\/span> \u7684\u5f31\u78c1\u533a\uff0c\u6700\u7ec8\u7a33\u5b9a\u5728\u54c1\u7ea2\u8272 MTPV \u6bb5\u3002<\/p>\n<blockquote><p>\n  <strong>\u5173\u952e\u539f\u56e0<\/strong>\uff1aFluxTorqueController \u76f4\u63a5\u63a7\u5236\u7684\u662f\u78c1\u94fe\u5e45\u503c <span class=\"math-inline\">&#092;(|\\psi_s|&#092;)<\/span> \u548c\u8f6c\u77e9 <span class=\"math-inline\">&#092;(\\tau_M&#092;)<\/span>\uff0c\u800c\u975e <span class=\"math-inline\">&#092;(i_d&#092;)<\/span>\u3001<span class=\"math-inline\">&#092;(i_q&#092;)<\/span>\u3002\u56e0\u6b64\uff0c\u5373\u4f7f\u53c2\u8003\u751f\u6210\u5668\u6309 MTPA \u8868\u89c4\u5212\u4e86\u7406\u60f3\u7535\u6d41\uff0c\u5b9e\u9645\u7535\u6d41\u77e2\u91cf\u53ea\u662f\u7535\u538b\u63a7\u5236\u7684 emergent \u7ed3\u679c\uff0c\u5728\u9636\u8dc3\u6682\u6001\u4e2d\u4f1a\u51fa\u73b0\u663e\u8457\u8d85\u8c03\u548c\u8f68\u8ff9\u504f\u79bb\u3002\n<\/p><\/blockquote>\n<h3>6.3 \u4e0d\u540c\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b\u5bf9\u6bd4<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u5bf9\u6bd4\u9879<\/th>\n<th align=\"left\"><span class=\"math-inline\">&#092;(V_{dc}=180&#092;)<\/span> V (\u5de6\u56fe)<\/th>\n<th align=\"left\"><span class=\"math-inline\">&#092;(V_{dc}=150&#092;)<\/span> V (\u53f3\u56fe)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u7535\u538b\u6781\u9650\u692d\u5706\u5c3a\u5bf8<\/td>\n<td align=\"left\">\u8f83\u5927<\/td>\n<td align=\"left\">\u8f83\u5c0f<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u5f31\u78c1\u8d77\u59cb\u8f6c\u901f<\/td>\n<td align=\"left\">\u8f83\u9ad8\uff08\u7ea6 3000 rpm \u540e\u663e\u8457\uff09<\/td>\n<td align=\"left\">\u8f83\u4f4e\uff08\u7ea6 2000 rpm \u5373\u660e\u663e\uff09<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7a33\u6001\u5de5\u4f5c\u70b9<\/td>\n<td align=\"left\">\u54c1\u7ea2\u8272 MTPV \u6bb5\u66f4\u957f<\/td>\n<td align=\"left\">\u54c1\u7ea2\u8272 MTPV \u6bb5\u66f4\u65e9\u51fa\u73b0\u4e14\u66f4\u957f<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u52a8\u6001\u8fc7\u7a0b<\/td>\n<td align=\"left\">\u9752\u8272\/\u6a59\u8272\u6bb5\u5728\u692d\u5706\u5916\u4fa7\u505c\u7559\u66f4\u4e45<\/td>\n<td align=\"left\">\u66f4\u65e9\u8fdb\u5165\u54c1\u7ea2\u8272 MTPV \u6bb5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b\u964d\u4f4e 30 V\uff0816.7%\uff09\u76f4\u63a5\u5bfc\u81f4\u7535\u538b\u6781\u9650\u692d\u5706\u7b49\u6bd4\u4f8b\u7f29\u5c0f\u3002\u5728 150 V \u5de5\u51b5\u4e0b\uff0c3600 rpm \u5bf9\u5e94\u7684\u692d\u5706\u5df2\u5927\u5e45\u6536\u7f29\uff0c\u63a7\u5236\u5668\u5fc5\u987b\u66f4\u65e9\u3001\u66f4\u6df1\u5730\u6ce8\u5165\u8d1f\u5411 <span class=\"math-inline\">&#092;(i_d&#092;)<\/span> \u7535\u6d41\u8fdb\u884c\u5f31\u78c1\uff0c\u4ee5\u7ef4\u6301\u7535\u538b\u5e73\u8861\u3002\u8fd9\u4e5f\u5bfc\u81f4\u7a33\u6001\u65f6 <span class=\"math-inline\">&#092;(i_d&#092;)<\/span> \u66f4\u8d1f\u3001<span class=\"math-inline\">&#092;(i_q&#092;)<\/span> \u7565\u4f4e\uff0c\u8f6c\u77e9\u80fd\u529b\u76f8\u5e94\u4e0b\u964d\u3002<\/p>\n<h3>6.4 \u98ce\u673a\u8d1f\u8f7d\u7279\u6027\u7684\u5f71\u54cd<\/h3>\n<p>\u98ce\u673a\u8d1f\u8f7d\u4e3a\u5e73\u65b9\u5f8b\u8d1f\u8f7d (<span class=\"math-inline\">&#092;(\\tau_L \\propto \\omega_m^2&#092;)<\/span>)\uff0c\u5176\u7279\u70b9\u5728\u4e8e\uff1a<\/p>\n<ol>\n<li><strong>\u542f\u52a8\u8f6c\u77e9\u4f4e<\/strong>\uff1a\u9759\u6b62\u65f6\u8d1f\u8f7d\u8f6c\u77e9\u63a5\u8fd1\u96f6\uff0c\u7535\u673a\u53ea\u9700\u514b\u670d\u60ef\u6027\uff0c\u56e0\u6b64\u542f\u52a8\u7535\u6d41\u8f83\u5c0f\uff0c\u8f68\u8ff9\u4ece\u539f\u70b9\u9644\u8fd1\u5e73\u7a33\u51fa\u53d1\u3002<\/li>\n<li><strong>\u52a0\u901f\u8fc7\u7a0b\u975e\u5355\u8c03<\/strong>\uff1a\u968f\u7740\u8f6c\u901f\u4e0a\u5347\uff0c\u8d1f\u8f7d\u8f6c\u77e9\u6309\u5e73\u65b9\u589e\u957f\uff0c\u800c\u63a7\u5236\u5668\u4e0d\u65ad\u8c03\u6574\u78c1\u94fe\u548c\u8f6c\u77e9\u53c2\u8003\u3002\u56fe\u4e2d\u8f68\u8ff9\u5728\u4e0a\u5347\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u5c0f\u5e45\u632f\u8361\u548c\u56de\u73af\uff08\u5c24\u5176\u5728\u54c1\u7ea2\u8272\u4e0e\u6a59\u8272\u8fc7\u6e21\u533a\uff09\uff0c\u8fd9\u662f\u98ce\u673a\u8d1f\u8f7d\u8f6c\u77e9\u4e0e\u8f6c\u901f\u5f3a\u8026\u5408\u3001\u4ee5\u53ca\u7535\u6d41\u73af\u52a8\u6001\u54cd\u5e94\u5171\u540c\u4f5c\u7528\u7684\u7ed3\u679c\u3002<\/li>\n<li><strong>\u7a33\u6001\u529f\u7387\u5339\u914d<\/strong>\uff1a\u6700\u7ec8\u7a33\u6001\u65f6\uff0c\u7535\u78c1\u8f6c\u77e9\u4e0e\u98ce\u673a\u8d1f\u8f7d\u8f6c\u77e9\u5e73\u8861\uff0c\u5de5\u4f5c\u70b9\u7a33\u5b9a\u5728\u7535\u538b\u6781\u9650\u3001\u7535\u6d41\u6781\u9650\u548c MTPV \u7ea6\u675f\u7684\u4ea4\u96c6\u9644\u8fd1\u3002\u7531\u4e8e\u98ce\u673a\u8d1f\u8f7d\u5728\u989d\u5b9a\u8f6c\u901f\u5904\u8f6c\u77e9\u6700\u5927\uff0c\u7a33\u6001\u70b9\u901a\u5e38\u4f4d\u4e8e\u8f83\u9ad8\u8f6c\u901f\u5bf9\u5e94\u7684\u7535\u538b\u692d\u5706\u8fb9\u754c\u4e0a\u3002<\/li>\n<\/ol>\n<h3>6.5 \u5c0f\u7ed3<\/h3>\n<p>\u4eff\u771f\u8f68\u8ff9\u6e05\u6670\u5c55\u793a\u4e86 motulator \u4e94\u6b65\u5207\u6362\u94fe\u7684\u5b9e\u9645\u6548\u679c\uff1a<\/p>\n<ul>\n<li><strong>MTPA \u4f18\u5148<\/strong>\uff08\u9752\u8272\uff09\uff1a\u4f4e\u8f6c\u901f\u533a\u8f6c\u77e9\u6700\u5927\u5316<\/li>\n<li><strong>\u7535\u538b\u5f31\u78c1\u81ea\u7136\u8fc7\u6e21<\/strong>\uff08\u6a59\u8272\uff09\uff1a\u4e2d\u8f6c\u901f\u533a\u692d\u5706\u6536\u7f29\u81ea\u52a8\u538b\u4f4e\u78c1\u94fe\uff0c\u65e0\u786c\u5207\u6362<\/li>\n<li><strong>\u7535\u6d41\u6781\u9650\u622a\u65ad<\/strong>\uff08\u7ea2\u8272\uff09\uff1a\u8fc7\u6e21\u533a\u8f6c\u77e9\u88ab\u7535\u6d41\u5706\u9650\u5236<\/li>\n<li><strong>MTPV \u6700\u7ec8\u515c\u5e95<\/strong>\uff08\u54c1\u7ea2\u8272\uff09\uff1a\u9ad8\u8f6c\u901f\u533a\u8f6c\u77e9\u88ab\u9650\u5236\u5728\u7535\u538b\u6700\u4f18\u8f68\u8ff9\u4e0a<\/li>\n<li><strong>\u6e10\u8fdb\u5f0f\u7ea6\u675f<\/strong>\uff1a<code>clip<\/code> + <code>min<\/code> \u7ec4\u5408\u5b9e\u73b0\u4e86\u5e73\u6ed1\u3001\u65e0\u6296\u52a8\u7684\u6a21\u5f0f\u8fc7\u6e21\uff0c\u989c\u8272\u53d8\u5316\u76f4\u89c2\u53cd\u6620\u4e86\u8fd9\u4e00\u8fc7\u7a0b<\/li>\n<\/ul>\n<p>\u4e0d\u540c\u76f4\u6d41\u6bcd\u7ebf\u7535\u538b\u7684\u5bf9\u6bd4\u8fdb\u4e00\u6b65\u8bf4\u660e\uff0c\u7535\u538b\u6781\u9650\u662f\u51b3\u5b9a\u5f31\u78c1\u6df1\u5ea6\u548c\u9ad8\u901f\u8f6c\u77e9\u80fd\u529b\u7684\u5173\u952e\u8fb9\u754c\u6761\u4ef6\u3002<\/p>\n<hr \/>\n<h2>7. \u9644\u5f55<\/h2>\n<h3>7.1 Brentq \u6c42\u6839\u7b97\u6cd5\uff08MTPA &amp; MTPV \u7edf\u4e00\u89c6\u89d2\uff09<\/h3>\n<p>motulator \u5728 MTPA \u548c MTPV \u7684\u8f68\u8ff9\u9884\u8ba1\u7b97\u4e2d\u5747\u91c7\u7528 <code>scipy.optimize.root_scalar(..., method=\"brentq\")<\/code>\u3002Brentq \u662f<strong>\u4e8c\u5206\u6cd5 + \u5272\u7ebf\u6cd5 + \u53cd\u4e8c\u6b21\u63d2\u503c<\/strong>\u7684\u6df7\u5408\u7b97\u6cd5\uff0c\u517c\u5177\u4e8c\u5206\u6cd5\u7684\u7a33\u5065\u6027\u548c\u5272\u7ebf\u6cd5\u7684\u8d85\u7ebf\u6027\u6536\u655b\u3002<\/p>\n<h4>MTPA \u6c42\u6839<\/h4>\n<p>\u641c\u7d22\u53d8\u91cf\u4e3a\u7535\u6d41\u89d2 <span class=\"math-inline\">&#092;(\\gamma&#092;)<\/span>\uff0c\u641c\u7d22\u533a\u95f4\u4e3a <span class=\"math-inline\">&#092;([\\pi\/2, \\pi]&#092;)<\/span>\uff08IPMSM \u7684 MTPA \u7535\u6d41\u89d2\u5fc5\u7136\u5728\u7b2c\u4e8c\u8c61\u9650\uff09\uff1a<\/p>\n<pre><code class=\"language-python line-numbers\">def mtpa_cond(gamma):\n    i_s_dq = i_s_abs * np.exp(1j * gamma)\n    psi_a_dq = par.aux_flux(i_s_dq)\n    return np.real(psi_a_dq * np.conj(i_s_dq))  # \u6c42\u6b64\u51fd\u6570\u7684\u6839\n\ngamma_opt = root_scalar(mtpa_cond, bracket=[np.pi\/2, np.pi], method=\"brentq\").root\n<\/code><\/pre>\n<h4>MTPV \u6c42\u6839<\/h4>\n<p>\u641c\u7d22\u53d8\u91cf\u4e3a\u78c1\u94fe\u89d2 <span class=\"math-inline\">&#092;(\\delta&#092;)<\/span>\uff0c\u641c\u7d22\u533a\u95f4\u540c\u6837\u4e3a <span class=\"math-inline\">&#092;([\\pi\/2, \\pi]&#092;)<\/span>\uff08IPMSM \u7684 MTPV \u8f68\u8ff9\u4f4d\u4e8e\u7b2c\u4e8c\u8c61\u9650\uff0c<span class=\"math-inline\">&#092;(i_d \\lt 0, i_q \\gt 0&#092;)<\/span>\uff09\uff1a<\/p>\n<pre><code class=\"language-python line-numbers\">def mtpv_cond(delta):\n    psi_s_dq = psi_s_abs * np.exp(1j * delta)\n    i_s_dq = par.iterate_i_s_dq(psi_s_dq)\n    i_a_dq = par.aux_current(i_s_dq)\n    return np.real(i_a_dq * np.conj(psi_s_dq))\n\ndelta_opt = root_scalar(mtpv_cond, bracket=[np.pi\/2, np.pi], method=\"brentq\").root\n<\/code><\/pre>\n<h4>\u7b97\u6cd5\u8981\u70b9<\/h4>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u7279\u6027<\/th>\n<th align=\"left\">\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><strong>\u62ec\u53f7\u533a\u95f4<\/strong><\/td>\n<td align=\"left\"><span class=\"math-inline\">&#092;([\\pi\/2, \\pi]&#092;)<\/span>\uff1aIPMSM \u7684\u6700\u4f18\u8f68\u8ff9\u5747\u4f4d\u4e8e\u7b2c\u4e8c\u8c61\u9650<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>\u6839\u5b58\u5728\u6027\u68c0\u9a8c<\/strong><\/td>\n<td align=\"left\"><code>cond(a) * cond(b) &gt; 0<\/code> \u8868\u793a\u533a\u95f4\u5185\u65e0\u7b26\u53f7\u53d8\u5316\uff0c\u8fd4\u56de <code>nan<\/code>\uff08\u5982\u8868\u8d34\u5f0f\u7535\u673a <span class=\"math-inline\">&#092;(L_d=L_q&#092;)<\/span> \u65f6\u4e0d\u5b58\u5728 MTPV\uff09<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>\u6536\u655b\u6027<\/strong><\/td>\n<td align=\"left\">\u6bcf\u6b65\u8fed\u4ee3\u4fdd\u8bc1\u6839\u533a\u95f4\u7f29\u5c0f\uff0c\u9002\u5408\u79bb\u7ebf\u9884\u8ba1\u7b97 LUT<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>\u79bb\u6563\u5bc6\u5ea6<\/strong><\/td>\n<td align=\"left\">\u9ed8\u8ba4 16 \u70b9\u5373\u53ef\u8986\u76d6\u5168\u573a\uff0c\u8ba1\u7b97\u91cf\u6781\u5c0f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>LUT \u63d2\u503c\u5668<\/h4>\n<p>\u6c42\u6839\u5b8c\u6210\u540e\uff0c\u6e90\u7801\u6784\u9020\u53ef\u8c03\u7528\u63d2\u503c\u5668\u4f9b\u5728\u7ebf\u67e5\u8868\uff1a<\/p>\n<pre><code class=\"language-python line-numbers\"># MTPA: \u7531\u8f6c\u77e9\u67e5\u7535\u6d41\nMTPALocus(i_s_dq_vs_tau_M=lambda x: np.interp(x, tau_M, i_s_dq))\n\n# MTPV: \u7531\u78c1\u94fe\u5e45\u503c\u67e5\u7535\u6d41\/\u8f6c\u77e9\nMTPVLocus(\n    tau_M_vs_psi_s_abs=lambda x: np.interp(x, abs(psi_s_dq), tau_M),\n    i_s_dq_vs_psi_s_abs=lambda x: np.interp(x, abs(psi_s_dq), i_s_dq),\n)\n<\/code><\/pre>\n<h3>7.2 \u7b26\u53f7\u5bf9\u7167\u8868<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u7b26\u53f7<\/th>\n<th align=\"left\">\u542b\u4e49<\/th>\n<th align=\"left\">\u5355\u4f4d<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\psi_s&#092;)<\/span><\/td>\n<td align=\"left\">\u5b9a\u5b50\u78c1\u94fe\u77e2\u91cf<\/td>\n<td align=\"left\">Vs<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\psi_a&#092;)<\/span><\/td>\n<td align=\"left\">\u8f85\u52a9\u78c1\u94fe (auxiliary flux)<\/td>\n<td align=\"left\">Vs<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><span class=\"math-inline\">&#092;(i_a&#092;)<\/span><\/td>\n<td align=\"left\">\u8f85\u52a9\u7535\u6d41 (auxiliary current)<\/td>\n<td align=\"left\">A<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><span class=\"math-inline\">&#092;(i_s&#092;)<\/span><\/td>\n<td align=\"left\">\u5b9a\u5b50\u7535\u6d41\u77e2\u91cf<\/td>\n<td align=\"left\">A<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\gamma&#092;)<\/span><\/td>\n<td align=\"left\">\u7535\u6d41\u89d2 (<span class=\"math-inline\">&#092;(i_s&#092;)<\/span> \u7684\u5e45\u89d2)<\/td>\n<td align=\"left\">rad<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><span class=\"math-inline\">&#092;(\\delta&#092;)<\/span><\/td>\n<td align=\"left\">\u78c1\u94fe\u89d2 (<span class=\"math-inline\">&#092;(\\psi_s&#092;)<\/span> \u7684\u5e45\u89d2)<\/td>\n<td align=\"left\">rad<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><span class=\"math-inline\">&#092;(c_\\tau&#092;)<\/span><\/td>\n<td align=\"left\">\u8f6c\u77e9\u4ea7\u751f\u56e0\u5b50<\/td>\n<td align=\"left\">\u2014<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><span class=\"math-inline\">&#092;(t_\\psi, t_\\tau&#092;)<\/span><\/td>\n<td align=\"left\">\u78c1\u94fe\/\u8f6c\u77e9\u63a7\u5236\u65b9\u5411\u5411\u91cf<\/td>\n<td align=\"left\">\u2014<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><span class=\"math-inline\">&#092;(k_u&#092;)<\/span><\/td>\n<td align=\"left\">\u7535\u538b\u5229\u7528\u7cfb\u6570<\/td>\n<td align=\"left\">\u2014<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><span class=\"math-inline\">&#092;(k_{\\text{mtpv}}&#092;)<\/span><\/td>\n<td align=\"left\">MTPV \u88d5\u91cf\u7cfb\u6570<\/td>\n<td align=\"left\">\u2014<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>7.3 \u51fd\u6570\u5bf9\u7167\u8868<\/h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u51fd\u6570<\/th>\n<th align=\"left\">\u8f93\u5165<\/th>\n<th align=\"left\">\u8f93\u51fa<\/th>\n<th align=\"left\">\u7528\u9014<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><code>aux_flux(i_s_dq)<\/code><\/td>\n<td align=\"left\">\u7535\u6d41\u77e2\u91cf<\/td>\n<td align=\"left\">\u8f85\u52a9\u78c1\u94fe <span class=\"math-inline\">&#092;(\\psi_a&#092;)<\/span><\/td>\n<td align=\"left\">MTPA \u6761\u4ef6\u5224\u65ad<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>aux_current(i_s_dq)<\/code><\/td>\n<td align=\"left\">\u7535\u6d41\u77e2\u91cf<\/td>\n<td align=\"left\">\u8f85\u52a9\u7535\u6d41 <span class=\"math-inline\">&#092;(i_a&#092;)<\/span><\/td>\n<td align=\"left\">MTPV \u6761\u4ef6\u5224\u65ad<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>compute_mtpa_current_angle(i_s_abs)<\/code><\/td>\n<td align=\"left\">\u7535\u6d41\u5e45\u503c<\/td>\n<td align=\"left\">\u6700\u4f18\u7535\u6d41\u89d2 <span class=\"math-inline\">&#092;(\\gamma&#092;)<\/span><\/td>\n<td align=\"left\">Brentq \u6c42\u6839<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>compute_mtpv_flux_angle(psi_s_abs)<\/code><\/td>\n<td align=\"left\">\u78c1\u94fe\u5e45\u503c<\/td>\n<td align=\"left\">\u6700\u4f18\u78c1\u94fe\u89d2 <span class=\"math-inline\">&#092;(\\delta&#092;)<\/span><\/td>\n<td align=\"left\">Brentq \u6c42\u6839<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>psi_s_dq(i_s_dq)<\/code><\/td>\n<td align=\"left\">\u7535\u6d41\u77e2\u91cf<\/td>\n<td align=\"left\">\u78c1\u94fe\u77e2\u91cf<\/td>\n<td align=\"left\">\u7535\u6d41\u2192\u78c1\u94fe\u6620\u5c04<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>i_s_dq(psi_s_dq)<\/code><\/td>\n<td align=\"left\">\u78c1\u94fe\u77e2\u91cf<\/td>\n<td align=\"left\">\u7535\u6d41\u77e2\u91cf<\/td>\n<td align=\"left\">\u78c1\u94fe\u2192\u7535\u6d41\u6620\u5c04<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><code>iterate_i_s_dq(psi_s_dq)<\/code><\/td>\n<td align=\"left\">\u78c1\u94fe\u77e2\u91cf<\/td>\n<td align=\"left\">\u7535\u6d41\u77e2\u91cf\uff08\u8fed\u4ee3\u6c42\u89e3\uff09<\/td>\n<td align=\"left\">\u9971\u548c\u7535\u673a\u78c1\u94fe\u2192\u7535\u6d41<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2>8. \u5173\u952e\u4ee3\u7801\u7d22\u5f15<\/h2>\n<table>\n<thead>\n<tr>\n<th align=\"left\">\u529f\u80fd<\/th>\n<th align=\"left\">\u6587\u4ef6<\/th>\n<th align=\"left\">\u65b9\u6cd5\/\u7c7b<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\">\u8f85\u52a9\u78c1\u94fe\u5b9a\u4e49<\/td>\n<td align=\"left\"><code>utils\/_parameters.py<\/code><\/td>\n<td align=\"left\"><code>BaseSynchronousMachinePars.aux_flux()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u8f85\u52a9\u7535\u6d41\u5b9a\u4e49<\/td>\n<td align=\"left\"><code>utils\/_parameters.py<\/code><\/td>\n<td align=\"left\"><code>BaseSynchronousMachinePars.aux_current()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">MTPA \u7535\u6d41\u89d2\u6c42\u6839<\/td>\n<td align=\"left\"><code>utils\/_sm_control_loci.py<\/code><\/td>\n<td align=\"left\"><code>ControlLoci.compute_mtpa_current_angle()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">MTPA \u8f68\u8ff9\u9884\u8ba1\u7b97<\/td>\n<td align=\"left\"><code>utils\/_sm_control_loci.py<\/code><\/td>\n<td align=\"left\"><code>ControlLoci.compute_mtpa_locus()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">MTPV \u78c1\u94fe\u89d2\u6c42\u6839<\/td>\n<td align=\"left\"><code>utils\/_sm_control_loci.py<\/code><\/td>\n<td align=\"left\"><code>ControlLoci.compute_mtpv_flux_angle()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">MTPV \u8f68\u8ff9\u9884\u8ba1\u7b97<\/td>\n<td align=\"left\"><code>utils\/_sm_control_loci.py<\/code><\/td>\n<td align=\"left\"><code>ControlLoci.compute_mtpv_locus()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u6d41\u6781\u9650\u8f68\u8ff9<\/td>\n<td align=\"left\"><code>utils\/_sm_control_loci.py<\/code><\/td>\n<td align=\"left\"><code>ControlLoci.compute_const_current_locus()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u4e94\u6b65\u53c2\u8003\u751f\u6210<\/td>\n<td align=\"left\"><code>control\/_sm_reference_gen.py<\/code><\/td>\n<td align=\"left\"><code>ReferenceGenerator.compute_flux_and_torque_refs()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">MTPA \u78c1\u94fe\u67e5\u8868<\/td>\n<td align=\"left\"><code>control\/_sm_reference_gen.py<\/code><\/td>\n<td align=\"left\"><code>ReferenceGenerator._get_mtpa_flux()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">MTPV \u67e5\u8868<\/td>\n<td align=\"left\"><code>control\/_sm_reference_gen.py<\/code><\/td>\n<td align=\"left\"><code>ReferenceGenerator._get_mtpv_flux_and_torque()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u6d41\u6781\u9650\u8f6c\u77e9<\/td>\n<td align=\"left\"><code>control\/_sm_reference_gen.py<\/code><\/td>\n<td align=\"left\"><code>ReferenceGenerator._get_current_limit_torque()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u7535\u538b\u6781\u9650\u78c1\u94fe<\/td>\n<td align=\"left\"><code>control\/_sm_reference_gen.py<\/code><\/td>\n<td align=\"left\"><code>ReferenceGenerator._get_max_flux()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">FluxTorque \u63a7\u5236\u5668<\/td>\n<td align=\"left\"><code>control\/_sm_flux_vector.py<\/code><\/td>\n<td align=\"left\"><code>FluxTorqueController.compute_output()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u79ef\u5206\u72b6\u6001\u66f4\u65b0<\/td>\n<td align=\"left\"><code>control\/_sm_flux_vector.py<\/code><\/td>\n<td align=\"left\"><code>FluxTorqueController.update()<\/code><\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u77e2\u91cf\u63a7\u5236\u5668\u603b\u63a7<\/td>\n<td align=\"left\"><code>control\/_sm_flux_vector.py<\/code><\/td>\n<td align=\"left\"><code>FluxVectorController.compute_output()<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6587\u57fa\u4e8e motulator \u6846\u67b6\uff0c\u5bf9\u4e00\u53f0\u5185\u7f6e\u5f0f\u6c38\u78c1\u540c\u6b65\u7535\u673a (IPMSM) \u7684\u9a71\u52a8\u7cfb\u7edf\u8fdb\u884c\u5b8c\u6574\u53c2\u6570\u68b3\u7406\uff0c\u5e76\u7cfb [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-311","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/bluespider.top\/index.php?rest_route=\/wp\/v2\/posts\/311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/bluespider.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/bluespider.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/bluespider.top\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"http:\/\/bluespider.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=311"}],"version-history":[{"count":15,"href":"http:\/\/bluespider.top\/index.php?rest_route=\/wp\/v2\/posts\/311\/revisions"}],"predecessor-version":[{"id":357,"href":"http:\/\/bluespider.top\/index.php?rest_route=\/wp\/v2\/posts\/311\/revisions\/357"}],"wp:attachment":[{"href":"http:\/\/bluespider.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/bluespider.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=311"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/bluespider.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}