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

news2025/1/18 6:26:58

一、问题描述

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

二、实验目的

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

三、实验内容及要求

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

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

相关文章

STM正点mini-新建工程模板,GPIO及寄存器(介绍)

一.新建工程模板(基于固件库) 1.1库函数与寄存器的区别 这里的启动文件都是根据容量来进行区分的 对MDK而言即使include了&#xff0c;也不知道在哪里找头文件 STM32F10X_HD,USE_STDPERIPH_DRIVER 二.新建工程模板(基于寄存器) 上面的大部分配置与固件库的一样 具体可以看手…

linux03 用户权限

01.三种权限 02.UGO&#xff08;root账号&#xff09; 查看权限 不在root文件中写&#xff0c;是因为其他用户不能进来 举个例子 ll是ls -l 第一部分&#xff1a;权限&#xff08;11个字节&#xff09; 第一个&#xff1a;d/- d表示文件夹 - 表示一般文件 二到四&#xff1a…

基于springboot+vue的明星周边产品销售网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(6)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Java 的文件类的学习总结

目录 一、File 的创建 二、File 类的常用方法 一、File 的创建 二、File 类的常用方法

openssl3.2 - 测试程序的学习

文章目录 openssl3.2 - 测试程序的学习概述笔记openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板openssl3.2 - 测试程序的学习 - test\aborttest.copenssl3.2 - 测试程序的学习 - test\sanitytest.copenssl3.2 - 测试程序的学习 - test\acvp_test.copenssl3.2 - 测…

C++进阶(六)map和set

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、序列式容器与关联式容器二、键值对三、树形结构的关联式容器1、set1、set的介绍2、set的使…

高考复习技巧考研资料、美赛论文及代码,数据收集网站(初高中招生考试全科试卷等)

图&#xff0c;就要从“点、线、面的位置关系”这一内核开始发散&#xff0c;第一层级为彼此的位置关系&#xff0c;平行、相交、异面&#xff08;两直线间位置&#xff09;、垂直&#xff08;相交或异面中的特殊位置&#xff09;&#xff0c;多面体、旋转体等&#xff0c;然后…

2024-macOS系统或Kail系统重——破解ZIP压缩的文件密码

2024-macOS系统或Kail系统重——破解ZIP压缩的文件密码 1. 你们有遇见这样子的情况么&#xff1a; 别人给你发的zip或者下载的zip文件&#xff0c;没有密码打不开么网上都是win系统的&#xff0c;都是没有macOS系统的&#xff0c;所以比较烦恼 2. 所以我就想到了代码&#x…

GoogLeNet模型详解

模型介绍 GoogLeNet是谷歌工程师设计的深度神经网络结构&#xff0c;于2014年在ImageNet比赛中取得了冠军。它的设计特点在于既有深度&#xff0c;又在横向上拥有“宽度”&#xff0c;并采用了一种名为Inception的核心子网络结构。这个网络名字中的“GoogLeNet”是对LeNet的致…

AtCoder Beginner Contest 338D - Island Tour【枚举】

原题链接&#xff1a;https://atcoder.jp/contests/abc338/tasks/abc338_d Time Limit: 2 sec / Memory Limit: 1024 MB Score: 425 points 问题陈述 AtCoder 群岛由 N 座岛屿组成&#xff0c;这些岛屿由 N 座桥梁连接。这些岛屿的编号从1到N&#xff0c;i(1≤i≤N−1)桥双…

Stable Diffusion系列(四):提示词规则与使用

文章目录 基础规则高级规则插件使用 基础规则 所谓提示词&#xff0c;也就是文生图中的文&#xff0c;由连贯的英语单词或句子组成。其最基础的规则是&#xff1a; 不同提示词之间需要用英文逗号分隔&#xff0c;空格和换行不影响读取想混合多个要素时使用|&#xff0c;相当于…

AD/DA(模数数模转换)

文章目录 前言一、介绍部分介绍AD/DA硬件电路模型硬件电路ADC模块DAC模块ADC0809DAC0832 运算放大器&#xff08;运放&#xff09;运放电路 DA原理两种不同的DA转换器 AD原理部分AD/DA性能指标XPT2046介绍主要功能XPT2046时序结构控制字节解释单端模式配置表 二、实例使用AD读取…

shell常用命令,参数传递,函数,挂载磁盘

一、shell常用命令 1、ls 功能:显示文件和目录的信息ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行 ls -lh 显示文件的大小,以容易理解的格式印出文件大小 (例如 1K 234M2…

echarts多个折线图共用X轴,实现tooltip合并和分离

echarts共享X轴案例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</…

数据结构(栈stack)

文章目录 一、栈1、栈的定义2、顺序栈2.1、初始化2.2、进栈2.3、出栈2.4、读取 3、链栈 一、栈 1、栈的定义 逻辑结构&#xff1a;与普通线性表相同数据的运算&#xff1a;插入、删除操作有区别 2、顺序栈 2.1、初始化 ”.”适用于结构体变量&#xff0c;”->”适用于…

【算法专题】二分查找(入门)

&#x1f4d1;前言 本文主要是二分查找&#xff08;入门&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

探索元宇宙的未来:数字人对话系统 - Linly-Talker —— “数字人交互,与虚拟的自己互动”

探索元宇宙的未来&#xff1a;数字人对话系统 - Linly-Talker —— “数字人交互&#xff0c;与虚拟的自己互动” 之前空闲的时候我似乎已经写过了有关于数字人的两篇文章&#xff0c;今天更多的写这篇文章就是想探索一下元宇宙的未来&#xff0c;这种数字人对话系统能做什么&…

算法沉淀——双指针算法(leetcode真题剖析)

算法沉淀——双指针算法 01.移动零02.复写零03.快乐数04.盛最多水的容器05.有效三角形的个数06.和为s的两个数字07.三数之和08.四数之和 双指针算法&#xff08;Two Pointer Algorithm&#xff09;是一种常用于数组&#xff08;或链表&#xff09;操作的算法技巧。它的核心思想…

2024年1月的论文推荐

又到月底了&#xff0c;在月初推荐论文的基础上又整理了10篇推荐阅读的论文 1、MosaicBERT https://mosaicbert.github.io/ 一种用于快速预训练的双向编码器。MosaicBERT是针对快速预训练优化的自定义BERT架构。主要架构修改:FlashAttention, ALiBi&#xff0c;门控线性单元…