单位 5 / 11

数值计算、Python 和代码生成

收益:

  • 能够区分符号微积分和数值微积分,并为每个问题选择正确的工具(SymPy 或 NumPy/SciPy)
  • 能够阅读和理解人工智能生成的数字代码,自己运行它,并通过使用已知输入执行常识测试来验证它。
  • 了解浮点数精度的限制,使用容差而不是精确相等,并管理初始猜测对数值方法的影响。

符号微积分给出积分或方程的精确公式;但数学中的大多数实际问题不能通过封闭公式来解决。这就是数值计算发挥作用的地方:产生具有所需精度的近似数值结果,而不是精确的公式。求出精确到 0.001 精度的积分值、计算小数近似值的方程根、从数据集中提取统计数据——这些都是数值计算。在 Python 中,实现此目的的工具是 NumPy(数值数组和数学)和 SciPy(科学计算)库。在本单元中,您将学习使用人工智能作为助手,生成用于数值计算的Python代码并检查代码的正确性。

一个关键的定义:浮点数是计算机存储精度有限的十进制数的一种格式。这就是为什么在计算机算术中,0.1 + 0.2 可能会变成 0.30000000000000004,而不是 0.3。这不是一个错误,这是数值计算的本质——但如果你没有意识到这一点,就会导致错误的结果。在数值计算中,人们使用“足够接近”而不是“完全相等”。

符号还是数字?选择正确的工具

状态

符号(SymPy)

数值(NumPy/SciPy)

存在一个闭式

首选

没有必要

没有公式/太复杂

无法解决

首选

要求完全精确

是的

大约。

大数据/多重处理

非常快

带小数的结果就足够了

适合的

一个好的实践者会同时使用这两种方法:如果可能的话用符号求解,如果不能的话用数值方法求解,并尽可能地交叉检查其中一个。

循序渐进:利用人工智能确保数值计算安全

1. 确定问题和敏感性。 “小数点后有多少位?”以及“在什么范围内?”澄清你的问题。

2.向AI写入代码,而不是输出。记住第4单元:不要让AI预测代码输出。你运行代码。

3.阅读并理解代码。逐行理解生成的代码。正确的库、正确的函数、正确的参数?不要运行您不理解的代码。

4. 用已知情况进行测试。尝试使用您已经知道答案的简单输入来编写代码。例如,sin(0)=0,就像已知积分的值一样。如果代码正确给出,您就会更加信任它。

5. 符号或手动交叉检查。如果可能,请使用 SymPy 或手动方法确认相同的结果。

6.谨防浮点陷阱。不要使用 == 严格相等,而是使用公差,例如 abs(a - b) < 1e-9。

提示:始终“用您知道的答案”测试数字代码。如果您编写了求根器,请首先将其应用于具有已知根 (x=±2) 的方程,例如 x²−4=0。如果代码发现这是正确的,那么它对于您不知道的方程就更有可能可靠。这种“健全性检查”是最便宜的验证。

数值微积分的陷阱:收敛和误差累积。

大多数数值方法都是迭代工作的:从最初的猜测开始,逐渐接近实际答案。这个越来越接近的过程称为收敛。但并不是所有的迭代方法总是收敛的。有些发散(偏离结果)或收敛到不正确的值。如果人工智能生成的代码不检查方法是否收敛,它可能会默默地给你一个错误的数字。因此,仅仅因为一个数值结果“产生了一个数字”并不能证明它是真的;而是因为它“产生了一个数字”。还必须确认该数字实际上收敛于所寻求的解决方案。

第二个微妙之处是错误累积。在一长串的计算中,每一步的小浮点舍入误差会累积并变得更大;特别是当您取两个非常接近的大数的差值时(这称为灾难性抵消),结果的有效数字可能会丢失。人工智能并不总能预测此类数值稳定性问题。在关键计算中,用不同的方法或更高精度重新计算和比较结果会揭示隐藏的误差累积。

注意:数值方法的“给出结果”和“收敛到正确的结果”是两个不同的事情。确保代码包含收敛检查(例如,两个连续步骤之间的差异变得足够小);如果不包含,请让人工智能添加此控件。

三个迷你箱子

情况 1 — 功能选择不正确。一名学生向 AI 索要代码来查找函数的根。 AI 使用 scipy.optimize.fsolve,但选择了错误的初始猜测并收敛到错误的根。学生首先通过绘制函数图来检查该函数(参见可视化单元),给出正确的初始猜测,并找到实根。教训:数字寻根器对起点很敏感。

