设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的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))。
#include<iostream> using namespace std; double fabs(double x) { if(x>0) return x; else return -x; } int main() { double a,b,c,d; while (scanf("%lf%lf%lf%lf",&a,&b,&c,&d)!=EOF) { if(a==0&&b==0&&c==0&&d==0) return 0; double x0=1,x,f; x=x0-(x0*x0*x0*a+x0*x0*b+c*x0+d)/(3*x0*x0*a+2*b*x0+c); f=x*x*x*a+x*x*b+c*x+d; while (fabs(f)-0>1e-8) { x0=x; x=x0-(x0*x0*x0*a+x0*x0*b+c*x0+d)/(3*x0*x0*a+2*b*x0+c); f=x*x*x*a+x*x*b+c*x+d; } printf("%.3lf\n",x); } return 0; }
ccsu 1027 一元三次方程求解 (牛顿迭代)
最新推荐文章于 2022-11-20 23:38:17 发布