数学体操之牛顿数值法解方程的程序和图解

news2024/11/16 8:40:30

牛顿法是一种用来寻找函数零点的迭代方法,它基于以下思路,如果我们知道了一个函数在某个点的切线,那么函数的零点就可以通过切线与x轴的交点来近似计算。

给定一个函数f(x),找到零点x_0,过程如下:

选择初始点x_1,然后使用这个点处的切线来近似f(x),也就是说,找到下面这条直线:

y-f(x_1)=f'(x_1)(x-x_1)

这样,我们可以通过将其与x轴相交一获得更接近真实零点的新估计值x_2:

-f(x_1)=f'(x_1)(x-x_1)\Rightarrow x_2 = -\frac{f(x_1)}{f'(x_1)}+x_1

从上式可以看出,如果我们对x_1一次,则可以计算出一个更好的估计值x_2,然后我们可以不断重复此过程,直到达到我们满意的精度或次数为止。

下面举例说明:

用牛顿法求解一元二次方程,程序比较简单,利用导函数与横轴的交点的横坐标不断迭代即可,程序清单如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//newton methond to get the root of
//equation of two degree f(x) = x^2-8x+9
//the deritive is f'(x) = 2x - 8;
static void newton_methed(void)
{
	// init value of start point. 
	double x1 = 8.0, x2=0.0, y1, root;
	double k; // the gradient of f(x)

	while(fabs(x1-x2) > 1e-6) {
		x2=x1;

		k = 2 * x1 - 8;
		y1 = x1*x1 - 8*x1 + 9;

		root = (-1 * y1)/k + x1;  //according y-y1=k(x-x1)
		x1 = root;

		printf("root is %f.\n", root);
	}

	return;
}

int main(void)
{
	newton_methed();

	return 0;
}

图解说明:

下图展示了迭代过程:

根值到了极度接近的阶段,宏观上已经看不出切线和坐标轴的交点,即便放大绘图,也会感受到工具渲染非常的吃力。下图展示了三次迭代后的效果,左边是原函数和坐标轴的交点,邮编是三伦迭代的切线和X轴的交点,可以看到,交点非常的接近了。

如果将迭代初始值甚至为一元二次函数的极点位置,程序将失效,原因是此时极点的切线位置和X轴平行,没有交点,算法无法执行下去。

对于这个例子来说,如果将初始的X1设置为4,算法将会输出非法值。

但是只要打破平衡,稍微偏离极点中心哪怕一点点,算法将给出正确的值,如果向左偏离,则得到左交点,如果向右偏离,将得到右交点,结合图形,很容易理解这些结论。

计算左边根的迭代示意图

一个不算简单的解方程问题,数形结合起来后,直观了很多,看来数学从高的观点往下看,往往会更有收获。

一个新的例子,自然对数求根:

geogebra得到的两个根是+/- 1.41.

程序:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//newton methond to get the root of
//equation of two degree f(x) = x^2-8x+9
//the deritive is f'(x) = 2x - 8;
static void newton_methed1(void)
{
	// init value of start point. 
	double x1 = 3.99999999, x2=0.0, y1, root;
	double k; // the gradient of f(x)

	while(fabs(x1-x2) > 1e-6) {
		x2=x1;

		k = 2 * x1 - 8;
		y1 = x1*x1 - 8*x1 + 9;

		root = (-1 * y1)/k + x1;  //according y-y1=k(x-x1)
		x1 = root;

		printf("root is %f.\n", root);
	}

	return;
}

//newton methond to get the root of
//equation of two degree f(x) = log(x^2-1)
//the deritive is f'(x) = 2x/(x^2-1);
static void newton_methed2(float x1)
{
	// init value of start point. 
	double x2=0.0, y1, root;
	double k; // the gradient of f(x)

	while(fabs(x1-x2) > 1e-6) {
		x2=x1;

		k = 2 * x1/(x1*x1 - 1);
		y1 = log(x1*x1-1);

		root = (-1 * y1)/k + x1;  //according y-y1=k(x-x1)
		x1 = root;

		printf("root is %f.\n", root);
	}

	return;
}

