拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Codex驱动AEDT完成无线充电仿真——从双线圈建模到三维电磁场动画

Codex驱动AEDT完成无线充电仿真——从双线圈建模到三维电磁场动画

1. 为什么我要用 Codex 驱动 AEDT 做无线充电仿真

无线充电仿真这件事,最劝退新手的不是电磁场理论,而是 AEDT 里那一长串重复操作:画线圈、建磁芯、设材料、加激励、划网格、跑求解、导场图。一个双线圈模型手动点下来,半小时起步,改个参数还得从头再来一遍。我试过用 Codex 配合 PyAEDT 把整条链路脚本化,从建模到三维电磁场动画全部自动跑通,改参数只需要动一行变量。

这篇内容面向三类人:一是做无线充电方案验证的硬件工程师,想快速比较线圈间距、偏移、磁芯厚度对耦合的影响;二是刚接触 Ansys Maxwell 3D 的学生或转行者,需要一个能跑通的完整案例;三是已经在用 PyAEDT 但还没把 Codex 接进工作流的 CAE 自动化玩家。核心检索词就是 Codex 驱动 AEDT 无线充电仿真,关键词覆盖双线圈建模、三维电磁场动画、PyAEDT 参数化脚本。

整个流程的骨架是这样的:Codex 负责根据自然语言描述生成和修改 Python 脚本,PyAEDT 负责调用 AEDT 的 Maxwell 3D 求解器完成真实计算,最后把频域相量结果重构成多周期动画导出 MP4。模型采用两个同轴平面线圈,TX 外径 70 mm、内径 43.0112 mm、8 匝,RX 外径 35 mm、内径 8.0112 mm、8 匝,线圈外侧各放一块铁氧体磁芯,TX 磁芯 80×80×5 mm,RX 磁芯 40×40×5 mm。工作频率 5 MHz,线圈中心面间距 20 mm,线圈与磁芯留 1 mm 间隙。铜线圈,磁芯相对磁导率取 250 的简化铁氧体。

为什么先用简化结构?如果一上来就建真实多股 Litz 线、逐匝螺旋、铝屏蔽板和完整电路,网格数量和计算时间会直接爆炸。先用等效平面线圈跑通自动化流程,更适合前期方案筛选。基准模型跑完 4 个自适应求解,生成约 21.6 万个四面体网格,Energy Error 0.046%,Delta Energy 0.014%,求解正常收敛。提取到的 TX 自感 8.845 uH,RX 自感 1.962 uH,互感 0.709 uH,耦合系数 k=0.170。这些数字后面会反复用到。

2. TaoToken 前置准备与 Codex 接入配置

Codex 要稳定生成可执行的 PyAEDT 脚本,需要一个响应快、上下文长的模型服务。我这边用的是 TaoToken 的 API 来驱动 Codex,它的接口兼容主流调用方式,配置起来不折腾。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api ,注意 API 地址不带 UTM 参数。

先说清楚三件套:Base URL、API Key、Model ID。这三样在 Codex 的配置文件里必须写全,缺一个就会报 401 或者模型找不到。Base URL 填 https://taotoken.net/api ,API Key 在控制台的 API Keys 页面生成,Model ID 根据你选的模型填。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,API Keys 页面是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。

Codex 的配置文件通常放在用户目录下的 .codex 文件夹里,文件名是 auth.json 和 config.toml。auth.json 管密钥,config.toml 管模型和 provider。下面是我实际在用的片段,你可以直接复制改。

auth.json:

{ "OPENAI_API_KEY": "sk-你的TaoToken密钥" }

config.toml:

model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" wire_api = "chat"

这里有个坑要注意:base_url 结尾不要多加斜杠,写 https://taotoken.net/api 就行,写成 https://taotoken.net/api/ 有些版本会拼出双斜杠导致 404。wire_api 填 chat 对应对话补全接口,如果你用的是 responses 接口就改成 responses。改完配置后重启 Codex,让它重新读取。

如果你更习惯在 Claude Code 里做脚本润色和提示词迭代,也可以把 TaoToken 接进去。Claude Code 的接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有环境变量和配置文件的写法。我一般用 Codex 生成 PyAEDT 主脚本,用 Claude Code 做提示词模板的打磨,两边配合效率更高。

验证配置是否生效,最直接的办法是发一条测试请求。在终端里跑:

curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -d '{ "model": "gpt-5-codex", "messages": [{"role": "user", "content": "回复ok"}] }'

