计算方法实验2:利用二分法及不动点迭代求解非线性方程

一、问题描述

利用二分法及不动点迭代求解非线性方程。

二、实验目的

掌握二分法及不动点迭代的算法原理;能分析两种方法的收敛性;能熟练编写代码实现利用二分法及不动点迭代来求解非线性方程。

三、实验内容及要求

  1. 二分法
    (1) 编写代码计算下列数字的平方根,要求使用二分法精确到小数点后8 位,x^2-A=0,其中A 是(a) 2, (b) 3, © 5。
    计算在设置初始搜索区间长度为1 的情况下,需要多少次迭代可以达到题目中的精度要求,并利用代码进行验证。
  • 首先,创建一个名为 bisect.m 的文件
function [root, iterations] = bisect(A, tol)a = 0;b = A; % 设置初始搜索区间为[0, A]iterations = 0; % 初始化迭代次数if a^2 == Aroot = a;return;elseif b^2 == Aroot = b;return;endwhile b - a > tolc = (a + b) / 2;f_c = c^2 - A;if abs(f_c) < tolbreak;endif f_c * (a^2 - A) < 0b = c;elsea = c;enditerations = iterations + 1;endroot = (a + b) / 2;
end
  • 创建一个主文件(例如,main_sqrt.m)来调用这个函数并输出结果:
% 文件名: main_sqrt.mtol = 1e-8;
[A1, iter1] = bisect(2, tol);
[A2, iter2] = bisect(3, tol);
[A3, iter3] = bisect(5, tol);fprintf('sqrt(2) = %.8f, 迭代次数: %d\n', A1, iter1);
fprintf('sqrt(3) = %.8f, 迭代次数: %d\n', A2, iter2);
fprintf('sqrt(5) = %.8f, 迭代次数: %d\n', A3, iter3);
  • 输出结果:
    请添加图片描述

(2) 假设二分法从区间[ − 2,1]开始,寻找函数 x 2 − A = 0 x^2 - A = 0 x2A=0
的根,这种方法会收敛到一个实数吗?这个实数是根吗。利用代码进行验证。

  • 创建一个名为 bisect_fx.m 的文件:
function [root, iterations] = bisect_fx(a, b, tol)iterations = 0; % 初始化迭代次数while b - a > tolc = (a + b) / 2;f_c = 1 / c;if abs(f_c) < tolbreak;endif f_c * (1 / a) < 0b = c;elsea = c;enditerations = iterations + 1;endroot = (a + b) / 2;
end

再次,在主文件中调用这个函数并输出结果:

tol = 1e-8;
[root, iter] = bisect_fx(-2, 1, tol);
fprintf('二分法找到的 x = %.8f, 迭代次数: %d\n', root, iter);
  1. 不动点迭代
    编写代码,使用不动点迭代求下列方程,精确到小数点后8 位。(注意将不动点迭代法封装为一个函数,函数名FPI,该函数对应的文件同样命名为FPI)
    请添加图片描述

(1) 对上述每个非线性方程,均通过等价变换获得两个不同的迭代公式(其中至少一个是收敛),并利用不动点迭代的收敛性定理分析其收敛性(是否收敛?若都收敛,速度快慢?),然后利用编写的代码进行验证。

(2) 选择其中某个非线性方程,采用二分法进行求解,并从理论与代码验证的角度对比两种方法的快慢。
选择方程(a)

  • 主文件:
% 选择方程 x^5 + x = 1
f = @(x) x^5 + x - 1;% 设置参数
a = 0;
b = 1;
tol = 1e-8;
max_iter = 1000;% 使用二分法求解
[root_bisect, iter_bisect] = bisect(f, a, b, tol, max_iter);
fprintf('Root for x^5 + x = 1 (bisect): %.8f, Iterations: %d\n', root_bisect, iter_bisect);% 使用不动点迭代法求解
g = @(x) (1 - x)^(1/5);
[root_fpi, iter_fpi] = FPI(g, 0.5, tol, max_iter);
fprintf('Root for x^5 + x = 1 (FPI): %.8f, Iterations: %d\n', root_fpi, iter_fpi);% 对比两种方法
fprintf('Iterations (bisect): %d, Iterations (FPI): %d\n', iter_bisect, iter_fpi);
  • 输出结果:
    请添加图片描述

四、算法原理

  1. 给出二分法的算法原理;给出迭代次数与误差之间的关系; 请添加图片描述

  2. 给出不动点迭代的算法原理;如何分析不动点迭代的收敛情况?请添加图片描述

五、测试数据及结果

  1. 二分法
    (1) 给出每个非线性方程满足精度要求时代码输出的近似解及所需的迭代次数
  • 输出结果:
    请添加图片描述

