zoukankan      html  css  js  c++  java
  • 初级系列6.牛顿迭代法求方程根问题

    牛顿迭代法求方程根

    问题描述
    编写用牛顿迭代法求方程根的函数, 方程为ax^3 + bx^2 + cx + d = 0
    系数a,b,c,d由主函数输入, 求x在1附近的一个实根. 求出根后,由主函数输出
    牛顿迭代法的公式是:
    x = x0 - f(x0) / f'(x0) 设迭代到|x-x0| <= 10^5时结束
    问题分析
    牛顿迭代法是取x0之后,在此基础找到比x0更接近的方程的根,一步步迭代从而找到更接近方程根的近似根
    设r是f(x) =0的根,选取x0作为r初始近似值,过点(x0,f(x0)) 做曲线y = f(x)的切线L

    L的方程为y = f(x0) + f'(x0)(x-x0)

    求出L与x轴交点的横坐标x1=x0 - f(x0)/f'(x0)
    称x1为r的一次近似值,过点(x1, f(x1))做曲线y=f(x)的切线,并求该切线与x轴的横坐标 x2=x1-f(x1)/f'(x2)称为r的二次近似值,重复以上过程,得r的近似值xn 上述过程即为牛顿迭代法的求解过程
    算法设计
    程序流程分析:
    |--1. 在1附近找任一实数作为x0的初值 取1.5即x0 = 1.5
    |--2. 用初值x0代入方程中计算此时的f(x0)及f'(x0) 程序中用变量f描述方程的值用fd描述方程求导之后的值
    |--3. 计算增量h=f/fd
    |--4. 计算下一个x, x = x0 - h
    |--5. 用新产生的x替换原来的x0 为下一次迭代作好准备
    |--6. 若|x-x0|>=le-5 则转到步骤3继续执行 否则转到步骤7
    |--7. 所求x就是方程ax^3 + bx^2 + cx + d = 0的根,将其输出

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main()
    {
    	float solution(float a, float b, float c, float d);     //函数功能是用牛顿迭代法求方程的根
    	float a,b,c,d,x;        //x用来记录求得的方程根, abcd代表所求方程的系数
    	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 + b*x0 + c;
    		h = f/fd;
    		x = x0 - h;
    	} while (fabs(x-x0) >= 1e-5);
    	return x;
    }
    
    /* !< input */
    2 -4 3 -6
    /* !< output */
    
  • 相关阅读:
    day12-html(css)
    day-12- 前端 html
    python-day11 pymysql
    day11-mysql 练习题
    python-day11 Mysql 数据类操作
    python-day11 Mysql 数据类型
    python-day11-MYSQL 数据库及数据表
    最简单的checkbox, radio跟文字在一行
    前端压缩
    table td 设置宽高无效的问题
  • 原文地址:https://www.cnblogs.com/xzpin/p/11484499.html
Copyright © 2011-2022 走看看