C语言每日一练——第154天:牛顿迭代法求方程根

这篇具有很好参考价值的文章主要介绍了C语言每日一练——第154天:牛顿迭代法求方程根。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌟 前言

Wassup guys,我是Edison 😎

今天是C语言每日一练,第154天!

Let’s get it!

`l<(`(鈥榊,C语言每日一练,c语言,C语言每日一练,牛顿迭代法,算法,后端


1. 问题描述

编写用牛顿迭代法求方程根的函数。
 
方程为 a x 2 + b x 2 + c x + d = 0 ax^2+bx^2+cx+d=0 ax2+bx2+cx+d=0,系数a,b,c,d 由主函数输入。
 
x x x 1 1 1 附近的一个实根。求出根后,由主函数输出。

 
牛顿迭代法的公式是: − f ( x 0 ) f ′ ( x 0 ) -\frac{f(x_0 )}{f'(x_0)} f(x0)f(x0) ,设迭代到 ∣ x − x 0 ∣ ≤ 1 0 − 5 |x-x_0|\leq10^{-5} xx0105 时结束。
`l<(`(鈥榊,C语言每日一练,c语言,C语言每日一练,牛顿迭代法,算法,后端

2. 题目分析

牛顿迭代法是取 x 0 x_0 x0 之后,在这个基础上,找到比 x 0 x_0 x0 更接近的方程的根,一步一步迭代,从而找到更接近方程根的近似根。
 
r r r f ( x ) = 0 f(x)=0 f(x)=0 的根,选取 x 0 x_0 x0 作为 r r r 初始近似值。
 
过点 ( x 0 , f ( x 0 ) ) (x_0, f(x_0)) (x0,f(x0)) 作为曲线 y = f ( x ) y=f(x) y=f(x) 的切线 L L L
 
L L L 的方程为 y = f ( x 0 ) + f ′ ( x 0 ) ∗ ( x − x 0 ) y=f(x_0)+f'(x_0)*(x-x_0) y=f(x0)+f(x0)(xx0)
 
求出 L 与 x 轴交点的横坐标 x 1 = x 0 − f ( x 0 ) / f ′ ( x 0 ) x_1=x_0-f(x_0)/f'(x_0) x1=x0f(x0)/f(x0),称 x x x r r r 的一次近似值,
 
过点 ( x 1 , f ( x 1 ) ) (x_1,f(x_1)) (x1,f(x1)) 作为曲线 y = f ( x ) y=f(x) y=f(x) 的切线,并求该切线与 x 轴的横坐标 x 2 = x 1 − f ( x 1 ) / f ′ ( x 1 ) x_2=x_1-f(x_1)/f'(x_1) x2=x1f(x1)/f(x1),称 x 2 x_2 x2 r r r 的二次近似值,
 
重复以上过程,得 r r r 的近似值 x n x_n xn
 
上述过程即为牛顿迭代法的求解过程。

3. 算法设计

程序流程分析👇
 
(1) 在 1 1 1 附近找任一实数作为 x 0 x_0 x0 的初值,我们取 1.5 1.5 1.5,即 x 0 = 1.5 x_0=1.5 x0=1.5
 
(2) 用初值 x 0 x_0 x0 代入方程中计算此时的 f ( x 0 ) f(x_0) f(x0) f ′ ( x 0 ) f'(x_0) f(x0);程序中用变量 f f f 描述方程的值,用 f d fd fd 描述方程求导之后的值。
 
(3) 计算增量 h = f / f d h=f/fd h=f/fd
 
(4) 计算下一个 x : x = x 0 − h x:x=x_0-h x:x=x0h
 
(5) 用新产生的 x x x 替换原来的 x o x_o xo,为下一次迭代做好准备。
 
(6) 若 ∣ x − x 0 ∣ > = 1 e − 5 |x-x_0|>=1e-5 xx0>=1e5,则转到第 (3) 步继续执行,否则转到步骤 (7)。
 
(7) 所求 x x x 就是方程 a x 3 + b x 2 + c x + d = 0 ax^3+bx^2+cx+d=0 ax3+bx2+cx+d=0 的根,将其输出。
 
本程序的编写既可用 while,也可用 do...while,二者得到的结果是一样的,只是在赋初值时稍有不同。
 
while 结构需要先判定条件,即先判断 ∣ x − x 0 ∣ > = 1 e − 5 |x-x_0|>=1e-5 xx0>=1e5 是否成立,这样对于 x x x x 0 x_0 x0 我们要在 1 1 1 附近取两个不同的数值作为初值;
 
do...while 结构是先执行一次循环体,得到 x x x 的新值后再进行判定,这样程序开始只需给 x x x 赋初值。
 
这里我们采用 do...while 结构来实现。

4. 确定程序框架

程序的主体结构如下👇

`l<(`(鈥榊,C语言每日一练,c语言,C语言每日一练,牛顿迭代法,算法,后端
由于程序中用到了绝对值函数 fabs() , 所以在程序的开始要加上头文件#include <math.h>

流程图如下所示👇

`l<(`(鈥榊,C语言每日一练,c语言,C语言每日一练,牛顿迭代法,算法,后端

5. 迭代法求方程根

编写程序时要注意的一点是判定 ∣ x − x 0 ∣ > = 1 e − 5 |x-x_0|>=1e-5 xx0>=1e5
 
从牛顿迭代法的原理可以看出:迭代的实质就是越来越接近方程根的精确值,最初给 x 0 x_0 x0 所赋初值与根的精确值是相差很多了,正是因为这个我们才需要不断地进行迭代,也就是程序中循环体的功能。
 
在经过一番迭代之后所求得的值之间的差别也越来越小,直到求得的某两个值的差的绝对值在某个范围之内时,便可结束迭代。
 
若我们把判定条件改为 ∣ x − x 0 ∣ < 1 e − 5 |x-x_0|<1e-5 xx0<1e5,则第一次的判断结果必为假,这样就不能进入循环体再次执行。

定义 solution()函数求方程的根。solution()函数的代码如下👇

`l<(`(鈥榊,C语言每日一练,c语言,C语言每日一练,牛顿迭代法,算法,后端

6. 代码实现

完整代码📝

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

float solution(float a, float b, float c, float d)
{
	float x0, f, fd, h; 
	float x = 1.5;

	do
	{
		x0 = x; 

		f = a * x0 * x0 * x0 + b * x0 * x0 + c * x0 + d;

		fd = 3 * a * x0 * x0 + 2 * b * x0 + c;

		h = f / fd;

		x = x0 - h; 

	} while (fabs(x-x0) >= 1e-5);

	return x;
}

int main()
{
	float a, b, c, d; 

	float x; 
	
	printf("请输入方程的系数:");
	
	scanf("%f %f %f %f", &a, &b, &c, &d);
	
	x = solution(a, b, c, d);
	
	printf("\n");
	
	printf("所求方程的根为:x=%f\n", x);

	return 0;
}

运行结果👇

`l<(`(鈥榊,C语言每日一练,c语言,C语言每日一练,牛顿迭代法,算法,后端

代码解释👇

`l<(`(鈥榊,C语言每日一练,c语言,C语言每日一练,牛顿迭代法,算法,后端文章来源地址https://www.toymoban.com/news/detail-818026.html

到了这里,关于C语言每日一练——第154天:牛顿迭代法求方程根的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数学】通俗理解泰勒公式(牛顿迭代法有用到)

    最近在看一些机器学习优化相关的方法(梯度下降、牛顿迭代等),里面又涉及到泰勒公式展开等,大学学的奈何都忘的差不多了,于是就看了一些博客,整理一下。 泰勒公式,也称泰勒展开式。是用一个函数在某点的信息,描述其附近取值的公式。如果函数足够平滑,在已

    2024年02月04日
    浏览(32)
  • 牛顿迭代法Python代码,全网最详细,教学向

                    代码功能包括函数图像展示,初始值选取收敛区间判断,迭代结果输出,迭代过程图像输出。         因讲解过于冗长,先将完整代码直接放在这里,只是想抄个模板方便修改的可以直接拿去用啦,有不了解的地方可以再翻下去看。 下面是纯新手向详细代

    2024年02月08日
    浏览(33)
  • 数值分析——关于非线性方程求根的迭代法

    目录 一、Aitken算法: 二、Steffensen算法: 三、牛顿切线法 四、定端点弦截法 五、动端点弦截法 六、不动点迭代法 七、二分迭代法 Aitken算法是一种加速级数收敛的方法,适用于递推计算和迭代解法,其核心思想是通过利用级数中的部分和之间的线性关系来加速收敛。 对应的迭

    2024年02月03日
    浏览(43)
  • 【学习笔记】求解线性方程组的G-S迭代法

    matlab中调用上述函数结果显示: 哪里出问题了啊?

    2024年02月10日
    浏览(30)
  • 数学建模算法(基于matlab和python)之 线性方程组的迭代法(雅可比迭代、高斯-赛德尔迭代)(7/10)

    实验目的及要求: 1、了解各迭代法的基本原理和特点; 2、判断雅克比迭代、高斯-塞德尔迭代对任意初始向量的收敛性; 3、完成雅克比迭代、高斯-塞德尔迭代算法的程序实现。 实验内容: 1、编写雅可比迭代法与高斯-赛德尔迭代法通用子程序,求解下列线性方程组 ,并考

    2024年02月04日
    浏览(35)
  • 求解方程x^2=a的根,不使用库函数直接求解(不动点迭代法)

            首先可以将方程两边同时加上x, ,这时候两边同时再除以1+x,就得到了 ,变形为 。(变性后的 迭代式不唯一 ,这里随便选取一个)          当x是准确值的时候,两边应该是相等的,如果x是近似值,x误差很小很小,我们变可以认为x是可接受的近似解。 

    2024年02月15日
    浏览(41)
  • Matlab中求解线性方程组——高斯消元法、LU分解法、QR分解法、SVD分解法、迭代法等

    MATLAB迭代的三种方式以及相关案例举例 MATLAB矩阵的分解函数与案例举例 MATLAB当中线性方程组、不定方程组、奇异方程组、超定方程组的介绍 MATLAB语句实现方阵性质的验证 MATLAB绘图函数的相关介绍——海底测量、二维与三维图形绘制 MATLAB求函数极限的简单介绍 文章目录 前言

    2024年02月08日
    浏览(46)
  • 【数值计算方法(黄明游)】解线性代数方程组的迭代法(一):向量、矩阵范数与谱半径【理论到程序】

       注意:速读可直接跳转至“4、知识点总结”及“5、计算例题”部分   当涉及到线性代数和矩阵理论时, 向量、矩阵范数以及谱半径 是非常重要的概念,下面将详细介绍这些内容: a. 定义及性质   考虑一个 n n n 维向量 x x x ,定义一个实值函数 N ( x ) N(x) N ( x ) ,

    2024年01月25日
    浏览(36)
  • 雅可比迭代和高斯—赛德尔迭代法

           对于线性方程组AX=b,我们首先将系数矩阵A分解为对角矩阵D、下三角矩阵L和上三角矩阵U:   在这里,我们求解下面的带状方程(以下程序均是以求解该带状方程为例): .............           高斯—赛德尔迭代法是再雅可比迭代法的基础上,在计算 时尽可能地用最

    2024年01月25日
    浏览(32)
  • 松弛(SOR)迭代法

            松弛迭代法是在雅可比迭代法和高斯——赛德尔迭代法的基础上,以w0为松弛因子,建立迭代格式如下: 即         我们将线性方程组AX=b的系数矩阵A分解成一个对角矩阵D、一个下三角矩阵L和一个上三角矩阵D,即A=D-L-U,则有:                        当w=1时,

    2024年02月04日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包