作业 3:神经网络学习加法与 PINN 求解静电势
截止时间与提交位置
截止时间:2026 年 10 月 30 日 23:59(北京时间)。 请将作业放入服务器个人主目录的 ~/homework3/ 文件夹。
本次作业共 10 分。请在提供的 Python 骨架上补全代码,不需要从零搭建项目。两部分分别展示从样本学习映射,以及利用物理方程求解未知函数。
一、用神经网络学习加法(5 分)
运行 starter/addition.py。输入是两个 0~999999 的随机非负整数,每个数按六位十进制数字独热编码(不足六位时高位补 0);网络输出七位数字,表示它们的和。
程序已给出数字编码、网络结构和数据生成函数。请在主程序标出的区域补全训练代码,训练后保存 addition_model.pt。
助教将加载模型,在统一的 1000 道独立测试题上计算准确率(完整加法结果正确才计为答对)。准确率达到 80% 得 3 分(及格),达到 95% 得 5 分(满分);0~80% 对应 0~3 分,80%~95% 对应 3~5 分,各区间内线性赋分。
想一想(选做,不计分):为什么这里采用独热编码,而不是把每个六位数拆成六个数字直接输入?有兴趣可以另建副本,调整输入层并比较两种编码的训练效果;不要求提交,正式提交的模型仍使用提供的网络结构。
二、用 PINN 求解二维静电势(5 分)
PINN 是什么? PINN(Physics-Informed Neural Network,物理信息神经网络)用神经网络表示待求的函数,再通过自动求导计算它的导数,检查它是否满足微分方程和边界条件,并据此调整网络参数。本题不提供电势的训练标签,而是用已知的方程和边界条件指导网络求解电势。
在区域
四条边均接地,即:
网络输入坐标 (x, y),输出电势 φ(x, y)。starter/pinn.py 已提供网络、取样、自动求导和绘图。请根据方程与边界条件自行设计损失函数。
补全 physics_loss 和主程序中的训练循环,训练并保存 pinn.pt。
解析解为:
解析解仅用于训练后的检查,不能作为训练标签或代替网络输出。训练时可以使用题目给定的电荷密度。
助教将加载模型,在包含边界的 81 × 81 均匀网格上,计算网络电势与解析解的平均绝对误差(MAE,即各点误差的绝对值取平均,与 show_result 的计算方式相同),按下表评分:
| 平均绝对误差 E | 得分 |
|---|---|
| E ≤ 0.001 | 5 分(满分) |
| E = 0.01 | 3 分(及格) |
| E ≥ 0.05 | 0 分 |
0.001~0.01、0.01~0.05 两个区间内分别线性赋分,误差越小得分越高。最大绝对误差用于自查,不单独计分。
三、比较两种神经网络的作用(选做,不计分)
请思考:两道题中神经网络起到的作用有何不同?
提交内容
请将以下文件放入服务器个人主目录的 ~/homework3/ 文件夹:
- 补全后的
addition.py和pinn.py。 - 训练好的
addition_model.pt和pinn.pt。
代码应能在服务器的 pubpy 环境中运行,不提交缓存文件。比较分析选交,不计分。
截止时间:2026 年 10 月 30 日 23:59(北京时间)。
参考示例 提供谐振子前三个能级和波函数的示例,供有兴趣的同学了解 PINN 在简单物理问题中的应用;不属于必做任务,也不计分。
作业材料
| 材料 | 内容 |
|---|---|
| 完整材料包(ZIP) | 作业说明、PyTorch 入门、代码骨架与选读案例 |
| 作业说明原文 | 题目、评分方式与提交要求 |
| PyTorch 简明入门 | 网络结构、训练和自动求导 |
| 材料使用说明 | 文件说明与运行方法 |
| 加法代码骨架 | 补全训练代码,保存 addition_model.pt |
| PINN 代码骨架 | 补全物理损失和训练循环,保存 pinn.pt |
| 依赖列表 | NumPy、Matplotlib、PyTorch |
| 谐振子拓展案例说明 | 选读、不计分;代码包含在完整材料包中 |