☰
【零基础学智能仿真-49】力学仿真智能体初探:从自然语言到可核查的仿真任务
2026/10/13 9:50:37 网站建设 项目流程

课程摘要
前几节课,我们已经能够生成 Abaqus 模型、提取 ODB 数据并检查计算结果。本节让智能体加入这条流程:它负责理解需求、发现缺失条件、整理任务书,却不能凭空补全材料参数或把预测值当作求解结果。我们以两单元受拉杆为例,编写一个仅用 Python 标准库的输入校验程序,为后续工具调用和自动化仿真建立可靠入口。

一、先看一个常见请求

假设工程师对智能体说:

“帮我算一根长 1 m、截面 100 mm² 的钢杆。左端固定,右端施加 10 kN 拉力,给出位移和应力。”

这句话足够让人理解大意,却还不能直接提交求解。至少有一个关键参数未明确:弹性模量是多少?

“钢杆”不能自动等同于某一个确定的 \(E\) 值。智能体可以提出建议,例如“本教学案例是否采用 \(E=210000\ \mathrm{MPa}\),并按小变形、线弹性处理?”,但必须让使用者确认。它还应说明本节采用的是轴向受力杆模型,不适用于弯曲、接触或塑性分析。

这就是智能体与普通批处理脚本的第一个区别:脚本按给定参数执行;智能体还需要识别需求中没有给出什么。

二、智能体在仿真流程中的位置

本课程采用以下分工:

环节负责什么不能代替什么
智能体理解文字需求、追问缺失条件、组织任务不能凭空确定材料参数
校验程序检查字段、单位、数值范围和支持的模型类型不能证明模型符合真实工程
Abaqus按模型进行数值求解不能判断工程需求是否被正确理解
工程师确认假设,判断结果是否可用于决策不应跳过结果核查

因此,完整链条不是“提问 → 智能体回答一个数字”,而是:

\[ \boxed{ \text{自然语言需求} \rightarrow \text{澄清与确认} \rightarrow \text{结构化任务书} \rightarrow \text{输入校验} \rightarrow \text{求解} \rightarrow \text{结果核查} } \]

这里的“输入校验通过”“求解完成”和“工程结论可靠”是三件不同的事。对 AI 系统设置明确的人机职责和验证环节,也是 NIST AI 风险管理框架所强调的思路。

三、把口头需求写成任务书

假设使用者确认 \(E=210000\ \mathrm{MPa}\),我们将请求整理为下面的task.json:

{ "case_id": "bar_demo_001", "model": "two_element_truss", "analysis": "linear_static", "units": "N-mm-MPa", "boundary_condition": "left_fixed_right_axial_pull", "length_mm": 1000, "area_mm2": 100, "youngs_modulus_MPa": 210000, "force_N": 10000 }

几个字段值得特别注意:

  • units明确采用 N–mm–MPa 单位体系,其中 \(1\ \mathrm{MPa}=1\ \mathrm{N/mm^2}\)。
  • model和analysis限定本次只处理前几节使用的两单元、线弹性静力杆模型。
  • boundary_condition指向已审核过的边界条件模板,而不是让语言模型随意编写约束。
  • case_id是案例标识,不应被当作可执行命令。

前几节的 Abaqus 模板使用两个 T2D2 桁架单元。桁架单元只承受轴向力,不提供初始横向刚度,因此该二维教学模型还约束了不需要的横向自由度;这不是可以省略的细节。Abaqus 桁架单元说明对此有明确说明。

四、先做执行前校验

下面的程序只检查任务并计算解析参考值,不会调用 Abaqus。它也不是完整智能体,而是未来智能体调用求解器之前必须经过的一道确定性关口。

