计算方法实验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.rhkb.cn/news/247588.html

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

相关文章

w24文件上传之PHP伪协议

PHP支持的伪协议 file:// - 访问本地文件系统 http:// - 访问网址 ftp:// - 访问文件 php:// -访问各个输入/输出流 zlib:// -压缩流 data:// - 数据 glob:// -查找匹配的文件路径模式 phar:// - php归档 ssh2:// - Secure shell 2 rar:// - RAR ogg:// - 音频流 expect:// - …

时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测 Multihead-Attention-TCN-LSTM&#xff08;多头注意力-TCN-LSTM&#xff09;是一种结合了多个注意力机制、时序卷积网络&#xff08;TCN&#xff0…

elasticsearch8.x版本docker部署说明

前提&#xff0c;当前部署没有涉及证书和https访问 1、环境说明,我采用三个节点&#xff0c;每个节点启动两个es&#xff0c;用端口区分 主机角色ip和端口服务器Amaster192.168.2.223:9200服务器Adata192.168.2.223:9201服务器Bdata,master192.168.2.224:9200服务器Bdata192.1…

shopee,lazada卖家自养号测评补单的方法和技巧

现在很多卖家都是自己管理几百个账号&#xff0c;交给服务商不是特别靠谱 一&#xff1a;送测不及时&#xff0c;产品时常送不出去 二&#xff1a;账号质量不稳定&#xff0c;账号一天下了多少你也不清楚&#xff0c;如果下了很多单万一封号被关联了怎么办 三&#xff1a;as…

vue3前端开发,如何引入element-plus前端框架及配置参数

vue3前端开发,如何引入element-plus前端框架及配置参数&#xff01;这是一个简单的教程&#xff0c;帮助大家快速在自己的项目中引入element-plus框架。 主要是介绍的引入流程和参数的配置情况。 如图&#xff0c;这个就是elment-plus前端框架里面的一个主按钮展示。表示我们配…

C++STL之map、set的使用和模拟实现

绪论​&#xff1a; “我这个人走得很慢&#xff0c;但是我从不后退。——亚伯拉罕林肯”&#xff0c;本章是接上一章搜索二叉树中红黑树的后续文章&#xff0c;若没有看过强烈建议观看&#xff0c;否则后面模拟实现部分很看懂其代码原理。本章主要讲了map、set是如何使用的&am…

Spring - 基本用法参考

Spring 官方文档 Spring容器启动流程&#xff08;源码解读&#xff09; BeanFactoryPostProcessor vs BeanPostProcessor vs BeanDefinitionRegistryPostProcessor&#xff1a; From java doc&#xff1a; BeanFactoryPostProcessor may interact with and modify bean defin…

(九)springboot实战——springboot3下的webflux项目参数验证及其全局参数验证异常处理

前言 在上一节内容中&#xff0c;我们介绍了如何在webflux项目中自定义实现一个全局的异常处理器ErrorWebExceptionHandler&#xff0c;正常情况下其可以处理我们系统的运行时异常&#xff0c;但是无法处理参数验证的异常WebExchangeBindException&#xff0c;所以这里提供另外…

Nodejs前端学习Day3_准备工作

妈的&#xff0c;这几天真tm冷&#xff0c;前天上午还下了一整天的雪&#xff0c;大雪 文章目录 前言一、Node.js简介1.1何为1.2有什么 二、Node.js可以做什么三、学习路线四、下载nodejs4.1小坑记录4.2LTS和Current版本的不同 五、什么是终端六、在nodejs中执行js代码七、powe…

Linux使用匿名管道实现进程池得以高效通信

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Nonsense—Sabrina Carpenter 0:50━━━━━━️&#x1f49f;──────── 2:43 &#x1f504; ◀️ ⏸ ▶️ …

ubuntu 22.04 安装mysql-8.0.34

ubuntu 22.04 安装mysql-8.0.34 1、基础安装配置 更新软件包&#xff1a; sudo apt update查看可用软件包&#xff1a; sudo apt search mysql-server安装最新版本&#xff1a; sudo apt install -y mysql-server或者&#xff0c;安装指定版本&#xff1a; sudo apt inst…

如何实现无公网ip远程SSH连接家中本地的树莓派

文章目录 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地址4.5 ssh公网…

qemu + vscode图形化调试linux kernel

一、背景 使用命令行连接gdb 在调试时&#xff0c;虽然可以通过tui enable 显示源码&#xff0c;但还是存在设置断点麻烦&#xff08;需要对着源码设置&#xff09;&#xff0c;terminal显示代码不方便&#xff0c;不利于我们学习&#xff1b;另外在gdb 下p命令显示结构体内容…

【command】使用nr简化npm run命令

参考文章 添加 alias nrnpm run通过alias启动命令可以帮助我们节省运行项目输入命令的时间 $ cd ~ $ vim .bash_profile $ source ~/.bashrc

ChatGPT与文心一言:智能回复与语言准确性的较量

在当今数字化时代&#xff0c;随着人们对智能化技术的需求不断增长&#xff0c;智能回复工具也成为了日常生活中不可或缺的一部分。ChatGPT和文心一言作为两个备受瞩目的智能回复工具&#xff0c;在智能回复、语言准确性以及知识库丰富度等方面各有卓越之处。 本文将对这两者进…

14.5 Flash查询和添加数据库数据

14.5 Flash查询和添加数据库数据 在Flash与数据库通讯的实际应用中&#xff0c;如何实现用户的登录与注册是经常遇到的一个问题。登录实际上就是ASP根据Flash提供的数据查询数据库的过程&#xff0c;而注册则是ASP将Flash提供的数据写入数据库的过程。 1.启动Access2003&…

LeetCode 热题 100 | 子串

目录 1 560. 和为 K 的子数组 2 239. 滑动窗口最大值 3 76. 最小覆盖子串 菜鸟做题第二周&#xff0c;语言是 C 1 560. 和为 K 的子数组 题眼&#xff1a;“子数组是数组中元素的连续非空序列。” 解决本问题的关键就在于如何翻译问题。子数组 s 的和可以看作数组 i 的…

C++ 类与对象(上)

目录 本节目标 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 4.2 封装 5. 类的作用域 6. 类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式猜测 7.3 结构体内存对齐规则 8.this指针 8.1 thi…

Swift 周报 第四十六期

文章目录 前言卖不动了&#xff1f;iPhone 15 系列跌破 5000 元大关StoreKit 和审核指南更新将你的 App 提交到 Apple Vision Pro 的 App Store 提案通过的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第四十六期&#xff0c;每个模块已初步成…

用C语言实现贪吃蛇游戏!!!

前言 大家好呀&#xff0c;我是Humble&#xff0c;不知不觉在CSND分享自己学过的C语言知识已经有三个多月了&#xff0c;从开始的C语言常见语法概念说到C语言的数据结构今天用C语言实现贪吃蛇已经有30余篇博客的内容&#xff0c;也希望这些内容可以帮助到各位正在阅读的小伙伴…