(2) 给出算法迭代10 次得到的近似值序列。

  • 输出结果:
    请添加图片描述
  1. 不动点迭代
    (1) 对于每个非线性方程,给出两个不同的迭代公式。对于每个迭代公式,给出收敛性情况及判断依据。对于收敛的迭代公式,给出算法迭代10 次得到的近似值序列。
  • 对于(a),迭代公式:
    g 1 ( x ) = 1 − x 5 g_1(x) = 1 - x^5 g1(x)=1x5
    g 2 ( x ) = ( 1 − x ) 1 / 5 g_2(x) = (1 - x)^{1/5} g2(x)=(1x)1/5

  • 对于(b),迭代公式:
    g 1 ( x ) = sin ⁡ − 1 ( 6 x + 5 ) g_1(x) = \sin^{-1}(6x + 5) g1(x)=sin1(6x+5)
    g 2 ( x ) = sin ⁡ ( x ) − 5 6 g_2(x) = \frac{\sin(x) - 5}{6} g2(x)=6sin(x)5

  • 对于(c),迭代公式:
    g 1 ( x ) = e 3 − x 2 g_1(x) = e^{3 - x^2} g1(x)=e3x2
    g 2 ( x ) = 3 − ln ⁡ ( x ) g_2(x) = \sqrt{3 - \ln(x)} g2(x)=3ln(x)

  • 首先,我们在一个名为 FPI.m 的文件中定义不动点迭代的函数:

function [root, iterations] = FPI(g, x0, tol, max_iter)iterations = 0; % 初始化迭代次数x = x0;for i = 1:max_iterx_new = g(x);if abs(x_new - x) < tolroot = x_new;iterations = i;return;endx = x_new;enderror('Maximum iterations reached');
end
  • 主文件:
% 测试不动点迭代法 (FPI) 在不同函数上的性能% 定义公式和初值
g1 = @(x) 1 - x^5;            % x^5 + x = 1
g2 = @(x) asin(6*x + 5);      % sin(x) = 6x + 5
g3 = @(x) exp(3 - x^2);       % ln(x) + x^2 = 3% 设置参数
x0 = 0.5;
tol = 1e-8;
max_iter = 1000;% 测试 x^5 + x = 1
[root_1, iter_1] = FPI(g1, x0, tol, max_iter);
fprintf('Root for x^5 + x = 1: %.8f, Iterations: %d\n', root_1, iter_1);% 测试 sin(x) = 6x + 5
[root_2, iter_2] = FPI(g2, x0, tol, max_iter);
fprintf('Root for sin(x) = 6x + 5: %.8f, Iterations: %d\n', root_2, iter_2);% 测试 ln(x) + x^2 = 3
[root_3, iter_3] = FPI(g3, x0, tol, max_iter);
fprintf('Root for ln(x) + x^2 = 3: %.8f, Iterations: %d\n', root_3, iter_3);
  • 输出结果:
    请添加图片描述

显然(b)找到了根

(2) 对于选择的非线性方程,指明二分法与不动点迭代哪种方法收敛速度快,并分给出两种方法迭代10 次得到的近似值序列。

% 选择方程 x^5 + x = 1
f = @(x) x^5 + x - 1;% 设置参数
a = 0;
b = 1;
tol = 1e-8;
max_iter = 1000;% 使用二分法求解
[root_bisect, iter_bisect] = bisect(f, a, b, tol, max_iter);
fprintf('Root for x^5 + x = 1 (bisect): %.8f, Iterations: %d\n', root_bisect, iter_bisect);% 使用不动点迭代法求解
g = @(x) (1 - x)^(1/5);
[root_fpi, iter_fpi] = FPI(g, 0.5, tol, max_iter);
fprintf('Root for x^5 + x = 1 (FPI): %.8f, Iterations: %d\n', root_fpi, iter_fpi);% 对比两种方法
fprintf('Iterations (bisect): %d, Iterations (FPI): %d\n', iter_bisect, iter_fpi);

请添加图片描述

六、总结与思考

知识点体会

  1. 理解二分法和不动点迭代法:通过本实验,你将更深刻地理解这两种数值方法的工作原理,优缺点,以及适用场合。
  2. 收敛性分析:通过对不动点迭代公式的导数进行分析,你可以了解为什么某些迭代公式会收敛,而其他的不会。
  3. 误差分析:二分法和不动点迭代法都有自己的误差范围和收敛速度,理解这些将有助于你选择更合适的方法解决实际问题。

代码技巧体会

  1. 函数封装:将二分法和不动点迭代法封装为独立的函数,使得代码更为模块化,便于测试和重用。
  2. 精度控制:通过设置合适的停止条件,如精度或最大迭代次数,你学习了如何控制数值方法的输出精度。
  3. 数据记录和分析:通过保存每一次迭代的结果,你可以更直观地观察算法的收敛过程,这在实际应用和算法优化中是非常有用的。

总体思考

这个实验不仅加强了你对数值解法的理解,而且提高了你使用MATLAB进行科学计算的能力。选择合适的数值方法并正确地实现它们是解决工程问题中非常重要的一步,因此这个实验对你今后的学习和工作都将有很大的帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438166.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

