作业帮 > 综合 > 作业

设计一个算法,求方程X^2-4X+2=0在(3,4)之间的近似根

来源:学生作业帮 编辑:搜狗做题网作业帮 分类:综合作业 时间:2024/07/23 03:10:08
设计一个算法,求方程X^2-4X+2=0在(3,4)之间的近似根
精确度为10^-4
设计一个算法,求方程X^2-4X+2=0在(3,4)之间的近似根
1.可以看出,对函数f(x)=x^2-4x+2来说,当x在3,4之间时,f(x)是单调递增的。
2.使用黄金分割法,将上限(UpBound)设为4,下限(LowBound)设为3,容限值(Tolerance)设为10^-4,最好也加一个迭代次数(Iteration),默认可以设个100,根据结果做调整,如果不加迭代而使用无限循环的话,一不小心就会是个死循环。
3.好了,唯一的问题就是什么是黄金分割法了,你可以去搜索一下,到处都有C的源码下载。说一下思路:x在下限A---上限B间取值,求f(x)的值,目标是0,因为容限值是10^-4,将每次猜的x代入f(x)进行计算,得出的结果与目标值和容限值进行比较,符合要求,就停止。如何猜,就是分别取AB的黄金分割点的值,如3---4,那么这两个值就是x1=3+(4-3)*0.618和x2=4-(4-3)*0.618,这里的0.618就是黄金分割算子,注意,取0.618可能精度不够,必要时小数点可以多取几位以提高精度,0.6180339885。
x1,x2有了,分别代入f(x)算个值,再将计算的结果与目标和容限值比较,若x1更接近就将x2设为新的上限,下限A不变;若x2更接近就将x1设为新的下限,上限B不变。进入下一轮循环。总的来说,收敛效果还行。
附一个黄金分割算法,没仔细看正确不正确,但思路有了,如果有错的,自已改对了就行。
#include
#include
#define f(t) (8*pow(t,3)-2*pow(t,2)-7*t+3)
#define eps pow(10,-6)
void sb(double *a,double *b)
{
double t0,t1,t,h,alpha,f0,f1;
int k=0;
printf("请输入初始点t0=");
scanf("%lf",&t0);
printf("\n请输入初始步长h=");
scanf("%lf",&h);
printf("\n请输入加步系数alpha(需大于1)=");
scanf("%lf",α);
f0=f(t0);
t1=t0+h;
f1=f(t1);
while(1)
{
printf("\nf1=%lf,f2=%lf,t0=%lf,t=%lf,h=%lf,k=%d",f0,f1,t0,t1,h,k);
if(f1