int main(void)
{
	//newton_methed1();
	newton_methed2(3.999999999);
	newton_methed2(-3.999999999);

	return 0;
}

程序迭代过程,最终得到了正确的根:

迭代数次后的逼近位置:

总结:

牛顿法的主要优点是,它在每次迭代中都收敛的非常快,在实践中被证明比其他迭代方法更快,但是它也有缺点,就像例子中看到的,当函数具有多个局部零点时,算法的初始值可能导致收敛到错误的根。

解方程是一种近似数学,虽然有的时候能够获得方程的解析式,但大多数的时候(5次及以上的普通方程)是没有解析式的,这个时候只能通过数值解法得到近似解。即便对于有解析式可解方程,通常根也是无理数,没有精确解,所以解方程实际上是一件“差不多”就可以的事,所以计算机能够很好的胜任这份工作。


结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420123.html

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

相关文章

java超详细的jvm调优

JVM调优 看这篇博客之前&#xff0c;可以先看我另外两篇 Java虚拟机&#xff08;Jvm详解&#xff09; Java垃圾回收机制(后续更新) 下面主要从以下几个方面进行展开描述&#xff1a; JVM实践调优主要步骤分析GC日志堆内存与元空间优化线程堆栈优化堆内存内部优化&#xff…

软件质量保证与软件测试 第五周(数据流测试)+第六周(集成测试开了个头)

数据流测试 1 定义/使用测试 一些概念的定义 例题理解概念 例子1&#xff1a; 定义清除的理解&#xff1a;就是说&#xff0c;如果路径上又遇到了其他定义节点&#xff0c;那就不是。 例子2&#xff1a; 第一步&#xff1a;先画程序图&#xff1a; 第二步&#xff1a;再…

什么是 AWS Lambda 冷启动问题?

什么是 AWS Lambda 冷启动问题&#xff1f; AWS Lambda 是一个无服务器计算平台&#xff0c;使开发人员能够快速构建和部署应用程序&#xff0c;而无需管理任何底层基础设施。但是&#xff0c;这种便利性也带来了一个缺点&#xff0c;即 AWS Lambda 冷启动问题。由于冷启动问题…

sgg第二天Java的语法

关键字 关键字(keyword)的定义和特点 定义&#xff1a;被Java语言赋予了特殊含义  特点&#xff1a;关键字中所有字母都为小写  注意,关键字不能被用作标识符&#xff01; 保留字 Java保留字&#xff1a;现有Java版本尚未使用&#xff0c;但以后版本可能会作为关键字使 …

Qt Quick - 弹出控件综述

Qt Quick - 弹出控件综述一、概述一、抽屉控件二、菜单控件三、弹出控件四、工具提示控件一、概述 控件功能Dialog带有标准按钮和标题的弹出式对话框&#xff0c;用于与用户进行短期交互Drawer可以用滑动手势打开和关闭的侧面板Menu弹出式菜单&#xff0c;可以用作上下文菜单或…

springboot事务

对于从事 java 开发工作的同学来说&#xff0c;spring 的事务肯定再熟悉不过了。 在某些业务场景下&#xff0c;如果一个请求中&#xff0c;需要同时写入多张表的数据。为了保证操作的原子性&#xff08;要么同时成功&#xff0c;要么同时失败&#xff09;&#xff0c;避免数据…

设备是如何实现延时关机的

文章目录1. 引言2. 延时关机的实现方式2.1 自建定时服务实现2.2 RocketMQ中间件实现2.2.1 生成端demo2.2.2 消费端demo3. 结尾1. 引言 在设备联动中&#xff0c;有些场景需要保持设备继续工作一段时间再关机。比如在厨房场景下&#xff0c;存在燃气灶和烟机的联动场景&#xf…

基于kettle部署图形化界面(spoon)

最近使用kettle部署windows&#xff0c;mac、linux服务遇到的坑做一个总结。 1、mac、linux部署&#xff1a; 1⃣️拉取docker镜像 docker pull hiromuhota/webspoon 2⃣️创建并运行docker容器 docker run -d -p 8080:8080 hiromuhota/webspoon --name webspoon --restar…

HTML:彩虹按钮

