C语言实现牛顿迭代法解方程

C语言实现牛顿迭代法解方程

利用迭代算法解决问题,需要做好以下三个方面的工作:

一、确定迭代变量

在可以用迭代算法解决的问题中,我们可以确定至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

二、建立迭代关系式

所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

三、对迭代过程进行控制

在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析得出可用来结束迭代过程的条件。

接下来,我介绍一种迭代算法的典型案例----牛顿-拉夫逊(拉弗森)方法

牛顿-拉夫逊(拉弗森)方法,又称牛顿迭代法,也称牛顿切线法:先任意设定一个与真实的根接近的值x0作为第一次近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把它作为第二次近似根,再由x1求出f(x1),过(x1,f(x1))点做f(x)的切线,交x轴于x2,……如此继续下去,直到足够接近(比如|x- x0|<1e-6时)真正的根x*为止。

而f '(x0)=f(x0)/( x1- x0)

所以 x1= x0- f(x0)/ f ' (x0)。

我们来看一副从网上找到的图:

例子:用牛顿迭代法求下列方程在值等于2.0附近的根:2x3-4x2+3x-6=0。

 1#include <stdio.h>
 2#include <math.h> 
 3int main(void)
 4{
 5     float x,x0,f,f1; 
 6     x = 2.0;
 7    do{ 
 8           x0=x;
 9           f=2*x0*x0*x0-4*x0*x0+3*x0-6;
10           f1=6*x0*x0-8*x0+3;
11           x=x0-f/f1; 
12    //函数fabs:求浮点数x的绝对值
13    //说明:计算|x|, 当x不为负时返回 x,否则返回 -x      
14    }while(fabs(x-x0)>=1e-5);
15      printf ("%f\n",x);
16     return 0 ;
17 }

执行结果:

当x=1.5时,方程2x3-4x2+3x-6=0。附近的根为2.000000 。

本文分享自微信公众号 - 嵌入式开发圈(gh_d6ff851b4069)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序

由上面两张图可以看出,在Hive和Impala中排序都失败了,没有按照期望中的中文对应的拼音进行排序。

17420
来自专栏A周立SpringCloud

Java开发人员最常犯的10个错误,你犯过几个?

Arrays.asList()会返回一个ArrayList,但是要特别注意,这个ArrayList是Arrays类的静态内部类,并不是java.util.Arr...

9030
来自专栏中科院渣渣博肆僧一枚

tf.variables_initializer

返回初始化变量列表的Op。在会话中启动图形之后,可以运行返回的Op来初始化var_list中的所有变量。这个Op并行运行var_list中所有变量的初始化器。 ...

14310
来自专栏中科院渣渣博肆僧一枚

tf.meshgrid

在N-D网格上广播用于评估的参数。给定N个一维坐标数组*args,返回一个N- d坐标数组的列表输出,用于计算N- d网格上的表达式。

10630
来自专栏静Design

新用户引导UI界面,这么设计才更优秀!

新用户引导绝对是个瓶颈。花费时间设计和开发,找了用户测试调研,最后上线了,依然拦不住汹涌的用户流失潮。

20410
来自专栏Java系列文章

JDK源码阅读(三):ArrayList源码解析

一般来讲文章开始应该先介绍一下说下简介。这里就不介绍了 如果你不知道 ArrayList 是什么的话就没必要在看了。大致讲一下一些常用的方法

10630
来自专栏北风IT之路

Java中String对象最容易被忽略的知识

String是一个字符串类型的类,使用""定义的内容都是字符串,但是String在使用上有一点特殊,它有两种定义方式,相信所有java程序员都知道,但是有些细节...

13120
来自专栏中科院渣渣博肆僧一枚

tf.image.non_max_suppression

贪婪地选择按得分降序排列的边界框子集。删除与先前选择的框具有高交叉-过度联合(IOU)重叠的框。边界框以[y1, x1, y2, x2]的形式提供,其中(y1,...

30120
来自专栏运维之美

轻松玩转 MySQL 8.0 源码编译

此前我最后一次编译 MySQL 源码大概 10 年前了,再后来有人问我怎么编译源码安装,我一般都是建议直接下载二进制包安装,其实真挺方便的,性能上的损失也是微...

34010
来自专栏北风IT之路

Java实例化对象过程中的内存分配

在这个类中定义了两个属性和一个方法,当然也是可以定义多和类和多个方法的。 类现在虽然已经定义好了,但是一个类要使用它必须要实例化对象,那么对象的定义格式有一下两...

17330

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励