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

一、问题描述

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

二、实验目的

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

三、实验内容及要求

  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/443256.html

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

相关文章

考研高数(共轭根式)

1.定义 共轭根式&#xff1a;是指两个不等于零的根式A、B&#xff0c;若它们的积AB不含根式&#xff0c;则称A、B互为共轭根式。 共轭根式的一个显著特点是通过相乘能把根号去掉&#xff0c;这是很有帮助的 2.常用的共轭根式 3.例题 1&#xff09;求极限 2&#xff09;证明…

IDEA 取消参数名称提示、IDEA如何去掉变量类型提醒

一、IDEA 取消参数名称显示 取消显示形参名提示 例如这样的提示信息 二、解决方法 1、File—>Setting–>Editor—>Inlay Hints—>Java 去掉 Show Parameter hints for 前面的勾即可&#xff0c;然后Apply—>Ok 2、右键Disable Hints

uni-app在hbuilderx打开微信开发工具运行

一、运行设置配置微信开发者工具路径 运行-运行到小程序模拟器-运行设置 配置微信开发工具的安装路径&#xff08;可浏览文件位置选择&#xff09;&#xff1b;web服务器端口号在第二步骤获得&#xff1b; 二、打开微信开发者工具设置-安全设置 打开服务端口开关&#xff0…

广度优先搜索(BFS)

AcWing 844. 走迷宫 #include <bits/stdc.h> using namespace std;const int N 110; typedef pair<int, int> PII;int n, m; int g[N][N], d[N][N];int dx[4] {1, 0, -1, 0}; int dy[4] {0, 1, 0, -1};void bfs() {queue<PII> q;q.push({0, 0});d[0][0] …

【学习笔记】Vue3源码解析:第一部分-实现vue3环境搭建

课程地址&#xff1a;【已完结】全网最详细Vue3源码解析&#xff01;&#xff08;一行行带你手写Vue3源码&#xff09; 第一部分&#xff1a;实现vue3环境搭建&#xff08;对应课程的第1-3节&#xff09; VUE2与VUE3的对比&#xff1a; 也即vue2的痛点&#xff1a; 对TypeSc…

【Algorithms 4】算法(第4版)学习笔记 02 - 1.4 算法分析

文章目录 前言参考目录学习笔记1&#xff1a;科学方法2&#xff1a;观察举例&#xff1a;三数之和3&#xff1a;近似4&#xff1a;增长数量级4.1&#xff1a;二分查找 demo4.2&#xff1a;二分查找代码实现4.3&#xff1a;二分查找比较次数的证明&#xff08;比较次数最多为lgN…

知识推理的多重途径

目录 前言1 逻辑及推理简介2 演绎推理&#xff1a;Top-Down Logic2.1 肯定前件假言推理2.2 否定后件假言推理2.3 演绎推理的逻辑链条 3 归纳推理&#xff1a;Bottom-Up Logic3.1 从特例到一般3.2 逐步推导的过程 4 溯因推理&#xff1a;结果的可解释逻辑4.1 推断过程的回溯4.2 …

西瓜书读书笔记整理(十二) —— 第十二章 计算学习理论(下)

第十二章 计算学习理论&#xff08;下&#xff09; 12.4 VC 维&#xff08;Vapnik-Chervonenkis dimension&#xff09;12.4.1 什么是 VC 维12.4.2 增长函数&#xff08;growth function&#xff09;、对分&#xff08;dichotomy&#xff09;和打散&#xff08;shattering&…

[Java 并发基础]多线程编程

文章参考&#xff1a; https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html https://juejin.cn/post/6970558076642394142 文章目录 线程的创建方式继承 Thread实现 Runnable 接口实现 Callable 接口使用 Lambda使用线程池 线程创建相关的 jdk源码Thr…

“死“社群先不要扔,想办法激活一下,隔壁的运营都馋哭了

私域运营已成为当下很多企业寻求增长的标配。在这过程中&#xff0c;社群运营就是极为重要的一个环节。过去我们为了流量&#xff0c;疯狂建群拉人。但建社群容易活跃难&#xff0c;活跃一段时间后&#xff0c;社群会越来越安静。 不仅如此&#xff0c;群主和管理员也渐渐疏于…

优化器刺客之limit 1--Order by col limit n 代价预估优化探索

一、现象 order by 排序加了limit后更慢了&#xff1f; test# explain analyze select userid from dba_users where username like %aaaaaaaaaaaaaaaaaa% order by userid ;QUERY PLAN --------------…

CentOS7中安装ElasticSearch

文章目录 检测是否安装了Elasticsearch安装JDK下载java配置 下载Elasticsearch解压安装Elasticsearch修改配置文件启动Elasticsearch常见问题 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasti…