Matlab解方程或者方程组的方法总结
1. 多项式求根函数roots
r = roots(p)
- 向量p表示多项式,p为n阶多项式从高阶到低阶的系数向量,长度为n+1
- r为所求所有根
例:
p = [1, -8, 5, 9]; % 即多项式 *x^3 - 8*x^2 + 5*x + 9
roots(p)
ans =
7.1203
1.6471
-0.7674
2. 单变量非线性方程求根函数fzero
[x,fval] = fzero(fun, x0) % 求初始点x0附近的根
- fun为所求的非线性方程,用一个M文件保存或者使用匿名函数
- x0为迭代求根的初始点,也即求这个初始点附近的根
- x为求出的根
- fval为在所求根处的fun函数值——即0
例:
f = @(x) x^2 + 3*x + 1;
x = fzero(f, 0)
x =
-0.3820
3. 使用solve函数求解符号解
sol = solve(prob)
sol = solve(prob, x0)
- prob为方程或者方程组
- x0为初值
- sol为所求根
例1:
% 解方程
syms x;
sol = solve(x^2 - 3*x + 1, x);
ans =
3/2 - 5^(1/2)/2
5^(1/2)/2 + 3/2
例2:
% 解方程组
syms u v a;
y = [2*u + v == a, u - v == 1]; % 方程组
[res_u, res_v] = solve(y, [u, v]); % 要求解的变量是u和v
res_u
res_v
res_u =
a/3 + 1/3
res_v =
a/3 - 2/3
4. 使用vpasolve函数,以数字方式求解符号方程
S = vpasolve(eqn,var,init_param)
- eqn为求解函数
- var为求解变量
- init_param为搜索范围
例1:
% 解方程
syms x;
equation = sin(x) == x^2 - 1;
vpasolve(equation1, x, [0, 2]) % 求在[0, 2]中的解
ans =
1.4096240040025962492355939705895
例2:
%解方程组
syms x y;
eqn = [x^2 - 2*x - 3*x*y == 10, y^4 == exp(-2*x/3)];
[res_x, res_y] = vpasolve(eqn, [x, y])
res_x =
-1.393259627845404026653388391876
res_y =
1.261384513542676943005039668231
注:vpasolve函数对多项式方程求解才会给出所有的解,其他类型只会返回一个解,可以通过以下形式,多次运行可求得非多项式方程的多个解
[res_x, res_y] = vpasolve(eqn, [x, y], 'random', true)
5. 使用fsolve函数
x = fsolve(fun,x0)
- fun为求解方程或者方程组,以匿名函数或者M文件方式存在
- x0为求解搜索初值
- x为所求根
例:
% 求解非线性方程组
f = @(x) [exp(-exp(-(x(1) + x(2)))) - x(2)*(1+x(1)^2), x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5 ];
fsolve(f, [0, 0], optimset('Display', 'off'))
ans =
0.3532 0.6061
6. 线性方程组可直接由Matlab矩阵运算求解
% 线性方程组:
% 2*x1 + 3*x2 - x3 = 10
% 2*x2 + x3 = -5
% 2*x1 + x2 = 6
c = [2, 3, -1;
0, 2, 3;
2, 1, 0];
b = [10, -5, 6]';
x = c \ b
x =
2.5625
0.8750
-2.2500