欢迎光临
我们一直在努力

用 MWORKS Syslab 跑完 48 道数学题:从微积分到洛伦兹混沌都能怎么算?

最近在 MoHub 上看到一套《数学试题(Syslab 科学计算 48 题)》,从求导、积分一直做到优化和微分方程,而且每道题都配了 Julia 脚本。

我比较好奇的是:这些题如果真的全部跑一遍,结果能不能和数学答案对上?

于是我在 MWORKS Syslab 2026b 中把 48 个脚本逐个运行了一遍。整体结果不错:47 题可以直接运行,只有 1 题因为 Julia 作用域写法报错。

更有意思的是,实跑过程中还发现了几个只看参考答案不太容易注意到的问题。

48 道题都在算什么?

题库分成四部分,每部分 12 题:

模块主要内容
高等数学 极值、积分、极限、泰勒展开、傅里叶/拉普拉斯变换
概率统计 概率分布、置信区间、假设检验、回归、ANOVA、蒙特卡罗
最优化 线性/整数/非线性/凸优化、粒子群、遗传算法、模拟退火
微分方程 ODE、RK4、SIR、热传导、时滞方程、洛伦兹系统

用到的主要是 TySymbolicMath、TyStatistics、TyOptimization、TyConvex、TyGlobalOptimization、DifferentialEquations 和 TyPlot。

每道题都是一个独立的 .jl 文件,所以不需要把整个项目搞明白,选一道题就可以单独运行。

高数部分:符号结果和数值结果能对上

前 12 题比较接近常见的大学高数实验。

例如计算:

∫₀^π sin(x)dx

符号积分得到:

2

数值积分得到:

2.0000000000000004

这里多出来的尾数只是浮点数表示造成的。

多重积分也有类似现象:

∬(x²+y²)dxdy,区域为 [0,1]×[0,1]

符号计算直接返回精确值:

2/3

数值计算得到:

0.6666666666666669

另外,多项式求根、部分分式、拉普拉斯变换等结果也基本能和参考答案对应。

不过泰勒展开这里遇到了一个小问题。

题目希望得到:

sin(x)≈x−x³/6+x⁵/120

但脚本设置 Order=5 后,实际只返回:

x−x³/6

我又调整参数试了几次,发现这里的 Order 更接近“截断到哪个幂次”,而不是“数学教材里所说的几阶展开”。设置到 Order=6 之后,x⁵/120 才会出现。

图1 sin(x)的泰勒多项式逼近

这不算算法错误,但如果直接把“5 阶泰勒展开”和 Order=5 画等号,就容易产生理解偏差。

概率统计:结果每次不一样反而是正常的

概率统计的 12 道题包括正态分布、二项分布、大数定律、置信区间、t 检验、回归、方差分析和蒙特卡罗等。

其中有不少脚本使用随机数,所以每次运行结果并不完全相同。

例如大数定律实验,本次运行得到:

  • n=10:0.51209

  • n=100:0.48662

  • n=1000:0.49906

  • n=10000:0.50684

理论均值是 0.5。

有意思的是,n=1000 时离 0.5 很近,但到了 n=10000,单次结果反而偏得更远了一些。

这并不违背大数定律。样本量增加后,整体误差量级会下降,但某一次随机实验并不保证单调接近理论值。

图2 中心极限定理样本均值直方图

方差分析的结果则可以直接手工复核。

三组材料强度数据经过 anova1 得到:

F=15.4,p≈0.00015264

根据原始数据重新计算,组间平方和为 184.8,组内平方和为 102:

MSB=184.8/2=92.4

MSW=102/17=6

所以:

F=92.4/6=15.4

和 Syslab 输出完全一致。

这种题我觉得比较适合课堂实验:先让软件给答案,再把 ANOVA 表里的数字重新手算一次,比单纯记公式更直观。

优化部分,反而发现了最值得看的问题

