实验六

实验内容

1、用 solve、roots 和 fzero 求方程 x3 −2x2 −4x= 7的根,并给出三个指令的区别和联系。
2、用迭代法求方程 x3 − 2x2 − 4x= 7 的一个根。
3、写出方程 x-e-x = 0 的一种收敛迭代格式, 说明其收敛性 (给出与收敛性判定相关的示意图形代码并对收敛性加以说明)。
4、用牛顿法求方程 cos(x) = 1/2 + sin(x)的一个实根。
5、用牛顿法求方程 sin(x) + 1 = x2/2 在区间 [−4, 2] 的根。
6、用逐次分半算法求方程 x2 - 25x + 150 = 0 的两个根


实验综述

本实验均基于 MATLAB 2019b 版本

安装MATLAB 2019b 点击查看

实验过程

用 solve、roots 和 fzero 求方程 x3 −2x2 −4x= 7的根,并给出三个指令的区别和联系

实验代码
%% 用 solve, roots 和 fzero 求方程 x^3 −2x^2 −4x= 7的根, 并给出三个指令的区别和联系。
%  版本 2019b
%  说明 三者区别和联系
%     1、三者的求解对象有差异。solve与fzero可以求解任意函数的根,而roots只能求解多项式的根;
%     2、solve支持高维求解,而其它两者不支持,所谓高维求解就是指该函数可以支持多个方程联立求解对应根;
%     3、三者输出形式不同。solve输出符号解,在无符号解时,输出数值解。roots与fzero求解结果为数值解;
%     4、三者内部实现的算法不同,solve是求解符号解,内部对应实现算法为模拟人工求解过程的算法,其它两者内部实现的算法应该为解数值解的算法。
%% 代码部分
clc,close,clear;
syms x;
eqn1 = x^3-2*x^2-4*x - 7;
S1 = double(solve(eqn1));
eqn2 = [1 -2 -4 -7];
S2 = roots(eqn2);
fun = @(x) x^3-2*x^2-4*x-7;
x0 = 0;
S3 = fzero(fun,x0);
disp('solve函数解的根为');disp(S1);
disp('roots函数解的根为');disp(S2);
disp('fzero函数解的根为');disp(S3);
实验效果

用迭代法求方程 x3 − 2x2 − 4x= 7 的一个根

实验代码
%% 用迭代法求方程 x^3 ? 2x^2 ? 4x= 7 的一个根。
%  版本 2019b

%% 代码部分
clc,close,clear;
err = 1E-5;
x = 4;
x0 = x;
while abs(x-x0) <= err
    x0 = x;
    f = x^3 - 2*x^2 - 4*x - 7;
    f1 = 3*x^2 - 4*x - 4;
    x = x - f/f1;
end
disp('方程 x^3 ? 2x^2 ? 4x= 7 的近似根为:')
disp(x)
实验效果

写出方程 x-e-x = 0 的一种收敛迭代格式, 说明其收敛性 (给出与收敛性判定相关的示意图形代码并对收敛性加以说明)

实验代码
%% 写出方程 x-exp(-x) = 0 的一种收敛迭代格式, 说明其收敛性 (给出与收敛性判定相关的示意图形代码并对收敛性加以说明).
%  版本 2019b

%% 代码部分
clc,close,clear;
fx = @(x) exp(-x);     %方程迭代式
fxd = @(x) -exp(-x);   %迭代式的一阶导数
x = 0.5;
i = fx(x);
k = 1;
fprintf('|fxd(0.5)| = %d < 1,收敛\n',abs(fxd(x)))
fprintf('x%d=%d\n',0,0.5)
while abs(fx(i)-fx(x))> 1E-5
    fx(i);
    fprintf('x%d=%d\n',k,fx(x))
    x = i;
    i = fx(i);
    k = k+1;
end
fprintf('用fx迭代格式计算的根的近似值为%d\n',fx(x));
实验效果

用牛顿法求方程 cos(x) = 1/2 + sin(x)的一个实根

实验代码
%% 用牛顿法求方程 cos x = 1/2 + sin(x)的一个实根。
%  版本 2019b

%% 代码部分
clc,close,clear;
err = 1E-5;
x = 1;
x0 = x;
while abs(x-x0) <= err
    x0 = x;
    f = cos(x) - 1/2 - sin(x);
    f1 = -sin(x) - cos(x);
    x = x - f/f1;
end
disp('方程cos x = 1/2 + sin(x) 的近似实根为:')
disp(x)
实验效果

用牛顿法求方程 sin(x) + 1 = x2/2 在区间 [−4, 2] 的根

实验代码
%% 用牛顿法求方程 sin(x) + 1 = x^2/2 在区间 [-4, 2] 的根。
%  版本 2019b
%  f为f(x),f1为f'(x),x为迭代初值(取[-4,2]的中间值),e为迭代精度。
%% 代码部分
clc,close,clear;
f = @(x) sin(x) + 1 - x^2/2;
f1 = @(x) cos(x) -x;
err = 1E-5;
x = -1;
x0 = x;
while abs(f(x)) > err
   x0 = x;
   F = f(x);
   F1 = f1(x);
   x = x - F/F1;
end
disp('方程 sin(x) + 1 = x^2/2 在区间 [?4, 2] 的近似根为:')
disp(x)
实验效果

用逐次分半算法求方程 x2 - 25x + 150 = 0 的两个根

实验代码
%% 用逐次分半算法求方程 x^2 - 25*x + 150 = 0 的两个根
%  要求答案是一个逐次分半算法的函数文件, 使用一个主函数文件来调用逐次分半函数文件,两个函数放到一个文件。
%  版本 2019b

%% 代码部分
% 主函数
function  main ()
clc,close,clear;
fx = @(x) x^2 - 25*x + 150;
x0 = [9 16];
HalfInterval(fx,x0)
end

% 逐次分半函数
function [] = HalfInterval(fx,xq)
a1 = xq(1,1);
b1 = xq(1,2);
xz = (a1+b1)/2;
err = 1E-5;
if fx(xz) == 0
   x0 = xz;
   fprintf('一个根为%f\n',x0);
end
if fx(a1)*fx(xz)<0
    a = a1;b = xz;x = (a+b)/2;
    while abs(fx(x)) >= err
        if fx(x)*fx(a)<0
            b = x;
            x = (a+b)/2;
        elseif fx(x)*fx(b)<0
            a = x;
            x = (a+b)/2;
        end
    end
    x1 = x;
    fprintf('一个根为%f\n',x1);
end
if fx(b1)*fx(xz)<0
    a = xz;b = b1;x = (a+b)/2;
    while abs(fx(x)) >= err
        if fx(x)*fx(a)<0
            b = x;
            x = (a+b)/2;
        elseif fx(x)*fx(b)<0
            a = x;
            x = (a+b)/2;
        end
    end
    x2 = x;
    fprintf('一个根为%f\n',x2)
end
end
实验效果