#include#include doublefunc(doublex)//举例函数 { returnx*x*x*x-3*x*x*x 1.5*x*x-4.0; } doublefunc1(doublex)//导函数 { return4*x*x*x-9*x*x 3*x; } intNewton(double*x,doubleprecision,intmaxcyc)//maxcyc迭代次数 { doublex1,x0; intk; x0=*x; for(k=0;k 牛顿迭代法C 代码
//此函数是用来求一元3次方程ax^3 bx^2 cx d=0的解 //比如x^3-27=0,我们就可以输入100-27,这样我们就可以得到一个解 #include#include usingnamespacestd; intmain() { doublediedai(doublea,doubleb,doublec,doubled,doublex); doublea,b,c,d; doublex=10000.0; cout<<"请依次输入方程四个系数:"; cin>>a>>b>>c>>d; x=diedai(a,b,c,d,x); cout< 0.000001) { x=x-(a*x*x*x b*x*x c*x d)/(3*a*x*x 2*b*x c); } returnx; } 求一元3次方程3个解的程序:
#include#include usingnamespacestd;vector v;//stlvector链型数组 vector ::iteratorit;//vector迭代器intx0=5;doublea,b,c,d;doubleabs(doubley){while(y<0)y=-y;returny;}doublef(doublex){returna*x*x*x b*x*x c*x d;}doublefd(doublex){return3*a*x*x 2*b*x c;}boolu;//用来判断是否重复voidnewton(inta1,intb1,intc1,intd1) { for(x0=-5000;x0<=5000;x0 )//在一个大区域中逐个点用牛顿法,可找出大多数3次方程所有根 { doublex1=x0; while(abs(f(x1))>0.001) { doublex=x1; x1=x-f(x)/fd(x); } for(it=v.begin();it!=v.end();it ) { if(abs((*it-x1))<0.01){u=1;break;} } if(u!=1&&x1<1000000000) { cout< >a>>b>>c>>d; newton(a,b,c,d); } 牛顿迭代法Python代码
Python代码以实例展示求解方程
的根。 deff(x): return(x-3)**3'''定义f(x)=(x-3)^3'''deffd(x): return3*((x-3)**2)'''定义f'(x)=3*((x-3)^2)'''defnewtonMethod(n,assum): time=n x=assum Next=0 A=f(x) B=fd(x) print('A=' str(A) ',B=' str(B) ',time=' str(time)) iff(x)==0.0: returntime,x else: Next=x-A/B print('Nextx=' str(Next)) ifabs(A-f(Next))<1e-6: print('Meetf(x)=0,x=' str(Next))'''设置迭代跳出条件,同时输出满足f(x)=0的x值''' else: returnnewtonMethod(n 1,Next)newtonMethod(0,4.0)'''设置从0开始计数,x0=4.0'''牛顿迭代法Java代码
Java实现开平方的牛顿迭代法. 求
的算术平方根就是求 的正根, 得迭代公式: . 代码中取初始值 , 误差控制在 . publicstaticdoublesqrt(doublec){if(c<0){returnDouble.NaN; } doublee=1e-15; doublex=c; doubley=(x c/x)/2; while(Math.abs(x-y)>e){ x=y; y=(x c/x)/2; } returnx; }牛顿迭代法JavaScript代码
/** *@functionnewtonMethod该函数是牛顿迭代法的js实现他可以用于求任意一元高次方程的解。(简单版) *@paramfn要求根的函数 *@paramdfn要求根的函数的导函数 *@paramx0在函数x定义域上任意取的一个x值x0 *@paramn期望迭代的次数 *@return该方程的近似解 **/functionnewtonMethod(fn,dfn,x0,n){ consty=fn(x0)//在函数有效区间内选取任意x0求出点(x0,y)其中y=fn(x0) constk=dfn(x0)//使用导函数求出过点(x0,y)的切线斜率k constb=y-k*x0//将点(x0,y)代入直线方程y=kx b求出常数b。 constx=(0-b)/k//将y=0代入直线方程y=kx b求出该方程的一次近似解x if(--n>0){ returnnewtonMethod(fn,dfn,x,n)//当n趋于无穷大时得到该方程的精确解 } returnx }//化简函数(simplify)functionNTMethod(fn=_=>_,dfn=_=>1,x0=0,n=1){ constx=x0-fn(x0)/dfn(x0) if(n===1){ returnx//返回一个关于函数fn(x)的近似解 } returnNTMethod(fn,dfn,x,--n) }// 优化函数表达方式 用户差参数代替迭代次数function NTMethod(fn = _ => _, dfn = _ => 1, x0 = 0, instrumentalError) { const x = x0 - fn(x0) / dfn(x0) if (fn(x) < instrumentalError && fn(x) > -instrumentalError) { return x } return NTMethod(fn, dfn, x, instrumentalError) }牛顿迭代法Fortran代码
program newton
implicit none real::a real::b real::fb real::counter integer::n !real,parameter::zero=0.00001 real::fx,fx1 real::df write(*,*)"enter a number:" read(*,*)a do counter=1,a-1 fx=sin(counter) fx1=sin(counter 1) if (fx*fx1 df=cos(counter) fx=sin(counter) write(*,*)"初始值取:" write(*,*)counter do n=1,25,1 b=counter-fx/df fb=sin(b) end do write(*,*)"数值解:" write(*,*)b end if end do stop end program
牛顿迭代法其他迭代算法
牛顿迭代法欧几里德算法
最经典的迭代算法是欧几里德算法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb r,则r = a mod b。假设d是a,b的一个公约数,则有 a%d==0,b%d==0,而r = a - kb,因此r%d==0 ,因此d是(b,a mod b)的公约数
同理,假设d 是(b,a mod b)的公约数,则 b%d==0,r%d==0 ,但是a = kb r ,因此d也是(a,b)的公约数。
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
欧几里德算法就是根据这个原理来做的,欧几里德算法又叫辗转相除法,它是一个反复迭代执行,直到余数等于0停止的步骤,这实际上是一个循环结构。其算法用C语言描述为:
intGcd_2(inta,intb)/*欧几里德算法求a,b的最大公约数*/ { if(a<=0||b<=0)/*预防错误*/ return0; inttemp; while(b>0)/*b总是表示较小的那个数,若不是则交换a,b的值*/ { temp=a%b;/*迭代关系式*/ a=b; b=temp; } returna; }从上面的程序我们可以看到a,b是迭代变量,迭代关系是temp = a % b;根据迭代关系我们可以由旧值推出新值,然后循环执a = b; b = temp;直到迭代过程结束(余数为0)。在这里a好比那个胆小鬼,总是从b手中接过位置,而b则是那个努力向前冲的先锋。
牛顿迭代法斐波那契数列
还有一个很典型的例子是斐波那契(Fibonacci)数列。斐波那契数列为:0、1、1、2、3、5、8、13、21、…,即 fib⑴=0; fib⑵=1;fib(n)=fib(n-1) fib(n-2) (当n>2时)。
在n>2时,fib(n)总可以由fib(n-1)和fib(n-2)得到,由旧值递推出新值,这是一个典型的迭代关系,所以我们可以考虑迭代算法。
intFib(intn)//斐波那契(Fibonacci)数列 { if(n<1)/*预防错误*/ return0; if(n==1||n==2)/*特殊值,无需迭代*/ return1; intf1=1,f2=1,fn;/*迭代变量*/ inti; for(i=3;i<=n; i)/*用i的值来限制迭代的次数*/ { fn=f1 f2;/*迭代关系式*/ f1=f2;//f1和f2迭代前进,其中f2在f1的前面 f2=fn; } returnfn; }