2025年4月14日 星期一 乙巳(蛇)年 正月十五 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言牛顿迭代法求方程根

时间:12-29来源:作者:点击数:70

问题描述

编写用牛顿迭代法求方程根的函数。方程为,系数a、b、c、d由主函数输入。求x在1附近的一个实根。求出根后,由主函数输出。

牛顿迭代法的公式是:,设迭代到  时结束。

问题分析

牛顿迭代法是取 x0 之后,在这个基础上,找到比 x0 更接近的方程的根,一步一步迭代,从而找到更接近方程根的近似根。

设 r 是f(x) = 0的根,选取 x0 作为 r 初始近似值。过点(x0,f(x0))作为曲线的切线L,L的方程为 ,求出L与x轴交点的横坐标 ,称 x1 为 r 的一次近似值,过点(x1,f(x1))作为曲线y=f(x)的切线,并求该切线与x轴的横坐标 ,称 x2 为 r 的二次近似值,重复以上过程,得 r 的近似值 xn

算法设计

  • (1) 在1附近找任一实数作为 x0 的初值,如取 1.5,即 x0=1.5。
  • (2) 用初值 x代入方程中计算此时的 f(x0) 及 f’(x0);程序中用变量 f 描述方程的值,用 fd 描述方程求导之后的值。
  • (3) 计算增量 h=f/fd。
  • (4) 计算下一个x:x=x0-h。
  • (5) 用新产生的 x 替换原来的 x0,为下一次迭代做好准备。
  • (6) 若 |x-x0|>=1e-5,则转到第(3)步继续执行,否则转到步骤(7)。
  • (7) 所求 x 是方程 的根,并将其输出。

下面是完整的代码:

  • #include<stdio.h>
  • #include<math.h>
  • int main()
  • {
  • /*函数功能是用牛顿迭代法求方程的根*/
  • float solution( float a, float b, float c, float d);
  • float a, b, c, d, x; /*a,b,c,d代表所求方程的系数,x用来记录求得的方程根*/
  • printf("请输入方程的系数:");
  • scanf("%f %f %f %f", &a, &b, &c, &d);
  • x = solution(a, b, c, d);
  • printf("所求方程的根为x=%f", x);
  • return 0;
  • }
  • float solution(float a, float b, float c, float d)
  • {
  • float x0, x=1.5, f, fd, h; /*f用来描述方程的值,fd用来描述方程求导之后的值*/
  • do
  • {
  • x0 = x; /*用所求得的x的值代替x0原来的值*/
  • 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; /*求得更接近方程根的x的值*/
  • }
  • while(fabs(x-x0) >= 1e-5);
  • return x;
  • }

运行结果:

请输入方程的系数:2 -3 4 -2

所求方程的根为x=0.694146

知识点补充

本程序的编写既可用while(表达式){循环体}也可用do{循环体}while(表达式),二者得到的结果是一样的,只是在赋初值时稍有不同。while(表达式){循环体}结构需要先判定条件,即先判断 |x-x0|>=1e-5 是否成立,这样对于 x, x0 我们要在 1 附近取两个不同的数值作为初值;do{循环体}while(表达式)结构是先执行一次循环体,得到 x 的新值后再进行判定,这样程序开始只需给 x 赋初值。这里用do{循环体}while(表达式)结构来实现。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门