优化模块包含 linprog、intlinprog、fminunc、fmincon、quadprog,以及粒子群、遗传算法和模拟退火。

线性规划返回:

x=[2,6],最大利润=36

0-1 背包返回:

[0,1,1],最大价值=22

都可以通过枚举直接验证。

Ackley 函数的粒子群搜索也跑到了接近原点的位置,目标值约为 10⁻¹³;Rastrigin 函数使用模拟退火则直接得到 (0,0),目标值为 0。

但第 28 题的 Rosenbrock 约束优化比较有意思。

原脚本从 [-1,2] 出发,fmincon 返回:

x≈(-0.9976,0.9951)

f(x)≈3.9903

我换成 [0.5,0.5] 重新运行,却得到:

x≈(0.5022,0.2489)

f(x)≈0.2489

目标值一下差了约 16 倍。

为了确认哪个更合理,我又沿约束边界扫描了 2 万个点,最低值同样约为 0.248897,位置就在 x₁≈0.5022 附近。

图3 约束Rosenbrock初值敏感性

这其实把局部优化的特点展示得很清楚:

求解器返回一个结果,并不意味着已经证明它是全局最优解。

对于这类非凸问题,初值会直接影响搜索过程。实际使用时,多换几个初值甚至配合全局搜索做验证,比只看一次 fmincon 输出更稳妥。

48 题里唯一没直接跑通的一题

第 35 题是手写梯度下降。

算法本身没有问题,但脚本在 Julia 顶层循环中对变量 x 重新赋值,触发了软作用域问题,最终报:

UndefVarError: x not defined

我把迭代过程封装进函数后重新运行,得到:

x≈(2.24999,-4.74997)

而解析最优点为:

(2.25,-4.75)

两者非常接近。

所以这一题的问题不是梯度下降算法,而是 Julia 的变量作用域写法。对于刚开始写 Julia 的人来说,这个报错反而挺有代表性。

微分方程部分比想象中丰富

最后 12 题从最简单的:

dy/dt=y

一直做到热传导、SIR、Lotka-Volterra、时滞微分方程和洛伦兹混沌。

其中 RK4 的实验比较适合观察数值方法的精度。

步数从 10、20、40 增加到 80、160 后,相邻两次误差之比逐渐接近:

16

这正好对应经典 RK4 的四阶收敛特性:步长减半后,误差理论上大约缩小 2⁴=16 倍。

热传导案例也可以和解析解比较。

数值计算在指定位置得到:

0.00724904

解析结果约为:

0.00719188

两者相差约 5.7×10⁻⁵。

而洛伦兹系统则更适合看可视化。σ=10、ρ=28、β=8/3 时,可以直接画出比较典型的三维洛伦兹吸引子。

图4 洛伦兹吸引子三维相轨迹

跑完 48 题之后的一点感受

这套题库给我的感觉不像传统的“48 道练习题”。

它更像是把数学课里经常手算的东西,分别用 Julia 又实现了一遍:高数可以比较符号解和数值解,概率统计可以观察随机波动,优化问题可以检查求解器结果,微分方程则可以继续看误差和动态过程。

而且真正逐题运行后,也能发现一些参考答案之外的问题:

泰勒展开的 Order 参数和教材里的“阶”并不是完全相同的概念;局部优化对初值敏感;Julia 顶层循环还有软作用域问题;随机类题目则不应该期待每次得到完全相同的数字。

这些地方反而比“48 道题全部得到标准答案”更有意思。

如果正在学习 Julia 科学计算,或者想把高数、概率统计、优化、微分方程中的一些公式变成可以直接运行的程序,这套题可以作为一组比较集中的练习。

本文使用的是 MoHub 上的《数学试题(Syslab 科学计算 48 题)》:

仓库地址:

https://mohub.net/model/26417/summary

赞(0)
未经允许不得转载:171主机测评 » 用 MWORKS Syslab 跑完 48 道数学题:从微积分到洛伦兹混沌都能怎么算?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址