情况 2 — 浮点陷阱。一位工程师运行了一段人工智能代码,编写了 if 0.1 + 0.2 == 0.3: 并意识到该条件从来都不是真的。 AI忽略了浮点精度。代码已更正为 abs((0.1+0.2) - 0.3) < 1e-9。 1e-9的意思是“十到负九”,一个非常小的公差。

案例 3 — 常识测试发现了错误。一位老师从 scipy.integrate.quad 收到了用于数值计算定积分的代码。他首先用已知的积分进行了测试,例如 ∫₀1 x dx = 0.5;代码给出了0.5。然后他计算了实际积分并用 SymPy 确认了结果。当两种独立的方法给出相同的结果时,他就会相信。总时间:6分钟。

四个可复制模板

1) 请求数字帐户代码:

编写 Python 代码,以数字方式解决以下问题:[问题]。使用 NumPy/SciPy。灵敏度:[例如6 位小数]。我将运行代码;预测输出。在注释行中简要解释您选择的函数以及原因。

2)添加常识测试:

在此代码中添加常识性检查,以在运行之前测试其正确性:使用已知答案的简单输入进行尝试(例如 x²-4=0 的 root ±2),并检查它是否给出预期结果。代码:[此处]

3)符号-数字交叉检查:

编写代码,使用 SymPy(符号)和 SciPy(数值)求解以下积分/方程:[问题]。打印出两个结果,以便我可以比较它们。添加一行来检查与 abs() 的差异。

4)浮点安全:

查看此代码中的浮点数比较。如果存在严格的“==”相等,请将其替换为适当的容差(abs(a-b) < 1e-9)并解释原因。代码:[此处]

弱提示/强提示

弱:“求这个方程的根:x³ − 2x − 5 = 0。写下答案。”
结果:AI 拟合出一个十进制数(例如“2.0946...”)。它可能是真的,也可能不是;由于尚未运行,因此尚未验证。
功能强大:“编写一段代码,用 SciPy 找到方程 x3 − 2x − 5 = 0 的实根。对于初始猜测,首先指定函数改变符号的区间。添加一行来替换根并检查结果是否为 ~0。我将看到输出。”
结果:可执行代码、准确的初始猜测、内置哈希值。根的有效性已得到证明。

常见错误

  • 无需运行代码即可信任结果。人工智能“预测”的数字输出并不是验证。
  • 使用“==”测试浮点相等性。它几乎总是错误的;使用宽容。
  • 最初的预测不好。数值根/优化方法对起点敏感;它可能会收敛到错误的根。
  • 不表达敏感。 “多少步?”如果不询问,结果可能不符合需要。
  • 没有进行常识测试。将代码应用于实际问题而不使用已知输入进行测试是有风险的。
  • 在不理解代码的情况下运行代码。您不理解的代码可能使用了错误的函数;理解每一行。
注意:数值结果始终是近似值。不要说“结果就是这个”,而要说“这就是那个”。在工程或科学报告中,说明所使用的方法和精度是准确性的一部分。将近似结果作为最终结果是具有误导性的。

综上所述

对于封闭公式无法解决的问题,数值微积分给出了近似但实用的结果;在Python中,它的工具是NumPy和SciPy。 AI 可以快速为这些库生成代码,但您必须运行代码、阅读并理解它,并使用已知的输入对其进行测试。请注意浮点精度:使用容差而不是精确相等。如果可能的话,交叉检查符号和数字方法。常识测试和替代是最便宜、最有效的验证。

应用任务

选择一个难以用封闭公式解决的问题(例如,根 x3 − 2x − 5 = 0,或非初等积分的定值)。让 AI 打印数字代码,如果可能的话,使用模板 1 和 3 打印符号数字交叉检查代码。在真实的 Python 环境中运行代码。首先用已知的输入进行常识测试,然后解决实际问题。如果存在浮点比较,请务必使用容差。注意结果及其灵敏度。

清单

  • [ ] 我确定了问题和所需的灵敏度。
  • [ ] 我逐行阅读并理解了AI生成的代码。
  • [ ] 我在真实的Python环境中运行了代码。
  • [ ] 我用已知的输入做了常识测试。
  • [ ] 如果可能的话,我添加了符号/手动交叉检查。
  • [ ] 我在浮点比较中使用了容差。