验证牛顿公式的局部收敛性,并找到对于牛顿公式不收敛(发散)的函数,比较二分法与牛顿公式的收敛速度

article/2025/9/19 20:17:57

文末有代码,大家可以自己跑一下,体会一下牛顿法的运算过程

二、实验目的:

a.验证牛顿公式的局部收敛性;
b.比较二分法与牛顿公式的收敛速度;
c.验证求解结果的正确性;

三、实验内容

a.在验证牛顿公式的时候,首先让用户输入一个初始的近似根x0,再输入迭代次数的上限N,N的目的是防止函数f(x)在x0处使用牛顿法时不收敛而造成程序的死循环。最后提示用户输入迭代结果的精度e,当|xk+1 - xk| < e时,程序执行结束,输出迭代结果和迭代次数。在程序代码里定义一个整形变量k,用于记录迭代的次数。
b.在上面的基础上,再编写一个用二分法求根的函数,从而实现二分法与牛顿法收敛速度的比较。执行二分法的代码时,用户需要输入二分的区间端点a,b。二分结果的精度可以使用牛顿法的精度e,当|b - a| < e时,函数执行结束,并输出二分结果和二分次数。
c.选取的验证函数应该有实根,且在程序执行之前我们能够通过其它方法得到被验证函数的所有实根。最后比较程序计算出来的根和预先已知的根是否相同来验证求解结果的正确性。
d.因为牛顿法是局部收敛的,所以一定能够找到使牛顿法不收敛的点。我采用的是构造函数的方法来寻找不收敛点,不收敛有两种情况,如下图所示:
在这里插入图片描述
下面介绍第一种情况的构造。
在这里插入图片描述
这种构造方法的核心思想是在点(b,f(b))处的切线的横截距等于a,点(a,f(a))处切线的横截距等于b。因为f(x) = 0必须有实根,所以假设f( c ) = 0,c除了a,b外,可以取任意实数,而a,b是可以任取的。
第二种情况的构造。
在这里插入图片描述
这种不收敛情况下的构造,我们首先需要画出一个某一区间上牛顿法不收敛的函数图像(满足这个要求的图像并不难画,关键是画的越简单越好)。构造函数的核心思想是对函数f(x)进行分段,按照牛顿法的要求,f(x)必须是连续且一阶可导,我们把这两点作为条件,可以得到两个方程。先设出f(x)其中一段函数的表达式,在设表达式的时候,基本上我们学过的初等函数就能满足要求,因为我们并不需要所设的表达式与画出的曲线图完全吻合,只要变化趋势一致即可。
四、程序关键语句描述

double f(float x) {double result;result = (5.0 / 6.0) * pow(x, 4) - 4 * pow(x, 3) + (23.0 / 6.0) * pow(x, 2) + 3 * pow(x, 1) - (17.0 / 3.0);	//不收敛点是1和2,根为-1和3,2return result;
}

上述代码用来求函数f(x)的函数值,我构造出来的这个函数在x = 1和x=2处对于牛顿法不收敛。

double f_d(float x){	double result;result = (10.0 / 3.0) * pow(x, 3) - 12 * pow(x, 2) + (23.0 / 3) * pow(x, 1) + 3;return result;
}

