【最优化】C++实现0.618法、Fibonacci法、二分法

 参考课本最优化方法 - 孙文瑜等

根据课本P110算法3.2.1(0.618法计算步骤)编写C++代码,例题为P137第4题(1)(2)

0.618法代码

#include <iostream>
#include <cmath>

double f(double t) {
    return exp(-t) + exp(t);
}

/*!
 * 实现0.618法
 * @param f 需要优化的函数
 * @param a 优化区间下界
 * @param b 优化区间上界
 * @param epsilon 最终所得区间长度最大值
 * @return
 */
double golden_section(double(*f)(double), double a, double b, double epsilon) {
    double lambda = a + 0.382 * (b - a);
    double mu = a + 0.618 * (b - a);
    int k = 0; // 记录迭代次数
    double result = 0; // 储存返回值

    while (true) {
        if (f(lambda) < f(mu)) {
            // step 3
            if (b - lambda <= epsilon) {
                result = mu;
                break;
            } else {
                a = lambda;
                lambda = mu;
                mu = a + 0.618 * (b - a);
            }
        } else {
            // step 4
            if (mu - a < epsilon) {
                result = lambda;
                break;
            } else {
                b = mu;
                mu = lambda;
                lamb
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值