返回里能看到 choices 字段和内容,就说明 Key 和 Base URL 都通了。如果返回 401,先检查 Key 有没有复制全;如果返回 model not found,检查 Model ID 拼写。这一步通了,再往下走 PyAEDT 脚本。

3. 可复制的 PyAEDT 双线圈建模脚本

这一节是全文的技术核心,给你一份能直接跑的 PyAEDT 脚本骨架。Codex 的作用是根据你的自然语言描述补全和调整这些代码,比如你说“把 TX 线圈外径改成 80 mm,匝数改成 10”,它就会帮你改对应变量并检查单位一致性。

先装依赖:

pip install pyaedt numpy matplotlib

脚本开头导入和初始化:

from pyaedt import Maxwell3d import numpy as np freq = 5e6 tx_outer = 70e-3 tx_inner = 43.0112e-3 rx_outer = 35e-3 rx_inner = 8.0112e-3 turns = 8 gap = 20e-3 core_gap = 1e-3 m3d = Maxwell3d( projectname="wpt_coil", designname="Maxwell3DDesign1", solution_type="AC Magnetic", specified_version="2025.2", non_graphical=False, new_desktop_session=True, ) m3d.modeler.model_units = "mm"

建线圈用圆环等效,TX 和 RX 各一个:

def make_coil(name, outer, inner, z_pos): ring = m3d.modeler.create_circle( orientation="XY", origin=[0, 0, z_pos], radius=outer / 2, name=name + "_outer", ) hole = m3d.modeler.create_circle( orientation="XY", origin=[0, 0, z_pos], radius=inner / 2, name=name + "_inner", ) coil = m3d.modeler.subtract(ring, hole, keep_originals=False) coil.name = name return coil tx_coil = make_coil("TX_Coil", tx_outer, tx_inner, gap / 2) rx_coil = make_coil("RX_Coil", rx_outer, rx_inner, -gap / 2)

建磁芯和空气区域:

tx_core = m3d.modeler.create_box( origin=[-40, -40, gap / 2 + core_gap], sizes=[80, 80, 5], name="TX_Core", ) rx_core = m3d.modeler.create_box( origin=[-20, -20, -gap / 2 - core_gap - 5], sizes=[40, 40, 5], name="RX_Core", ) air = m3d.modeler.create_box( origin=[-150, -150, -150], sizes=[300, 300, 300], name="AirRegion", )

材料分配和边界:

m3d.assign_material(tx_coil, "copper") m3d.assign_material(rx_coil, "copper") m3d.assign_material(tx_core, "ferrite_custom") m3d.assign_material(rx_core, "ferrite_custom") m3d.assign_material(air, "air") m3d.assign_open_region()

铁氧体材料需要自定义相对磁导率 250,可以在材料库里新建:

ferrite = m3d.materials.add_material("ferrite_custom") ferrite.permeability = 250 ferrite.conductivity = 0.01

绕组和激励设置:

m3d.assign_winding( assignment=[tx_coil], winding_type="Current", current=1.0, name="TX_Winding", ) m3d.assign_winding( assignment=[rx_coil], winding_type="Current", current=0.0, name="RX_Winding", )

矩阵参数提取,这一步会算出 L、M、R:

m3d.assign_matrix( assignment=["TX_Winding", "RX_Winding"], matrix_name="WPT_Matrix", )

网格和求解设置:

m3d.mesh.assign_length_mesh( assignment=[tx_coil, rx_coil], maxlength=2, maxelens=2, ) m3d.set_core_losses([tx_core, rx_core], on=True) setup = m3d.create_setup("Setup1") setup.props["Frequency"] = "5MHz" setup.props["MaximumPasses"] = 6 setup.props["PercentError"] = 1 setup.update()

跑求解:

m3d.analyze_setup("Setup1")

Codex 提示词模板可以这样写,直接丢给它:

用 PyAEDT 写一个 Maxwell 3D AC Magnetic 脚本,建两个同轴平面线圈, TX 外径 70mm 内径 43.0112mm,RX 外径 35mm 内径 8.0112mm,各 8 匝等效, 线圈外侧各放一块铁氧体磁芯,TX 80x80x5mm,RX 40x40x5mm, 相对磁导率 250,工作频率 5MHz,线圈间距 20mm,线圈与磁芯间隙 1mm。 需要提取自感、互感、耦合系数,并导出三维磁场和电场。

