黄金分割求函数最小值(GOLDEN=0.6180339887498948l):给定非线性方程(exp(x)-2*x*x),输入区间起点实数A和终点实数B ,输出满足最大误差(EPS=0.4E-8)时,最后的区间起点,黄金分割近点,黄金分割远点,区间终点,近点对应函数值,远点对应函数值 (使用双精度double类型精确到小数点后9位有效数)。输入格式 m(整数,实验数据总数) A1 B1(实数,区间起点与终点) A2 B2(实数,区间起点与终点) ... Am Bm(实数,区间起点与终点) 输出格式 A X1 X2 B Y1 Y2(输出满足最大误差(EPS=0.4E-8)时, 的区间起点,黄金分割近点,黄金分割远点,区间终点,近点对应函数值,远点对应函数值) A X1 X2 B Y1 Y2(输出满足最大误差(EPS=0.4E-8)时, 最后的区间起点,黄金分割近点,黄金分割远点,区间终点,近点对应函数值,远点对应函数值) ... A X1 X2 B Y1 Y2(输出满足最大误差(EPS=0.4E-8)时, 最后的区间起点,黄金分割近点,黄金分割远点,区间终点,近点对应函数值,远点对应函数值)
#include
#include
#include
double funx(double x)
{
double y = exp(x)-2*x*x;
return y;
}
int main()
{
double GOLDEN=0.6180339887498948l;
int m;
double x1y = 0.0,x2y = 0.0,ax = 0.0,bx = 0.0;
scanf("%d",&m);
double am[m],bm[m],x1[m],x2[m],axb[m];//1是近点,2是远点
for(int i=0; i
一些设计思路:
对于本次实验主要是计算黄金分割近点x1和远点x2,然后比较在这两点时e^x-2x的函数值,当f(x1)
既if(x1y
{
bm[i] = x2[i];
am[i] = am[i];
x2[i] = x1[i];
x1[i] = am[i]+ax;
x2y = x1y;
x1y = funx(x1[i]);
}
反之就是f(x1)>=f(x2)时,则是把区间的始点用x1替代,黄金分割近点
替代成原黄金分割远点 ,再重新计算远点
else
{
am[i] = x1[i];//
bm[i] = bm[i];
x1[i] = x2[i];
x2[i] = am[i]+bx;
x1y = x2y;
x2y = funx(x2[i]);
}
然后就是迭代次数问题,应该题目要求是输出小数点后九位,而且误差是在0.4E-8所以迭代次数会少于51次,并且黄金分割近点到区间始点的距离要大于0.4E-8。 既if(ax<0.4E-8) break;然后在循环迭代时迭代次数那里设置最多50次。
然后是输入输出以及存储问题,我这里是直接设计了以下这些数组,分别存储近点x1,远点x2,始点am,终点bm;double am[m],bm[m],x1[m],x2[m];//1是近点,2是远点。 每次迭代计算时都会刷新所有值,其中
然后对于在对应近点和远点的函数值则是用x1y,x2y记录。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)