뉴턴의 방법을 사용하여 방정식 x ^ 4-3x ^ 3 + 1.5x ^ 2-4 = 0의 근을 구합니다.
【정의】
Newton의 반복 방법은 방정식 또는 방정식의 근사 근을 찾는 데 일반적으로 사용되는 알고리즘입니다.
1. 유도 과정
알려진 방정식 f (x) = 0의 근사 근이 x0이라고 가정하면 x0에서 Taylor 확장은 다음과 같습니다.
선형 부분, 즉 Taylor 확장의 처음 두 항을 비선형 방정식 f (x) = 0 근사 방정식으로 취하면 다음과 같습니다.
이면 방정식의 해는 다음과 같습니다.
결과적으로 반복 시퀀스가 발생합니다.
다음으로 반복 공식을 사용하여 방정식에 대한 근사 솔루션을 찾을 수 있습니다.
1. 알고리즘 설명
반복 공식 사용
방정식 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;
}
결과: