SaintStefan
11/16/2019 - 8:18 AM

求 x^2 - 3*x + 1 = 0 的根

%方法一:多项式球根函数roots
p = [1, -3, 1]; % x^2 - 3*x + 1 = 0
x = roots(p)    %多项式求根函数roots
                %求出:x = 2.6180 和 0.3820
                
%方法二:绘制函数图像可以知道解的大致位置
% x^2 - 3*x + 1 = 0
x = -5: 0.1: 5;       %产生x向量,x从-5变化到5,步长为0.1
y1 = x.*x - 3*x + 1;  %求函数值向量y1
y2 = zeros(size(x));  %产生一个同x向量同大小的零向量
plot(x, y1, x, y2);   %绘制函数曲线y1,和x轴
                      %从生成的图像可以看出,图像在x = 0.5和x = 2.5附近通过零点
                      
%方法二:求单变量非线性方程根的函数:fzero
%可以求函数在某个初始点附近的实根
f = @(x) x*x - 3*x + 1; %利用matlab的函数来定义f
x1 = fzero(f, 0.5);     %求函数在x = 0.5附近的实根
                        %x1 = 0.3820
x2 = fzero(f, 2.5);
                        %x2 = 2.6180
                        
%方法三:在MATLAB最优化工具箱中,提供了一个功能更强的方程求根函数:fsolve
f = @(x) x*x + 3*x + 1;
x1 = fsolve(f, 0.5, optimset('Display','off'))  %optimset参数用于设置优化参数,
                                                %可以调用optimset函数来完成
                                                %把Display选项设置为off,
                                                %表示不显示迭代的中间结果
                                                % x1 = 0.3820
x2 = fsolve(f, 2.5, optimset('Display','off'))
                                                % x2 = 2.6180
                                                
%方法四:利用solve函数求函数的符号解,求得的解是一个表达式
%符号求根函数:solve
syms x                    %定义一个符号变量x
x = solve(x^2 - 3*x + 1)  %用solve函数求根
                          %输出:x = 3/2 - 5^(1/2)/2
                                     5^(1/2)/2 + 3/2
x = eval(x)               %用eval函数,可以将符号解抓换成数值解
                          %输出:x = 0.3820
                                     2.6180