MATLAB 牛顿迭代法求立方根:代码解析与优化

本文将详细介绍如何使用 MATLAB 的牛顿迭代法求解立方根,并解析代码实现,同时针对代码中出现的错误进行分析和修正,并分享优化后的代码。

代码解析

clc; clear; format short;

x = [101:1:111];
n = length(x);
y = zeros(n, 2);

for i = 1:n
    % 牛顿迭代法
    r = x(i)^(1/3);
    for j = 1:20
        r = r - (r^3 - x(i))/(3*r^2);
    end
    y(i, 1) = r;
    
    % 简化牛顿迭代法
    r = x(i)^(1/3);
    for j = 1:20
        r = (2*r + x(i)/(r^2))/3;
    end
    y(i, 2) = r;
end

% 输出结果
disp('牛顿迭代法    简化牛顿迭代法');
disp([x' y]);

% 输出矩阵
y_str = strrep(mat2str(y,6),';',' ');
y_str = strrep(y_str,'[','');
y_str = strrep(y_str,']','');
disp(y_str);

错误分析

代码中出现的错误:

'STRING' 输入必须为字符行矢量或字符行矢量元胞数组。

出错 strsplit (line 125)
[c, matches] = regexp(str, aDelim, 'split', 'match');

出错 test3 (line 31)
y = strsplit(y);

错误原因:在使用 strsplit 函数时,输入参数 y 应该是一个字符行矢量或者字符行矢量元胞数组,但在代码中 y 是一个双精度矩阵,因此需要将其转换为字符行矢量或字符行矢量元胞数组后再使用 strsplit 函数。

代码优化

解决方法:使用 mat2str 函数将矩阵转换为字符行矢量,然后再去除其中的空格和方括号。

% 输出矩阵
y_str = strrep(mat2str(y,6),';',' ');
y_str = strrep(y_str,'[','');
y_str = strrep(y_str,']','');
disp(y_str);

代码解释

  • clc; clear; format short;: 清除命令窗口、工作区,设置输出格式为短浮点数格式。
  • x = [101:1:111];: 定义一个向量 x,包含从 101 到 111 的整数。
  • n = length(x);: 获取向量 x 的长度。
  • y = zeros(n, 2);: 初始化一个 n 行 2 列的矩阵 y,用于存储计算结果。
  • for i = 1:n: 循环遍历向量 x 中的每个元素。
  • r = x(i)^(1/3);: 计算 x(i) 的立方根,并赋值给变量 r
  • for j = 1:20: 进行 20 次牛顿迭代,直到结果收敛。
  • r = r - (r^3 - x(i))/(3*r^2);: 牛顿迭代公式,更新变量 r 的值,使其逐步逼近 x(i) 的立方根。
  • y(i, 1) = r;: 将计算得到的立方根存储到矩阵 y 中。
  • % 简化牛顿迭代法: 采用简化版本的牛顿迭代法,可以提高效率。
  • r = (2*r + x(i)/(r^2))/3;: 简化后的牛顿迭代公式。
  • y(i, 2) = r;: 将简化后的牛顿迭代法计算得到的立方根存储到矩阵 y 中。
  • disp('牛顿迭代法 简化牛顿迭代法');: 在命令窗口输出标题。
  • disp([x' y]);: 输出向量 x 和矩阵 y 的内容,方便比较两种方法的结果。
  • y_str = strrep(mat2str(y,6),';',' ');: 将矩阵 y 转换为字符串,并用空格替换分号。
  • y_str = strrep(y_str,'[','');: 将字符串中的方括号替换为空。
  • y_str = strrep(y_str,']','');: 将字符串中的方括号替换为空。
  • disp(y_str);: 输出矩阵 y 的内容,格式更清晰。

总结

本文通过解析代码实现和错误分析,帮助读者理解 MATLAB 牛顿迭代法求解立方根的原理和方法。同时,还分享了优化后的代码,提高代码效率和可读性,方便读者学习和应用。

希望本文对您有所帮助,如有任何疑问,欢迎留言交流。

MATLAB 牛顿迭代法求立方根:代码解析与优化

原文地址: https://www.cveoy.top/t/topic/nl6q 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录