本节介绍 MATLAB 中几类常见数值问题:一元方程求根、多项式求根、定积分、区间上的函数最小值,以及线性方程组 Ax = b。当解析解难以手算时,可调用对应的数值函数得到近似结果。传给这些求解器的第一个参数通常是函数句柄(可调用对象),而不是某一次求值得到的标量;匿名函数的写法见匿名函数。
求方程根:fzero
求 sin(x) - x/2 = 0 在 x=1 附近的正根。先把方程左端写成关于 x 的函数。该方程在 x=0 处也有根;若只给标量初值 1,部分实现会收敛到 0。给定函数值异号的区间 [1 3],则可得到正根:
f = @(x) sin(x) - x/2;
root = fzero(f, [1 3])root = 1.8955fzero(函数句柄, 区间) 在两端取样并迭代。第一个参数必须是函数本身:写成 fzero(sin(1)-1/2, [1 3]) 传入的是已经算完的数,求解器无法再换不同的 x 取样。两端函数值宜异号,否则可能找不到根。第二个参数也可以是标量初值,此时求解器自行搜索区间,结果依赖于实现,不一定落在你预期的那一个根上。
若方程有多个根,一次调用只返回区间或初值附近的一个。换一组初值或区间再求,才能得到其它根。
多项式求根:roots
多项式有固定的系数向量,不必再写匿名函数。解 2x^2 + 4x - 4 = 0 时,把系数从高次到低次排成一行:
p = [2 4 -4];
r = roots(p)r =
-2.7321
0.7321最高次项系数为 2,一次项为 4,常数项为 -4,两根为 -1±√3。屏幕上的先后顺序依实现而定,不必与上表逐行相同。缺某一幂次时须用 0 占位,例如 x^3 + 1 写成 [1 0 0 1]。由根还原系数用 poly:
poly(r)得到的向量与原系数成比例(可能差一个常数倍),次数应与原来一致。
求数值积分:integral
计算从 0 到 1 的 x^2 定积分。被积函数作用在求解器给出的一批采样点上,乘方须用点运算 .^:
area = integral(@(x) x.^2, 0, 1)area = 0.3333精确值是 1/3 ≈ 0.3333。积分限为有限数时,integral(函数句柄, a, b) 即可。二维、三维积分可用 integral2、integral3。若当前环境没有 integral,可查阅帮助中的 quad 等同类函数。
求最小值:fminbnd / fminsearch
在给定闭区间上找一元函数的最小值点,使用 fminbnd。下面在 [0, 3] 上求 cos(x) 的最小点:
[xmin, fmin] = fminbnd(@(x) cos(x), 0, 3)xmin = 3.1416
fmin = -1.0000找到的 x 约等于 π,函数值约 -1。第一个输出是自变量,第二个是该处的函数值。fminbnd 只处理单变量且必须给出区间;无约束或多变量问题更常用 fminsearch,例如:
[x2, f2] = fminsearch(@(x) (x(1)-1)^2 + (x(2)+2)^2, [0 0])初值 [0 0] 是二维点,目标函数应返回标量。得到的 x 应接近 (1, -2),函数值接近 0。
解方程组:矩阵左除
线性方程组 Ax = b 用左除 A\b,不必先求逆:
f = @(x) sin(x) - x/2;
disp(fzero(f, [1 3]))
p = [2 4 -4];
disp(roots(p))
A = [2 3; 1 1];
b = [8; 3];
disp(A \ b)输出:
1.8955
-2.7321
0.7321
1
2上例中方程组为 2x+3y=8、x+y=3,解为 x=1、y=2。应使用 A\b 而不是 inv(A)*b:左除会按方程组结构选择更稳妥的算法,也避免显式求逆带来的额外误差。系数矩阵接近奇异时,结果可能对微小扰动敏感,求解后可将 A*x - b 的范数作为残差检查。
数值与符号
| 需求 | 用 |
|---|---|
| 求具体数值解 | fzero / roots / integral / A\b |
| 得到精确代数表达式 | 符号计算(Symbolic Math Toolbox) |
| 常微分方程初值问题 | ode45 等求解器 |
本教程其余章节均按数值计算展开。符号工具箱与常微分方程求解器超出入门范围,需要时再查阅对应帮助。
动手练习
- 用
fzero求cos(x) - x = 0在 0 附近的根。 - 用
roots解x^3 - 6x^2 + 11x - 6 = 0,系数向量不要漏写缺项。 - 用
integral求sin(x)从 0 到 π 的积分(应接近 2)。 - 用
fminbnd找sin(x)+x在 [0, 2π] 上的最小值点。
本节说明了 fzero、roots、integral、fminbnd 与矩阵左除在数值求解中的角色,并对照符号计算与常微分方程求解器的适用边界。下一节介绍字符串类型与编程习惯:char 与 string 的差异及向量化等实践建议。