import json import math import re import sys from pathlib import Path FIELDS = { "case_id", "model", "analysis", "units", "boundary_condition", "length_mm", "area_mm2", "youngs_modulus_MPa", "force_N", } def validate(task): if not isinstance(task, dict): raise ValueError("任务必须是 JSON 对象") missing = FIELDS - task.keys() extra = task.keys() - FIELDS if missing or extra: raise ValueError( f"字段不匹配:缺少 {sorted(missing)};未知 {sorted(extra)}" ) if not isinstance(task["case_id"], str) or not re.fullmatch( r"[A-Za-z0-9_-]{1,40}", task["case_id"] ): raise ValueError("case_id 格式不正确") required_values = { "model": "two_element_truss", "analysis": "linear_static", "units": "N-mm-MPa", "boundary_condition": "left_fixed_right_axial_pull", } for key, expected in required_values.items(): if task[key] != expected: raise ValueError(f"{key} 必须是 {expected!r}") for key in ( "length_mm", "area_mm2", "youngs_modulus_MPa", "force_N" ): value = task[key] if ( isinstance(value, bool) or not isinstance(value, (int, float)) or not math.isfinite(value) or value <= 0 ): raise ValueError(f"{key} 必须是有限的正数") length = task["length_mm"] area = task["area_mm2"] modulus = task["youngs_modulus_MPa"] force = task["force_N"] u2 = force * length / (2 * modulus * area) u3 = force * length / (modulus * area) stress = force / area return u2, u3, stress def main(): if len(sys.argv) != 2: raise SystemExit( "用法:python lesson49_validate_task.py task.json" ) try: task = json.loads( Path(sys.argv[1]).read_text(encoding="utf-8") ) u2, u3, stress = validate(task) except (OSError, json.JSONDecodeError, ValueError) as exc: raise SystemExit(f"TASK_REJECTED: {exc}") from exc print(f"INPUT_VALID: {task['case_id']}") print( f"理论参考值:u2={u2:.6f} mm, " f"u3={u3:.6f} mm, stress={stress:.3f} MPa" ) print( f"理论参考值:left_reaction=" f"{-task['force_N']:.1f} N" ) print("状态:等待人工确认;本程序未运行 Abaqus") if __name__ == "__main__": main()

配套文件另含一个--self-test自检入口,用于检查正常案例与零截面拒绝逻辑。程序只使用 Python 标准库,无须安装额外软件包。

在这两个文件所在目录运行:

python lesson49_validate_task.py --self-test python lesson49_validate_task.py task.json

预期主要输出为:

SELF_TEST_OK INPUT_VALID: bar_demo_001 理论参考值:u2=0.238095 mm, u3=0.476190 mm, stress=100.000 MPa 理论参考值:left_reaction=-10000.0 N 状态:等待人工确认;本程序未运行 Abaqus

这些数字来自解析公式:

\[ u_2=\frac{FL}{2EA},\qquad u_3=\frac{FL}{EA},\qquad \sigma=\frac{F}{A},\qquad R_{\mathrm{left}}=-F \]

它们用于检查后续求解结果,不是本程序产生的有限元结果。

五、校验通过后,智能体才能做什么?

获得人工确认后,智能体可以把这份任务书交给已审核的建模模板,再依次执行:

  1. 生成.inp文件,并记录所用参数。
  2. 提交 Abaqus 作业,确认作业正常结束。
  3. 从 ODB 提取末端位移、单元应力和左端反力。
  4. 将 ODB 数值与本节解析参考值比较,检查受力平衡。
  5. 报告模型假设、误差和未验证事项。

Abaqus 的官方入门案例也以桁架自由端位移、杆件应力和约束端反力作为相互核查的量;静力平衡要求节点内外力相互抵消。Abaqus 桁架静力分析示例

如果任务书写成“考虑塑性和接触”,当前校验程序会拒绝它。这不是程序“不够聪明”,而是因为现有模板并未验证这些物理过程。智能体此时应报告能力边界,不能悄悄退化成线弹性计算后仍称任务完成。

同样,即使位移和应力与解析解吻合,也只能说明在给定假设下计算一致;没有屈服强度、几何细节和实际工况,就不能进一步宣称“结构安全”。

六、课后练习

在task.json中一次只改一个参数,运行程序并解释变化:

  1. 把force_N改为20000。预期 \(u_3=0.952381\ \mathrm{mm}\)、\(\sigma=200\ \mathrm{MPa}\)、左端反力为 \(-20000\ \mathrm N\)。
  2. 恢复原载荷,把area_mm2改为200。预期 \(u_3=0.238095\ \mathrm{mm}\)、\(\sigma=50\ \mathrm{MPa}\)。
  3. 删除youngs_modulus_MPa,观察拒绝信息。想一想:智能体此时应怎样向使用者提问?

本节的核心结论是:**可靠的仿真智能体,首先要知道何时不能运行。**下一节再把这份经过确认的任务书接入工具调用,讨论求解器状态、失败反馈和结果回传。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询