C语言之黄金分割求函数最小值(单峰情况)

C语言之黄金分割求函数最小值(单峰情况),第1张

黄金分割求函数最小值(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记录。

每次迭代计算时都会刷新所有值,其中x1y,x2y不是使用数组存储,而是相当于一个临时值记录函数值。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/674284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)