上述代码用来求函数f(x)的一阶导数值。
因二分法和牛顿法的代码都比较简单这里不做赘述,牛顿法的公式为
在这里插入图片描述
五、实验结果
待检验函数f(x)的表达式是f(x) = (5/6)*x4-4x3+(23/6)x2+3x-(10/3),它有两个实根,分别为x1 = -1,x2 = 3.23483652635,函数图像如下图所示。
在这里插入图片描述
此函数对于牛顿法不收敛的点为1和2.
对于初始近似根x=3的牛顿法和二分区间[2,4]的二分法,看他们的收敛速度的情况,如下图所示,对于同样的精度要求,二分法需要计算21次,而牛顿法只需计算5次。
在这里插入图片描述
验证对于牛顿法不收敛的点
在这里插入图片描述
在这里插入图片描述
六、实验体会
通过本次实验,加深了对牛顿法的理解,同时也领悟到牛顿法思想的简洁性和可操作性。牛顿法的收敛性非常强,对于绝大多数函数都收敛,只有极少部分函数在少数点不收敛,因此牛顿法具有很强的实用性。当我用分段构造法构造出来的函数进行验证的时候,发现程序执行过程中出现来了奇异点。经过分析之后,发现是由于计算机的计算精度不够造成的。这也提醒我们,在实际应用中,不能只是依靠理论推导,还应该对实际环境进行充分的调研,理论结合实践,才能得到最优的结果。
最后上代码