定制,是透明拼接屏的常见项目,主要考虑这5个方面

透明拼接屏定制是一种根据客户的需求和场地条件&#xff0c;量身打造的显示解决方案。它不仅能满足客户的个性化需求&#xff0c;还能在商业展示、会议、广告等场合提供更具针对性的视觉效果。尼伽小编在本文就给大家介绍一下关于透明拼接屏定制的内容、方案设计、需要定制的情…

“福布斯警告”!比特币ETF将颠覆美元规则!特殊利益集团使禁掉比特币变得极其艰难!

在美国证券交易委员会&#xff08;SEC&#xff09;批准现货ETF近两周后&#xff0c;比特币价格一直在接近心理重要水平40000美元的区间波动。在最新一轮经济数据公布后&#xff0c;上周五比特币价格从趋势线支撑位约39808美元反弹&#xff0c;重新站稳4万美元大关。从基本面来看…

【Algorithms 4】算法(第4版)学习笔记 01 - 1.5 案例研究:union-find算法

文章目录 前言参考目录学习笔记1&#xff1a;动态连通性2&#xff1a;UF 实现 1&#xff1a;快速查找 quick-find2.1&#xff1a;demo 演示 12.2&#xff1a;demo 演示 22.3&#xff1a;quick-find 代码实现3&#xff1a;UF 实现 2&#xff1a;快速合并 quick-union3.1&#xf…

2023年全球软件开发大会(QCon广州站2023):核心内容与学习收获(附大会核心PPT下载)

在全球化的科技浪潮中&#xff0c;软件开发行业日新月异&#xff0c;持续推动着社会经济的飞速发展。本次峰会以“引领未来&#xff0c;探索无限可能”为主题&#xff0c;聚焦软件开发领域的最新技术、最佳实践和创新思想。来自世界各地的顶级专家、企业领袖和开发者齐聚一堂&a…

权威认可 | 全息网御多领域入选《CCSIP 2023中国网络安全行业全景册(第六版)》

2024年1月24日&#xff0c; FreeBuf咨询正式发布《CCSIP&#xff08;China Cyber Security Industry Panorama&#xff09;2023中国网络安全行业全景册&#xff08;第六版&#xff09;》。FreeBuf咨询全景图/全景册系列&#xff0c;以PDR网络安全模型为基础&#xff0c;并参考I…

算法39:统计全 1 子矩形(力扣1504)----单调栈

题目: 给你一个 m x n 的二进制矩阵 mat &#xff0c;请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1&#xff1a; 输入&#xff1a;mat [[1,0,1],[1,1,0],[1,1,0]] 输出&#xff1a;13 解释&#xff1a; 有 6 个 1x1 的矩形。 有 2 个 1x2 的矩形。 有 3 个 2x1 的矩…

ChatGPT初体验——让他写代码,走起

⭐️ 前言 今天注册了Google账户&#xff0c;并通过Gmail体验了一下ChatGPT3.5&#xff0c;让他帮小编写了几个python程序&#xff0c;而且不用任何改动便可以运行&#xff0c;666&#xff0c;感觉很爽。 体验ChatGPT3.5很简单&#xff0c;只要能科学上网和Google账户就行&am…

【Linux C | 进程】Linux 进程间通信的10种方式(1)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【STM32】快速搭建工程

1. 快速生成工程 2.下载DFP包或者根据已有DFP包安装 3.拷贝现有工程的操作系统&#xff0c;应用层代码 debug 就完成最新工程的快速搭建 4.编译发现如下图 5.修改完这个报错&#xff0c;新工程建立基本完成&#xff0c;如果有其他错误&#xff0c;缝缝补补就可 比如 Main.c文…

Linux中并发程序设计(进程的创建和回收、exec函数使用、守护进程创建和使用、GDB的父、子进程代码的调试、线程的创建和参数传递)

进程的创建和回收 进程概念 概念 程序 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注&#xff1a;进程是存在RAM中&#xff0c;程序是存放在ROM(flash)中的进程内容 BSS段&#xff…

使用QT实现播放gstreamer的命令(二)

一、前言 上一篇文章写到了&#xff0c;如何快速使用C来执行gstreamer的命令&#xff0c;如何在QT中显示gstreamer的画面&#xff0c;原文如下&#xff1a; https://blog.csdn.net/Alon1787/article/details/135107958 二、近期的其他发现&#xff1a; 1.gstreamer的画面显示在…

树--二叉树(C语言纯手凹)

目录 1.什么是树&#xff1f;&#xff08;不深入&#xff0c;仅做了解&#xff09; 2.树的表示方式 2.1孩子兄弟表示法&#xff08;左孩子右兄弟&#xff09; 2.2孩子表示法 2.3双亲表示法 3.什么是二叉树 4.二叉树分类 4.1满二叉树 4.2完全二叉树 4.3二叉搜索树&#x…