一阶可分离变量的微分方程 (Separable First-Order Differential Equations) 及其 初值问题 (Initial Value Problem)。关键信号:出现 dy/dx,且等式右边可以通过乘除法把 x 和 y 的项彻底拆分开。"乘除关系"就是触发"分离变量法"的最强烈信号。
y^(-2) dy = x^2 dx。-1/y,右边积分得 (x^3)/3。最后任意找一边加上常数 C。得到:-1/y = (x^3)/3 + C。-1/(-3) = (2^3)/3 + C,得到 C = 1/3 - 8/3 = -7/3。y = 3/(7 - x^3) 或者 -3/(x^3 - 7)。遇乘除想分家,左甩 y 右甩 x;两头齐积分必加 C,千万立刻代初值,查底细再反解孤立的 y。生吃夹生饭(留着 C 反解 y 再算常数)极其容易眼花坠崖!
当你看到长得像 M(x,y) dx + N(x,y) dy = 0 的怪物方程,且题目要求你勾选 Exact (恰当) 的方程时。不要慌,这不需要你解方程,仅仅是微积分基础的“偏导数交叉检验”。
dx 前面的一大坨包起来叫 M;紧紧贴在 dy 前面的叫 N。陷阱:教授最喜欢在常数项和正负号上做文章!比如 M = ... - 2x sin(x^2) y,对 y 求偏导结果是 -2x sin(x^2)。而 N = ... + cos(x^2),对 x 求偏导会因为 cos 求导变负数,并且用链式法则掏出个 2x,结果也是 -2x sin(x^2)。看似长得不一样,其实指纹完全吻合!在纸上一步步写好这两行,一对比就出答案。
用来解长得像 y'' + p y' + q y = f(x) 的二阶微分方程。题目通常直接把齐次解(等于零的形式)的答案 y_h 扔给你了,只要求你猜特解 (Particular Solution) y_p 的雏形并算出来。
f(x) 是什么脸型,你的雏形就猜什么脸型!
3x+4),就猜 y_p = ax + b6 e^{2x}),极其无脑地猜 y_p = a e^{2x}cos(3x)),必须猜一套完整的 y_p = a cos(3x) + b sin(3x)y_h 对比!如果你的指数(比如 2x)刚好和 y_h 里的 -4x 不一样,安全!如果长得完全一样(撞车了),那就得在前面粗暴地乘上一个 x 避险。y_p 连求两阶导数,代回原方程左侧对齐消消乐,强行把常数 a 揪出来!如果你的答案里有带分数的系数加上常数 $e$ 的指数。往系统里填必须严格使用星号隔开,并且把 $e$ 写全!比如不能写 e^(2x)/6,必须写出极简格式的 1/6*exp(2*x)。不要省略任何乘号!
当你看到 y·y'' + (y')² = 0 这种非线性怪物方程时,不要慌。关键信号:y 乘以自己的二阶导 和 一阶导的平方 同时出现。这是一个隐藏的"全微分"结构:(y · y')' = y'·y' + y·y'' = (y')² + y·y'',恰好等于方程左边!
这类非线性 ODE 题目明确说了 "You will need the Maple computer algebra system",所以考场上直接用 dsolve 秒杀:
dsolve({y(x)*diff(y(x), x $ 2) + diff(y(x), x)^2 = 0, y(0) = 5, D(y)(0) = 6}, y(x))
输出: y(x) = sqrt(60*x + 25)
填空只填等号右边: sqrt(60*x+25)
方程变成 y·y'' - 1/2·(y')² = 0,初值 y(0)=3, y'(0)=4。注意减号和 1/2 系数!
dsolve({y(x)*diff(y(x), x $ 2) - 1/2*(diff(y(x), x)^2) = 0, y(0) = 3, D(y)(0) = 4}, y(x))
输出: y(x) = 4*(x + 3/2)^2 / 3
填空: (4*(x + 3/2)^2)/3
⚠️ 万能套路:不管系数怎么变(+1、-1/2、+3...),Maple 代码只需要把方程原样翻译进去。你只需要做好三件事:①把数学符号精确翻译成 Maple 语法 ②初值用 y(0) 和 D(y)(0) ③全部塞进大括号。剩下的交给机器!
y(x),不能只写 ydiff(y(x), x $ 2) 或 diff(y(x), x, x)D(y)(0) = 6,不能写 y'(0)题目让你求 e^(3x)·cos(2x) 在 x=0 处的 Taylor 级数展开中,某几项的系数(比如 a₀ 和 a₇)。本质上不是考你手算 7 次导,而是考你会不会让 Maple 自动展开级数,然后直接读系数。
series(exp(3*x)*cos(2*x), x=0, 8);
输出类似: 1 + 3*x + (5/2)*x^2 + ... - (1483/1680)*x^7 + O(x^8)
读答案: 常数项 = 1(即 a₀ = 1),x^7 前面的系数 = -1483/1680(即 a₇ = -1483/1680)
⚠️ 重要:最后的数字 8 表示"展开到小于 8 次",意味着包含 x^0 到 x^7。想看 x^7 的系数就写 8,想看 x^n 的系数就写 n+1!
coeff(series(exp(3*x)*cos(2*x), x=0, 8), x, 0);
coeff(series(exp(3*x)*cos(2*x), x=0, 8), x, 7);
第一行输出: 1(就是 a₀)
第二行输出: -1483/1680(就是 a₇)
coeff(表达式, x, k) 的意思就是"把 x^k 前面的系数给我取出来"。
| Maple 语法 | 含义 |
|---|---|
exp(x) | e^x |
cos(x), sin(x) | 三角函数 |
series(f, x=a, n) | 在 x=a 处展开级数,包含到 x^(n-1) |
coeff(expr, x, k) | 取 x^k 的系数 |
x=0 | Maclaurin 展开(about 0) |
以后遇到"求 Taylor 展开某一项系数"的题,直接套:coeff(series(函数, x=展开点, 阶数+1), x, 阶数)。填空答案直接从 Maple 输出里复制。a₀ = 1,a₇ = -1483/1680
题目给你一个递推公式(比如 a_{n+1} = sin((1 + a_n/4)^2)),要你写一个 Maple procedure(过程/函数),用 for 循环迭代算到第 m 项,然后检查最后两项的差是否小于 10^(-13)。满足条件就返回 a[m],否则返回 -1。
a[0] := 0;a[i]abs(a[m]-a[m-1]) < 10^(-13) 判断最后两项够不够接近a[m],否则返回 -1Digits := 30:
f := proc(m)
local a, i;
a[0] := 0;
for i from 1 to m do
a[i] := evalf(sin((1 + a[i-1]/4)^2));
end do;
if abs(a[m]-a[m-1]) < 10^(-13) then
a[m];
else
-1;
end if;
end proc:
f(4);
f(11);
f(4) 输出: -1(前 4 项差距还太大,不满足收敛条件)
f(11) 输出: 0.999965406070608925874283903615
| 下拉框位置 | 应选内容 | 为什么 |
|---|---|---|
| 第一空(定义) | f := proc(m) | 定义过程,输入参数 m |
| for from | 1 | a[0] 已知,从 i=1 开始算 |
| for to | m | 算到第 m 项 |
| 循环体 | a[i] := evalf(sin((1+a[i-1]/4)^2)) | 递推公式 + evalf 强制数值计算 |
| if then | a[m] | 收敛了就返回当前项 |
| else | -1 | 没收敛就返回 -1 |
四步秒认:①先给 a[0] ②for 循环从 1 到 m ③循环体放递推公式(记得 evalf!)④if 检查差值返回 a[m] 或 -1。以后只要看到"递推 + procedure + 收敛检查",全都是这个骨架,只需要替换中间的递推公式即可!
这道题包含两个子题。(a) 用 for 循环配合 add() 求和函数批量计算一个求和式;(b) 用 for 循环和多项递推公式(涉及 a[n], a[n-1], a[n-2] 三项)算出数列的第 80 项。
题目要求:对 k 从 3 到 50,每个 k 都算出 ∑(n=12 到 29) sin(k/n) 的值。
for k from 3 to 50 do
evalf(add(sin(k/n), n=12..29));
end do;
| 下拉框 | 应选 | 原因 |
|---|---|---|
| for ___ | k | 外层循环变量是 k |
| from ___ | 3 | k 从 3 开始 |
| to ___ | 50 | k 到 50 结束 |
| 循环体 | evalf(add(sin(k/n), n=12..29)) | add() 做内层求和,evalf 算出小数 |
⚠️ 区分 add 和 sum:add() 用于数值计算求和,sum() 用于符号计算。机考里 99% 的情况用 add()!
递推公式:a_{n+1} = a_n - 4·a_{n-1} + a_{n-2},for n = 3, 4, 5, ...。已知 a[1]=3, a[2]=-1, a[3]=-1。求 a[80]。
a[1] := 3:
a[2] := -1:
a[3] := -1:
for n from 3 to 79 do
a[n+1] := a[n] - 4*a[n-1] + a[n-2];
end do:
a[80];
输出: -5947589900344241186765
⚠️ 致命陷阱 — 循环范围:公式是 a_{n+1} = ...,for n。已知到 a[3],所以 n 从 3 开始。要算到 a[80],因为公式算的是 a[n+1],所以 n 最大到 79(79+1=80)。千万别写成 for n from 3 to 80,那样会多算一项 a[81]!
如果公式写的是 a[n+1] = f(a[n], a[n-1], ...):你想算到 a[目标],那 for 循环的 to 就是目标 - 1。想算 a[80] 就跑到 79,想算 a[100] 就跑到 99。因为循环体里算的是"下一项"(n+1),所以 n 本身要比目标少 1。