// 牛顿法.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
////#include "pch.h"
#include "stdio.h"
#include"math.h"
//计算法(x)的值
double f(float x) {double result;//result = (pow(x, 3) - 2 * pow(x,2) - pow(x,1) + 2) * (5.0 / 6.0 * pow(x,1) - 7.0 / 3.0) - (x + 1);	//不收敛点是1和2,根为-1和3.2result = (5.0 / 6.0) * pow(x, 4) - 4 * pow(x, 3) + (23.0 / 6.0) * pow(x, 2) + 3 * pow(x, 1) - (17.0 / 3.0);//if (x > 0)//	result = exp(-x) + 1;//else//	result = -pow(x, 2) - pow(x, 1) + 2;return result;
}
//f(x)的一阶导数
double f_d(float x){	double result;//result = (3 * pow(x,2) - 4 * pow(x,1) - 1) * (5.0 / 6.0 * x -7.0 / 3.0) + (5.0 / 6.0) * (pow(x, 3) - 2 * pow(x, 2) - pow(x, 1) + 2) - 1;result = (10.0 / 3.0) * pow(x, 3) - 12 * pow(x, 2) + (23.0 / 3) * pow(x, 1) + 3;//if (x > 0)//	result = -exp(-x);//else//	result = -2 * pow(x, 1) - 1;return result;
}
int main()
{float x0,x1, e;int N,k = 1;	//k用来记录迭代的次数printf("请输入牛顿法初始节点x0,迭代次数上限N:");scanf("%f%d", &x0, &N);float a, b;printf("请输入二分法的区间端点a,b:");scanf("%f%f",&a,&b);printf("请输入迭代精度e:");scanf("%f", &e);if (f(a) * f(b) >= 0) {	//根在区间端点的情况也不可以。printf("区间端点有误,此开区间无根或有多个根\n");return 0;}//二分法的计算while (1) {//判断是否恰好为根if (f(a) * f((a + b) / 2.0) == 0) {printf("二分结果为%f\n二分次数为%d\n", (a + b) / 2.0, k);break;}if (f(a) * f((a + b) / 2.0) < 0)b = (a + b) / 2.0;elsea = (a + b) / 2.0;//如果满足精度要求,则输出二分结果if ((fabs(a - b) < e)) {printf("二分结果为%f\n二分次数为%d\n", a, k);break;}k++;}//牛顿法的计算k = 1;while (1) {if (f_d(x0) == 0) {printf("此点为奇异点,迭代失败\n");printf("现在的迭代次数为%d", k);break;}x1 = x0 - f(x0) / f_d(x0);if (fabs(x1 - x0) < e) {printf("牛顿法迭代结果%f\n迭代次数%d\n", x1,k);break;}if (k == N) {printf("迭代次数已达上限,迭代失败\n");break;}k++;x0 = x1;}}

http://chatgpt.dhexx.cn/article/EI9Jgl4I.shtml

相关文章

牛顿迭代公式(详细)

牛顿迭代公式 X n 1 X n − f ( x ) f ′ ( x ) X_{n1} X_n -\frac{f(x)}{f(x)} Xn1​Xn​−f′(x)f(x)​ 上网搜了很久,搞懂了一点,简单记录一下 其实弄懂了一点后会发现它并不是很高大上&#x1f605; . 先来一段代码 求9的平方根,java实现 public static void main…

牛顿-莱布尼茨公式

牛顿-莱布尼兹公式&#xff08;Newton-Leibniz formula&#xff09;&#xff0c;通常也被称为微积分基本定理&#xff0c;揭示了定积分与被积函数的原函数或者不定积分之间的联系。 牛顿-莱布尼茨公式的内容是一个连续函数在区间 [ a&#xff0c;b ] 上的定积分等于它的任意一个…

python语言培训是密封式的吗

述&#xff08;最多18字 以下试题内容来源由-众课帮-公众号和小程序提供 可查询更多的试题答案新鲜尿液有氨臭味 变异性心绞痛患者首选药物是 A_______ofdependenceonGMOseedsandchemicalfertilizers,pesticides(杀虫剂),andherbicides&#xff08;除草剂&#xff09;isthencre…

【业界分享】字节跳动如何用 7 年,成为腾讯最可怕的对手?张一鸣一语道破...

点击上方&#xff0c;选择星标或置顶&#xff0c;每天给你送干货&#xff01; 阅读大概需要16分钟 跟随小博主&#xff0c;每天进步一丢丢 转载自公众号&#xff1a;开发者技术前线 2019 年&#xff0c;字节跳动被预估广告收入可达 1000 亿元。 说到互联网巨头&#xff0c;很多…

VR旅游应用案例解析,世界那么大用VR去看看!

中国旅游研究院(文化和旅游部数据中心)发布“2019年上半年全国旅游经济运行情况”中显示上半年旅游经济平稳运行,预计国内旅游人数30.8亿人次,国内旅游收入2.78万亿元,同比分别增长8.8%和13.5%。由相关数据显示,旅游消费如今已经成为民众的一个重要生活方式。 同时为了不断…

从虚机到容器,秒拍架构师告诉你如何平滑进行业务迁移

近期&#xff0c;炫一下&#xff08;北京&#xff09;科技有限公司&#xff08;简称“一下科技”&#xff09;短视频产品“秒拍”完成了一个“大动作”——将原来部署在虚拟机上的主体业务迁移到华为云&#xff0c;同时将公司的技术体系承载在下一代虚拟技术容器&#xff08;Do…

git中如何取消忽略文件

问题现象描述&#xff1a; 在每天的git-----pull时&#xff0c;操作失败。报文件冲突的异常。而该冲突文件却是自己已被忽略的文件&#xff0c;在网上通用的在.gitignore文件中取消忽略的办法无法实现&#xff0c;因为.gitignore文件中根本没有哪行命令是决定该文件的忽略操作…

git忽略文件不生效问题解决

git忽略文件不生效问题解决 文章目录 git忽略文件不生效问题解决**一 .gitignore添加了忽略文件&#xff0c;但是提交时还会出现这些忽略文件** 一 .gitignore添加了忽略文件&#xff0c;但是提交时还会出现这些忽略文件 —在gitignore中忽略了.idea文件夹,但是提交时仍旧会出…

git如何忽略一个文件

1.1 添加.gitignore文件 在.gitignore文件中指定的目录和文件会在下次push时从git仓库中删除&#xff0c;本地文件不会删除。 创建.gitignore文件&#xff0c;这个文件不仅能创建在根目录&#xff0c;而且也能在子目录下创建&#xff0c;个数不限。若多个.gitignore文件中有…

git忽略文件的两种方式

目录 前言 一、忽略并且push到远程 二、忽略本地&#xff0c;不提交 2.1、忽略本地文件 2.2、取消忽略&#xff0c;恢复提交 2.2.1、查看有哪些文件被忽略 2.2.2、 取消忽略 前言 本文不讲述.gitignore文件的设置。 关键字&#xff1a;git update-index --no-assume-un…

IDEA设置GIT忽略文件提交

情景一:从未提交过的文件 我们是项目组长,组内员工总是会误把本地的一些文件提交上git,以下以target目录为例,我们过滤这个文件夹的所有内容不允许提交 一、在项目根目录下新建.gitignore文件,内容如下 target/ # Package Files # *.jar *.war *.nar *.ear *.zip *.tar.…

【git】git忽略文件 取消忽略文件

【git】git忽略文件 取消忽略文件 一、git忽略文件 &#xff08;一&#xff09;通常操作 忽略成功后会出现灰色图标 git根目录下有一个.gitignore文件&#xff0c;被忽略的文件全部会添加到里面 相关过滤规则举例说明&#xff1a; #&#xff1a;注释符号&#xff0c;自动被…

git提交忽略不必要的文件或文件夹

创建maven项目&#xff0c;使用git提交&#xff0c;有时需要忽略不必要的文件或文件夹&#xff0c;只保留一些基本。 例如如下截图&#xff0c;实际开发中我们只需提交&#xff1a;src,.gitignore,pom.xml 而自己项目文件一般都保留&#xff0c;但是有些则不必要提交&#xff0…

【git】Git-忽略某些文件

忽略某些文件 一般我们总会有些文件无需纳入 Git 的管理&#xff0c;也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件&#xff0c;比如日志文件&#xff0c;或者编译过程中创建的临时文件等。我们可以创建一个名为 .gitignore 的文件&#xff0c;列出要忽略的文…

Git忽略文件的几种方法,以及.gitignore文件的忽略规则

Git忽略文件的几种方法&#xff0c;以及.gitignore文件的忽略规则 .gitignore文件定义Git全局的.gitignore文件Git 忽略规则Git忽略规则的优先级.gitignore文件忽略规则常用匹配示例&#xff1a; 关于.gitignore规则不生效的问题 不忽略没有后缀名的文件搜索电脑里没有后缀的文…

idea设置git忽略文件

idea设置git忽略文件 根据项目忽略一.老版IDEA配置忽略文件&#xff1a;二. 新版IDEA配置忽略文件&#xff1a;特别提醒 根据分支忽略 根据项目忽略 一.老版IDEA配置忽略文件&#xff1a; 该方法是针对当前电脑的设置&#xff0c;无关项目&#xff0c;无关分支&#xff1b; 步…

git如何忽略文件或者文件夹

用git开发中会有一些不愿意提交的目录或者文件 在仓库目录下新建一个名为.gitignore的文件&#xff08;因为是点开头&#xff0c;没有文件名&#xff0c;没办法直接在windows目录下直接创建&#xff0c;必须通过右键Git Bash&#xff0c;按照linux的方式来新建.gitignore文件&…

git忽略指定文件

有时候会习惯的使用命令 git add . 直接提交代码&#xff0c;这样的话&#xff0c;会不小心把一些不需要提交的文件提交上去&#xff0c;比如编译文件等。 这个时候使用git自带的忽略文件就很好用。具体方法如下&#xff1a; 可以在文件列表建立一个.gitignore 命名的文件&am…

Git操作 --忽略文件

目录 一、.gitignore二、使用1.pycharm中的使用2. 手动创建 .gitignore 文件3. 语法 一、.gitignore 这个忽略文件只对某一级目录下的文件的忽略有效。如果某一个目录下有需要被忽略的文件&#xff0c;那么就可以在该目录下手工地创建忽略文件 .gitignore&#xff0c;并在这个…

scratch学习1 积木区+程序区

step1&#xff1a;进入scratch以后&#xff0c;第一步是对语言进行修改&#xff1a;点击左上方地球图案&#xff0c;下拉到最下方&#xff0c;就出现简体中文。 step2&#xff1a;认识积木区程序区 step3&#xff1a;选择了一些积木 step4&#xff1a;不说多了&#xff0c;直接…