Description
分别用(1)二分法;(2)牛顿法;(3)牛顿下山法;(4)弦截法;
计算下列方程的实根:<1> x*x-3*x+2-exp(x)=0;<2> x*x*x-x-1=0
要求:(1)精度为10^-8;(2)输出迭代初值及歌词迭代值和迭代次数,比较方法的优劣
参考代码
#include <cstdio>
#include <cmath>
#define percise 0.000000001
double func1(double v,bool id){//原函数
if(id) return v*v-3*v+2-exp(v);//方程1 x^2-3*x+2-e^x=0
else return v*v*v-v-1;//方程2 x^3-x-1=0
}
double func2(double v,bool id){//导数
if(id) return 2*v-3-exp(v);//方程1的导数
else return 3*v*v-1;//方程2的导数
}
void dichotomy(double x,double y,bool id){
double middle=(x+y)/2;
int i=0;
printf("-----------------二分法-------------------\n");
printf("初始值为:左边界点%f,右边界点%f\n",x,y);
while(fabs(func1(middle,id))>percise){
func1(middle,id)*func1(x,id)>0?x=middle:y=middle;
middle=(x+y)/2;
i++;
printf("迭代次数为:%d,左边界点%f,右边界点%f\n",i,x,y);
}
printf("最终结果为%f\n",middle);
}
void NewtonMethod(double x,bool id){
int i=0;
printf("-----------------牛顿法-------------------\n");
printf("初始值为%f\n",x);
while(fabs(func1(x,id)/func2(x,id))>percise){
x-=func1(x,id)/func2(x,id);
i++;
printf("迭代次数为:%d,此时x为%f\n",i,x);
}
printf("最终结果为%f\n",x);
}
void NewtonDownMethod(double x,bool id){
int i=0;
double x1,u=1;
printf("---------------牛顿下山法------------------\n");
printf("初始值为%f\n",x);
while(fabs(func1(x,id)/func2(x,id))>percise){
u=1;
x1=x-u*func1(x,id)/func2(x,id);
if(fabs(func1(x1,id))>=fabs(func1(x,id)))
u*=0.5;
i++;
printf("迭代次数为:%d,此时x为%f,x1为%f,u为%f\n",i,x,x1,u);
x=x1;
}
printf("最终结果为%f\n",x);
}
void SecantMethod(double x,double y,bool id){
int i=0;
printf("-----------------弦割法-------------------\n");
while(fabs(func1(x,id)*(y-x)/(func1(y,id)-func1(x,id)))>percise){
x-=func1(x,id)*(y-x)/(func1(y,id)-func1(x,id));
i++;
printf("迭代次数为:%d,此时x为%f\n",i,x);
}
printf("最终结果为%f\n",x);
}
int main() {
dichotomy(0,1,1);dichotomy(1,2,0);//用二分法求两个方程的解
NewtonMethod(0,1);NewtonMethod(2,0);//用牛顿法求两个方程的解
NewtonDownMethod(-32,1);NewtonDownMethod(-11,0);//用牛顿下降法求两个方程的解
SecantMethod(-10,1,1);SecantMethod(-10,1,0);//用弦割法求两个方程的解
return 0;
}
优化和改进
重在理解,然后是代码并不难,但需要动手计算一下。同学有写成类,然后传函数指针形参,挺6的。然后可以看一下这篇文章https://blog.csdn.net/wangxiaojun911/article/details/18203333