用迭代法求 x=√5
#include
#include
/*
用迭代法求 x=√5
求平方根的迭代公式为:X(n+1)=(Xn+a/Xn)/2
*/
int algo01(){
float x1,x2;
float a=5;
x2=a/2; //要先预估一个值x1,其实可以随便找,通常取x1=a/2
do{
x1=x2;
x2=(x1+a/x1)/2; //平方根的迭代公式
}while(fabs(x1-x2)>=1e-5); //如果不满足精确度则一直做
printf("迭代法求平方根,该数的平方根约为:%f\n",x2);
}
int main(){
algo01();
}
牛顿迭代法求方程f(x)=2x ^ 3-4x ^ 2+3x-6=0在1.5附近的根
#include
#include
/*
牛顿迭代法求方程f(x)=2x^3-4x^2+3x-6=0在1.5附近的根
对f(x)求导后f'(x)=6x^2-8x+3
*/
int algo02(){
float x1,x2;
float fx1,fx2;
x2=1.5; //在1.5附近的根
do{
x1 = x2;
fx1 = 2*x1*x1*x1 - 4*x1*x1 + 3*x1 - 6; //f(x)
fx2 = 6*x1*x1 - 8*x1 + 3; //f'(x)
x2 = x1 - fx1/fx2; //x2 = x1 - f(x1)/f'(x)
}while(fabs(x1-x2)>=1e-5); //如果不满足精确度则一直做
printf("牛顿迭代法求解方程,该方程的根约为:%f\n",x2);
}
int main(){
algo02();
}
二分法求方程的根
#include
#include
/*
二分法求方程的根
给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
1 确定区间[a,b],验证f(a)•f(b)<0(这是前提,选取的区间必须满足这个条件),给定精确度ξ
2 求区间(a,b)的中点c
3 计算f(c)
(1) 若f(c)=0,则c就是函数的零点;
(2) 若f(a)•f(c)<0,则令b=c;
(3) 若f(c)•f(b)<0,则令a=c.
(4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复2-4.
*/
float fx(float x){ //求出方程在x处的解
return 2*x*x*x - 4*x*x + 3*x - 6;
}
void algo03(){
float x1,x2;
float fx1,fx2;
float tmp;
float mid;
do{
printf("请输入x1和x2【可以输入-15和10】:\n");
scanf("%f%f", &x1,&x2);
if (x1>x2){ //令x1
tmp = x1;
x1 = x2;
x2 = tmp;
}
fx1 = fx(x1);
fx2 = fx(x2);
}while(fx1*fx2>0); //确保fx1*fx2<0才可以用此方法
if(fabs(fx1)<=1e-5) //如果满足精确度直接打印结果
printf("二分法求解方程,该方程的根约为:%f\n", x1);
else if(fabs(fx2)<=1e-5) //如果满足精确度直接打印结果
printf("二分法求解方程,该方程的根约为:%f\n", x2);
else{
while(fabs(x1-x2)>=1e-5){ //如果不满足精确度则一直做
mid=(x1+x2)/2; //求x1和x2的中点值mid
if(fx(mid)*fx2<0)
x1 = mid; //在【mid,x2】中去找根
else
x2 = mid; //在【x1,mid】中去找根
}
printf("二分法求解方程,该方程的根约为:%f\n", x2); //x1和x2相差很小
}
}
int main(){
algo03();
}