在学习求方程的根时,使用MATLAB经常会遇到困难,感觉简单的运算没有简单且好的方法。在非线性方程中,有多项式函数和复杂函数,对于多项式的求解比较系统化,使用roots命令或solve命令可以求解,但二者格式有些不同。对于复杂函数,以上两者直接求解会有问题,又希望避免复杂的算法,因此可以采用fzero命令来实现一个简单的非线性方程求解。
一、求多项式方程 的所有根
1、使用roots命令求解,代码如下:
clc;
clear all;
%求x.^5+2022*x-10=0的所有根
p=[1 0 0 0 2022 10];%多项式系数矩阵
roots(p)
结果:
ans =
4.7429 + 4.7417i
4.7429 - 4.7417i
-4.7404 + 4.7417i
-4.7404 - 4.7417i
-0.0049 + 0.0000i
2、使用solve命令求解,代码如下:
clc;
clear all;
%求x.^5+2022*x-10=0的所有根
syms x;%定义变量
f=x.^5+2022*x-10;
solve(f,x)
结果:
ans =
root(z^5 + 2022*z - 10, z, 1)
root(z^5 + 2022*z - 10, z, 2)
root(z^5 + 2022*z - 10, z, 3)
root(z^5 + 2022*z - 10, z, 4)
root(z^5 + 2022*z - 10, z, 5)
可以使用vpa命令将结果转化为数值解(二者所求结果相同),设置好所需精度。
读者也可以画图直观的看出方程解的大致位置,为求解指明方向。
二、求解方程 的所有根
对于非多项式方程,roots命令不适用,使用solve命令会出现如下问题:
clc;
clear all;
syms x;%定义变量
f=sin(x)-x./10;
solve(f,x)
ans =
0
只得出一个解,但通过画图可知,该方程应该有七个零点值:
因此对非线性方程的优化解可以使用fzreo函数求解,注意fzero也只能求出给定的x附近一个零点。从图中可以看出,该方程的解在-10~10范围之内,可以以一定的步长遍历求解,代码如下:
clc;
clear all;
f=@(x)sin(x)-x./10;
a=0;
for x=-10:1:10
s=fzero(f,x);
a=a+1;
y(a,1)=s;
end
c=unique(y)
x=-50:50;
f=sin(x)-x./10;
plot(x,f);
c =
-8.4232
-7.0682
-2.8523
-0.0000
0
0.0000
2.8523
7.0682
8.4232