迭代算法7——近似迭代法之牛顿迭代法

利用牛顿法求方程x^4-3x^3+1.5x^2-4=0的根。

【定义】

牛顿迭代法是用于求方程或方程组近似根的一种常用算法。

1.推导过程
设已知方程f(x)=0的近似根为x0,则在x0处的泰勒展开式为:

f(x)= f(x_0) + f'(x_0)(x-x_0) + \frac{f''(x_0)}{2!} (x-x_0)^2 + ......

取线性部分即泰勒展开式的前两项作为非线性方程f(x)=0近似方程,则有:

f(x_0) + f'(x_0) (x-x_0) =0

如果f(x)\neq 0,则方程的解为

x_1 = x_0 - \frac{f(x)}{f'(x_0)}

这样就得到了一个迭代序列:

x_{n+1} = x_n - \frac{f(x)}{f'(x_0)}

接下来,就可以利用该迭代公式求方程的近似解。


1.算法描述

利用迭代公式

x_{n+1} = x_n - \frac{f(x)}{f'(x_0)}  

求方程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;
}


结果:

猜你喜欢

转载自blog.csdn.net/baidu_36669549/article/details/104123319