대략적인 반복 방법의 반복 알고리즘 7- 뉴턴 반복 방법

뉴턴의 방법을 사용하여 방정식 x ^ 4-3x ^ 3 + 1.5x ^ 2-4 = 0의 근을 구합니다.

【정의】

Newton의 반복 방법은 방정식 또는 방정식의 근사 근을 찾는 데 일반적으로 사용되는 알고리즘입니다.

1. 유도 과정
알려진 방정식 f (x) = 0의 근사 근이 x0이라고 가정하면 x0에서 Taylor 확장은 다음과 같습니다.

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

선형 부분, 즉 Taylor 확장의 처음 두 항을 비선형 방정식 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이 방정식의 근으로 간주됩니다.
암호:

#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