彩虹按钮&#xff08;盗版按钮&#xff0c;B站仿写&#xff0c;略有不同&#xff01;&#xff09; 链接 <html><head><title>demo</title><style>*{margin: 0;padding: 0;}body{display: flex;justify-content: center;align-items: center;…

【hello Linux】Linux软件管理器yum

目录 1.Linux软件管理器yum 1.1 关于lrzsz 1.2 使用yum时的注意事项 1.3 查看软件包&#xff1a;yum list 1.4 安装软件&#xff1a;yum install 1.5 卸载软件&#xff1a;yum remove 1.6 更新yum源 1.7 实战项目 Linux&#x1f337; 1.Linux软件管理器yum 在windows系统下有应…

交友项目【查询黑名单人员,移除黑名单人员】功能实现

目录 1&#xff1a;交友项目 1.1&#xff1a;查询黑名单人员 1.1.1&#xff1a;接口地址 1.1.2&#xff1a;流程分析 1.1.2&#xff1a;代码实现 1.2&#xff1a;移除黑名单人员 1.2.1&#xff1a;接口地址 1.2.2&#xff1a;流程分析 1.2.3&#xff1a;代码实现 1&am…

【LeetCode每日一题: 1039. 多边形三角剖分的最低得分 | 暴力递归=>记忆化搜索=>动态规划 | 区间dp 】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

0416 leetcode每日一题 1042. 不邻接植花

题目描述&#xff1a; 力扣 思路&#xff1a; 从题目描述中可知&#xff0c;花的种类一共有四种&#xff0c;且一定有满足题意的答案。 可以首先将所有花园中的花设置为0&#xff0c;然后遍历与其相邻的花园&#xff0c;选择没有使用过的花的种类&#xff08;1 2 3 4&#xf…

【ChatGPT】阿里版 ChatGPT 突然官宣意味着什么?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 阿里版 ChatGPT 突然官宣 ​ ChatGPT 技术在 AI 领域的重要性 自然语言生成 上下文连续性 多语言支持 ChatGPT 未来可能的应用场景 社交领域 商业领域 ​编辑 医疗领域…

LeetCode_单调栈_中等_1019.链表中的下一个更大节点

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 给定一个长度为 n 的链表 head。对于列表中的每个节点&#xff0c;查找下一个更大节点的值。也就是说&#xff0c;对于每个节点&#xff0c;找到它旁边的第一个节点的值&#xff0c;这个节点的值严格大于它的值…

Vue项目创建流程

一、安装Vue和查看Vue版本 1.1安装Vue npm i -g @vue/cli1.2 查看Vue Vue -V二、新建一个Vue项目 2.1 使用命令创建项目 vue create vue-project # vue-project是项目名称Default 表示使用默认配置,默认勾选babel、eslint ,回车之后直接进入装包 Manually 自定义勾选特性…

Vector - CAPL - CAN x 总线信息获取(续2)

继续.... 目录 ErrorFrameCount -- 错误帧数量 代码示例 ErrorFrameRate -- 错误帧速率 代码示例 ExtendedFrameCount -- 扩展帧数量 代码示例 ExtendedFrameRate -- 扩展帧速率 代码示例 ExtendedRemoteFrameCount -- 远程扩展帧数量 代码示例 ExtendedRemoteFrameRa…

01背包的算法设计和代码实现以及01背包问题的复杂度计算

01背包的算法设计和代码实现以及01背包问题的复杂度计算 1.算法分析 01背包问题是一个经典的动态规划问题&#xff0c;其目标是在给定一组物品和一个背包容量的情况下&#xff0c;选择一些物品放入背包中&#xff0c;使得背包容量最大化。以下是01背包问题的算法设计和代码实…

Python中的8种运算符

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;零基础入门篇 &#x1f4ac;个人格言&#xff1a;不断的翻越一座…

【消息队列】聊一下Kafka副本机制

副本机制的好处 副本在分布式系统下&#xff0c;不同的网络互联的机器保存同一份数据。我们知道在分布式系统中&#xff0c;都会通过数据镜像、数据冗余的方式来提升高可用性。 提供数据冗余&#xff1a;这点比较好理解&#xff0c;说白了就是通过数据冗余在不同的服务器上&a…