初级系列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 */