结论:迭代序列: x (n+1)= x (n)- f ( x(n) ) / f '( x(n) )
(附C++代码)
(通过不断作切线找切线与x轴交点重复,交点不断向根逼近)
牛顿迭代法:在实数和复数域求方程的近似根,由泰勒级数前几项寻找
计算方法:
设 x 是 f(x) = 0的根,选取 x0 作为 x 初始近似值,过点( x0, f(x ) )做曲线y = f(x)的切线L,则L的方程为y = f(x0)+f '(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0) / f '(x0),称 x1为x的一次近似值。过点(x1 , f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/ f '(x1),称x2为x的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为x的n+1次近似值,上式称为牛顿迭代公式。
解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)在x0点附近展开成泰勒级数 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其线性部分(一次),作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)= x(n)-f(x(n) ) / f '(x(n) )。
//求3元一次方程ax^3+bx^2+cx+d=0的解
//比如 x^3-27=0,我们就可以输入1 0 0 -27,这样我们就可以得到一个解
#include<iostream>
#include<cmath>
using namespace std;
double diedai(double a,double b,double c,double d,double x)
{
while(abs(a*x*x*x+b*x*x+c*x+d)>0.000001)
x=x-(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c);
return x;
}
int main()
{
double a,b,c,d;
double x=10000.0;
cout<<"请依次输入方程四个系数:";
cin>>a>>b>>c>>d;
x=diedai(a,b,c,d,x);
cout<<x<<endl;
return 0;
}
迭代法:又称辗转法,通过变量的旧值 推导新值的方法
如辗转相除法:最大公因数:gcd(a,b)=gcd(b,a mod b);
证:设a=kb+r,则r=a-kb,设m为a,b的公因数,则a%m=b%m=0;所以r%m=0,所以m为a%b的公因数。
反之,设m为b,a mod b的公因数,则a%m=0,所以m为a的公因数。
所以a,b的公因数与b,a mod b的公因数相同,所以最大公因数也相同