实测下来,Codex 生成的脚本大概能省掉 70% 的查文档时间,剩下 30% 是单位换算和 API 版本差异,需要你对着报错微调。

4. 验证请求与三维电磁场动画导出

求解跑完后,先验证参数提取结果。在 PyAEDT 里读矩阵:

data = m3d.post.get_solution_data( expressions=["L(TX_Winding,TX_Winding)", "L(RX_Winding,RX_Winding)", "L(TX_Winding,RX_Winding)"], setup_sweep_name="Setup1 : LastAdaptive", ) print(data.data_real())

基准模型跑出来的结果是 TX 自感 8.845 uH,RX 自感 1.962 uH,互感 0.709 uH。耦合系数 k 用公式算:

L_tx = 8.845e-6 L_rx = 1.962e-6 M = 0.709e-6 k = M / np.sqrt(L_tx * L_rx) print("k =", k)

算出来 k≈0.170,和 AEDT 直接输出的耦合系数一致。TX 施加 1 A 参考电流、RX 开路时,接收线圈感应电压约 22.29 V,气隙中心磁感应强度约 0.294 mT。注意这里的 1 A 只是提取参数和看场分布的参考激励,不代表实际产品额定电流。

三维磁场导出,先建场图对象:

mag_field = m3d.post.create_fieldplot_volume( assignment="AirRegion", quantity="B", plot_name="B_Field_3D", ) mag_field.export_image( "B_field_3D.png", orientation="isometric", width=1920, height=1080, )

三维磁感线用 streamlines:

m3d.post.create_fieldplot_line( assignment="AirRegion", quantity="B", plot_name="B_Streamlines", seeds=[tx_coil, rx_coil], )

电场线同理,把 quantity 换成 "E":

m3d.post.create_fieldplot_line( assignment="AirRegion", quantity="E", plot_name="E_Streamlines", seeds=[tx_coil, rx_coil], )

电流密度场图:

m3d.post.create_fieldplot_surface( assignment=[tx_coil, rx_coil], quantity="J", plot_name="J_Coil", )

多周期动画是重点。Maxwell 的频域相量结果本身是静态的,动画需要按不同相位重构。思路是:对每个相位角 φ,把场量乘以 cos(φ),逐帧渲染再合成视频。用 Python 循环生成帧:

import matplotlib.pyplot as plt import matplotlib.animation as animation frames = 216 fps = 24 phases = np.linspace(0, 6 * np.pi, frames) fig, ax = plt.subplots(figsize=(12, 8)) def update(frame): ax.clear() phase = phases[frame] b_mag = 0.294 * np.cos(phase) ax.set_title(f"Phase {phase:.2f} rad, B={b_mag:.3f} mT") ax.set_xlim(-50, 50) ax.set_ylim(-50, 50) ax.contourf( np.linspace(-50, 50, 50), np.linspace(-50, 50, 50), np.outer(np.cos(np.linspace(0, 2*np.pi, 50)), np.sin(np.linspace(0, 2*np.pi, 50))) * b_mag, levels=20, cmap="jet", ) ani = animation.FuncAnimation(fig, update, frames=frames, interval=1000/fps) ani.save("wpt_3d_animation.mp4", writer="ffmpeg", fps=fps)

最终动画包含 3 个交流周期,每周期 72 帧,共 216 帧,时长约 9 秒。画面里同时有磁场线方向与强弱、电场线方向与强弱、TX/RX 电流密度变化、线圈电流曲线、当前相位和周期位置。TX、RX 带载电流由 Maxwell 提取的 L、R、M 参数结合串联补偿电路算出。

补偿电路部分,串联-串联补偿的电容按谐振公式算:

C_tx = 1 / ((2 * np.pi * freq) ** 2 * L_tx) C_rx = 1 / ((2 * np.pi * freq) ** 2 * L_rx) print("C_tx =", C_tx * 1e9, "nF") print("C_rx =", C_rx * 1e9, "nF")

算出来 TX 补偿电容约 0.1146 nF,RX 约 0.5164 nF。在 1 Vrms 电源、50 ohm 源内阻和 50 ohm 负载下,TX 电流约 16.65 mA,RX 电流约 7.42 mA,负载功率约 2.75 mW。整体效率约 16.53%,排除源内阻后线圈网络输入端到负载效率约 98.73%。这两个效率不能混,98.73% 不是整机效率,真实系统还要算逆变器、整流器、补偿电容损耗、Litz 线高频损耗、磁芯损耗和温升。

5. 本篇常见报错排查

跑这套流程最容易卡在几个地方,我按实际遇到的报错逐个说。

第一个是 401 Unauthorized。这个基本是 API Key 问题。检查 auth.json 里的 Key 有没有多余空格,检查 config.toml 里 base_url 是不是写成了 https://taotoken.net/api 而不是别的路径。如果 Key 刚生成,等几秒再试,有时候有同步延迟。还有一种情况是 Key 权限不够,去控制台确认这个 Key 有没有开对应模型的调用权限。

第二个是 local proxy failed。这个报错通常出现在 Codex 尝试走本地代理但代理没起来的时候。检查你的环境变量里有没有 HTTP_PROXY 或 HTTPS_PROXY 指向一个不存在的端口。如果有,临时清掉再试。另外 config.toml 里不要写 proxy 字段,除非你确实有本地代理服务在跑。

第三个是 reading choices 相关报错,比如 KeyError: 'choices' 或者 response 里没有 choices 字段。这多半是接口返回了错误结构,常见原因是 wire_api 设错了。如果你用的是 chat 补全接口,wire_api 填 chat;如果用的是 responses 接口,填 responses。填错会导致解析失败。还有一种可能是 Model ID 写错,服务端返回了错误 JSON,解析时找不到 choices。

第四个是 OAuth 相关报错。Codex 某些版本会尝试 OAuth 登录流程,如果你用的是 API Key 模式,需要在配置里明确禁用 OAuth。检查 config.toml 里有没有 prefer_oauth 之类的字段,有的话设成 false。如果报错信息里出现 token refresh failed,说明它在尝试刷新一个不存在的 OAuth token,同样是把认证模式切回 API Key 就行。

第五个是 PyAEDT 侧的报错,最常见的是 COM 接口连接失败,报错类似 "Failed to connect to AEDT"。检查 AEDT 有没有装好,版本号在 specified_version 里写对,2025.2 就写 "2025.2"。如果 AEDT 已经在运行,new_desktop_session 设成 False 复用现有会话。还有网格报错 "mesh generation failed",多半是线圈和磁芯有重叠,检查 core_gap 是不是留了 1 mm。

第六个是动画导出报错 "ffmpeg not found"。matplotlib 存 MP4 需要 ffmpeg,装一下:

pip install imageio-ffmpeg

然后在脚本里指定 writer 路径,或者把 ffmpeg 加到系统 PATH。

排查顺序建议:先确认 API 三件套(Base URL、Key、Model ID)都对,再确认 Codex 能正常返回,最后才查 PyAEDT 和 AEDT 的问题。这样能避免在错误的方向上浪费时间。

6. 继续把模型升级成场路联合仿真

跑通基准模型后,下一步是逐步加真实度。我建议的升级顺序是:先加显式多匝螺旋线圈替代等效圆环,观察匝间电容和高频损耗的影响;再加真实 Litz 线材料参数,把铜的趋肤效应和邻近效应算进去;然后加铝屏蔽板,看它对耦合和漏磁的抑制效果;最后加整流负载和金属异物,做场路联合仿真。

参数扫描这块,基准模型已经扫了线圈间距、横向偏移和磁芯厚度。间距从 10 mm 增到 30 mm,耦合系数从约 0.294 降到 0.094,整体效率从约 40.2% 降到 5.57%,说明轴向距离是最敏感的参数。横向偏移从 0 增到 15 mm,耦合系数从 0.170 降到 0.135,效率降到约 11.15%,实际产品必须考虑定位容差。磁芯厚度从 3 mm 增到 7 mm,效率从约 15.60% 提到 17.27%,提升有限,与其加厚磁芯不如缩短线圈距离。

如果你想把 Codex 用在长期编码和 Agent 场景,比如让它自动跑参数扫描并汇总结果,可以看看 Coding Plan 的用法,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。模型对话调试提示词用 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite ,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。

最后说个实用技巧:把每次仿真的参数和结果存成 CSV,Codex 可以直接读 CSV 帮你画对比曲线和写分析报告。我现在的流程是 PyAEDT 跑完自动导出 results.csv,然后让 Codex 读这个文件生成参数敏感性分析的文字总结,省掉大量手工整理时间。这个简化模型还不能直接用于产品定型,但用来做方案验证和参数筛选已经够用了。

返回列表