进退法确定初始区间及黄金分割法进行一维搜索(C++)

本文介绍了一种基于递归搜索的优化方法,用于在给定函数中找到单谷区间的精确近似值,通过不断调整步长和区间,实现牛顿法的迭代过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>

#include<math.h>

#define f(x) x*x+2*x+1// 定义函数

int main()

{

double a0,a1,a2,a3,f1,f2,f3,h;

printf( "a0= ",a0);// 单谷区间起始点

scanf( "%lf" ,&a0);

printf("h= " ,h);// 起始的步长

scanf( "%lf" ,&h);

a1=a0;

a2=a1+h;

f1=f(a0);

f2=f(a2);

if(f1>f2)

// 判断函数值的大小 ,确定下降方向

{

a3=a2+h;

f3=f(a3);

}

else

{

h=-h;

a3=a1;

f3=f1;

a1=a2;

f1=f2;

a2=a3;

f2=f3;

a3=a2+h;

f3=f(a3);

}

while(f3<=f2)

// 当不满足上述比较时 ,说明下降方向反向 ,继续进行

{

h=2*h;

a1=a2;

f1=f2;

a2=a3;

f2=f3;

a3=a2+h;

f3=f(a3);

}

float e;

    float a,b;

    float x1,x2,x,g,g1,g2,N;

    

    printf("e=");

    scanf("%f",&e);

    

    //令a=a0,b=b0

    a=a1,b=a3;

    

    //第一次缩小区间 

    x1=a+0.382*(b-a);

    x2=a+0.618*(b-a);

    //目标函数 

    g1=(pow(x1,2)+2*x1+1);

    g2=(pow(x2,2)+2*x2+1);

    

    //printf("校核f1=%f,f2=%f\n",f1,f2);

    

    //判断 

    do{

     if(g1<g2){

     N=0;

     b=x2;

     x2=x1,g2=g1;

  }else{

  N=1;

     a=x1;

      x1=x2,g1=g2;}

      

      N=fabs(a-b);

      if(N<=e){

       x=(a+b)/2;

       printf("x*=%.3f ",x);

       g=(pow(x,2)+2*x+1);

       break;

      }

  else{

       if(N){

        x1=a+0.382*(b-a);

        g1=(pow(x1,2)+2*x1+1);

       }else{

        x2=a+0.618*(b-a);

        g2=(3*pow(x2,2)+2*x2+1);

       }

       

      }

    } while(1) ;

    

    printf("g*= %lf,a= %lf,b= %lf",g,a,b);

    

    return 0;

运行结果:e1b6ccb08b3a4984bb7a680ff5b3b465.jpg

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C#数模C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值