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

news2024/9/24 13:15:12

一、问题描述

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

二、实验目的

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

三、实验内容及要求

  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 == A
        root = a;
        return;
    elseif b^2 == A
        root = b;
        return;
    end
    
    while b - a > tol
        c = (a + b) / 2;
        f_c = c^2 - A;
        
        if abs(f_c) < tol
            break;
        end
        
        if f_c * (a^2 - A) < 0
            b = c;
        else
            a = c;
        end
        
        iterations = iterations + 1;
    end
    
    root = (a + b) / 2;
end

  • 创建一个主文件(例如,main_sqrt.m)来调用这个函数并输出结果:
% 文件名: main_sqrt.m

tol = 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 > tol
        c = (a + b) / 2;
        f_c = 1 / c;
		
        if abs(f_c) < tol
            break;
        end
		
        if f_c * (1 / a) < 0
            b = c;
        else
            a = c;
        end
		
        iterations = iterations + 1;
    end
	
    root = (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_iter
        x_new = g(x);
        
        if abs(x_new - x) < tol
            root = x_new;
            iterations = i;
            return;
        end
        
        x = x_new;
    end
    
    error('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.coloradmin.cn/o/1420732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为配置小型网络WLAN 的基本业务示例

配置小型网络WLAN基本业务示例 组网图形 图1 配置小型网络WLAN基本业务组网图 小型WLAN网络简介配置注意事项组网需求数据规划配置思路操作步骤配置文件 小型WLAN网络简介 本文介绍的WLAN网络是指利用频率为2.4GHz或5GHz的射频信号作为传输介质的无线局域网&#xff0c;相对于有…

Vue-43、Vue中组件自定义事件

1、给学生绑定atguigu事件 2、在组件内触发事件 第二种写法 传多个参数。 解绑 解绑一个事件 解绑多个自定义事件 this.$off([xxx1,xxx2]);解绑所有事件 this.$off();总结

一文速学-selenium高阶操作连接已存在浏览器

前言 不得不说selenium不仅在自动化测试作为不可或缺的工具&#xff0c;在数据获取方面也是十分好用&#xff0c;能够十分快速的见到效果&#xff0c;这都取决于selenium框架的足够的灵活性&#xff0c;甚至在一些基于web端的自动化办公都十分有效。 通过selenium连接已经存在…

【活动回顾】CMeet 成都:转鸿蒙 对应用开发来说是否是职业发展新机会 - 圆满结束!

文章目录 前言一、活动介绍二、精彩分享内容及活动议程2.1、《COC 成都社区情况和活动介绍》2.2、“匿”问我答&#xff0c;现场互动2.3、《话题一&#xff1a;升职加薪》2.4、《话题二&#xff1a;说说鸿蒙》2.5、2023 CSDN 1024 程序员节成都站贡献人物表彰2.6、《话题三&…

谁说后端不能画出美丽的动图?让我来给大家拜个年!

今天我们要介绍的是Python的内置库——小海龟&#xff08;turtle&#xff09;&#xff0c;它是一个非常实用的绘画工具&#xff0c;不仅可以帮助我们绘制图形&#xff0c;还能让我们查看整个绘画过程。即使对绘画一窍不通的人也能够使用它来创作出生动、形象的gif动图。现在正是…

AIGC项目——Meta:根据对话音频生成带动作和手势的3d逼真数字人

From Audio to Photoreal Embodiment: Synthesizing Humans in Conversations From Audio to Photoreal Embodiment:Synthesizing Humans in Conversations 从二元对话的音频中&#xff0c;我们生成相应的逼真的面部、身体和手势。 概括性:角色是由作者的声音驱动的(而不是模…

【获奖必看2.0】美赛小技巧之一秒输入一个公式

大家好呀&#xff0c;美赛开赛还有四天的时间&#xff0c;今天给大家带来的是美赛论文写作时非常实用的一个小技巧——快速输入任何复杂公式。 相信很多小伙伴在论文写作的时候都有一个小烦恼&#xff0c;那就是在面对比较复杂的公式的时候&#xff0c;应该怎么进行快速输入呢…

12.2 关键点提取——SIFT

一、理论 文章看了以下博文&#xff1a;Sift中尺度空间、高斯金字塔、差分金字塔&#xff08;DOG金字塔&#xff09;、图像金字塔-CSDN博客 该文章对SIFT写的很详细&#xff0c;所以在这里我直接抄过来作为笔记。如果以后作者变为付费文章可以提醒我删除。 1.图像金字塔 图像…

酒店|酒店管理小程序|基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)

酒店管理小程序目录 目录 基于微信小程序的酒店管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 (1) 用户信息管理 (2) 酒店管理员管理 (3) 房间信息管理 2、小程序序会员模块的实现 &#xff08;1&#xff09;系统首页 &#xff0…

Spring Boot + security + jwt 测试安全策略

一、测试概述 主要目的是测试security的用法。因测试搭建mysql和redis比较麻烦&#xff0c;所以我这里将自定义的jwt和用户信息缓存到程序的内存中。 本人测试的项目比较混乱&#xff0c;Spring Boot父类只标出有用的依赖。其子类用的版本为jdk11。后续会继续深入oauth2&#x…

微服务-微服务Alibaba-Nacos注册中心实现

1. 系统架构的演变 俗话说&#xff0c; 没有最好的架构&#xff0c;只有最合适的架构。 微服务架构也是随着信息产业的发展而出现的最有普 遍适用性的一套架构模式。通常来说&#xff0c;我们认为架构发展历史经历了这样一个过程&#xff1a;单体架构——> 垂直架构 ——&g…

Java后端须知的前端知识

Java后端须知的前端知识 HTML &#xff08;超文本标记语言&#xff09; W3C标准 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript 快速入门 <html><head><title></title></head><body><font color"red&q…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令&#xff1a; cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注&#xff1a;cp -r 会把所有source当作普通文件&#xff08;regular文件&#xff09;&#x…

vue3.0 + 动态加载组件 + 全局注册组件

首先 vue 动态加载组件使用的是 component 标签&#xff0c;并通过设置组件的is 属性来指定要渲染的组件。例如&#xff1a; <component :is"currentComponent"></component>其中&#xff0c;currentComponent 是一个变量&#xff0c;它的值可以是以下几…

BP图片降噪MATLAB代码

BP(Back Propagation)神经网络是一种常用的深度学习模型,可以用于图像降噪。主要步骤包括: 构建BP神经网络模型。包括输入层、隐藏层和输出层。输入层大小与图像大小相同,输出层大小也与输入图像大小相同。隐藏层根据图像复杂度设定。 准备训练数据。使用干净图像作为输入,加…

数字图像处理(实践篇)三十八 OpenCV-Python实现ORB特征检测实践

​ 目录 一 涉及的函数 二 实践 ​ ORB(Oriented FAST and Rotated BRIEF)是一种特征点检测和描述算法,它结合了FAST关键点检测和BRIEF描述子。ORB算法具有以下优势: ①实时性:能够在实时应用中进行快速的特征点检测和描述。

基于Vue uniapp和java SpringBoot的汽车充电桩微信小程序

摘要&#xff1a; 随着新能源汽车市场的迅猛发展&#xff0c;汽车充电桩的需求日益增长。为了满足市场需求&#xff0c;本课题开发了一款基于Java SpringBoot后端框架和Vue uniapp前端框架的汽车充电桩微信小程序。该小程序旨在为用户提供一个简洁高效的充电服务平台&#xff0…

【pytest系列】- assert断言的使用

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

海外云手机运营Instagram攻略

Instagram是世界著名的社交媒体平台&#xff0c;有着10亿实时用户&#xff0c;是跨境电子商务的优质流量来源。平台以女性用户为主&#xff0c;购物倾向高&#xff0c;转化率好。它被公认为外贸行业的优质社交媒体流量池。那么&#xff0c;如何使用海外云手机吸引Instagram上的…

Spring cloud智慧工地信息平台管理系统源码

目录 报警统计 实时报警列表 工程进度 劳务信息 隐患信息 施工安全管理 人员证书管理 专项安全方案 安全方案审批 隐患排查管理 安全检查统计 危险源Top10 整改超时预警 检查问题数量统计 安全隐患趋势 安全日志管理 视频监控查看 视频回放 AI危险源识别 AI应用总览 AI设备 机械…