1.牛顿迭代
若f(x)=0在(a,b)内有一个零点α,在α的邻域内,|x-α|<ε,f ˊ(x)不等于0,且f″(x)存在,则从靠近α的任一点x0出发,构造计算序列xn+1=xn-f(xn)/f ˊ(xn)
2.弦截法
xk+1=xk-f(xk)* (xk-xk-1)/(f(xk)-f(xk-1)
特点:若收敛,则收敛速度也较快,不须计算导数,但需要设置2个初值。
例:试对方程x2=c写出对应的牛顿迭代公式。
#include <stdio.h>
#include <math.h>
float c=16;
float newton(float a,float b);
int main(void){
printf("root=%f\n",newton(0,1+c));
return 0;
}
float f(float x){
return x*x-c;
}
float d(float x){
return 2*x;
}
float newton(float a,float b){
float f(float x);
float d(float x);
float x0=(a+b)/2,x1;
x1=x0-f(x0)/d(x0);
while(fabs(x1-x0)>1e-6){
x0=x1;
x1=x0-f(x0)/d(x0);
}
return x0;
}
例:试编写自定义函数mysqrt,形式为float mysqrt(float x);它返回x的平方根。
#include <stdio.h>
float mysqrt(float x);
int main(void){
printf("%f",mysqrt(8));
return 0;
}
float mysqrt(float x){
int s=x;
while(x*x>s){
x=(x+s/x)/2;
}
return x;
}
例:利用牛顿迭代公式,求解x2-3x-4=0在(1,6)之间的根。
方法一:
#include <stdio.h>
#include <math.h>
float newton(float a,float b);
int main(void){
printf("%f",newton(1,6));
return 0;
}
float newton(float a,float b){
float f(float x);
float d(float x);
float x0=(a+b)*0.5,x1;
x1=x0-f(x0)/d(x0);
while(fabs(x1-x0)>1e-6){
x0=x1;
x1=x0-f(x0)/d(x0);
}
return x0;
}
float f(float x){
return x*x-3*x-4;
}
float d(float x){
return 2*x-3;
}
方法二:
#include <stdio.h>
#include <math.h>
float duifen(float a,float b);
int main(void){
printf("root=%f",duifen(1,6));
return 0;
}
float f(float x){
return x*x-3*x-4;
}
float duifen(float a,float b){
float f(float x);
float m;
while(fabs(a-b)>1e-6){
m=(a+b)*0.5;
if(f(a)*f(m)<0)b=m;
if(f(m)*f(b)<0)a=m;
if(fabs(f(m)-0)<=1e-5)return m;
}
}