利用牛顿法求方程x^4-3x^3+1.5x^2-4=0的根。
【定义】
牛顿迭代法是用于求方程或方程组近似根的一种常用算法。
1.推导过程
设已知方程f(x)=0的近似根为x0,则在x0处的泰勒展开式为:
取线性部分即泰勒展开式的前两项作为非线性方程f(x)=0近似方程,则有:
如果,则方程的解为
这样就得到了一个迭代序列:
接下来,就可以利用该迭代公式求方程的近似解。
1.算法描述
利用迭代公式
求方程f(x)=0近似根的算法步骤如下:
(1)选一个方程的近似根,赋给变量x0。
(2)将x0的值存放到变量x1中,然后计算f(x1),并将结果存放在变量x0中。
(3)当x0与x1的差的绝对值不小于指定的精度时,重复执行(2);否则,算法结束。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按照上述方法求得的x0就认为是方程的根。
code:
#include<stdio.h>
#include<math.h>
#include <iostream>
#define EPS 1e-6
double f(double x);
double f1(double x);
int Newton(double *x, int iteration);
void main()
{
double x;
int iteration;
printf("输入初始迭代值x0:");
scanf("%lf", &x);
printf("输入迭代的最大次数:");
scanf("%d", &iteration);
if (1 == Newton(&x, iteration))
printf("该值附近的根为:%lf\n", x);
else
printf("迭代失败!\n");
system("pause");
}
double f(double x)
/*函数*/
{
return x*x*x*x - 3 * x*x*x + 1.5*x*x - 4.0;
}
double f1(double x)
/*导函数*/
{
return 4 * x*x*x - 9 * x*x + 3 * x;
}
int Newton(double *x, int iteration)
/*迭代次数*/
{
double x1, x0;
int i;
x0 = *x; /*初始方程的近似根*/
for (i = 0; i < iteration; i++) /*iteration是迭代次数*/
{
if (f1(x0) == 0.0)/*如果倒数为0,则返回0(该方法失效)*/
{
printf("迭代过程中导数为0!\n");
return 0;
}
x1 = x0 - f(x0) / f1(x0);/*开始牛顿迭代计算*/
if (fabs(x1 - x0) < EPS || fabs(f(x1)) < EPS) /*达到结束条件*/
{
*x = x1; /*返回结果*/
return 1;
}
else /*未达到结束条件*/
x0 = x1; /*准备下一次迭代*/
}
printf("超过最大的迭代次数!\n"); /*迭代次数达到规定的最大值,仍没有达到精度*/
return 0;
}
结果: