IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【最优化】C++实现逐次插值逼近法(三点二次插值法) -> 正文阅读

[C++知识库]【最优化】C++实现逐次插值逼近法(三点二次插值法)

三点二次插值法代码

#include <iostream>
#include <cmath>
#include <random>
#include <ctime>

int SEED = 0; // 用于设置不同的种子,防止产生相同的随机情况

// 课本P137第6题函数
double f(double t) {
    return 1 - t * exp(- t * t);
}

// 课本P114例3.3.2
double f1(double t) {
    return t*t*t - 3*t + 2;
}

// 产生区间内的随机数
double get_alpha(double a, double b) {
    SEED++; // 每调用一次函数改变一次种子,防止产生相同的随机情况

    std::default_random_engine e; // 新建随机数引擎对象
    e.seed(SEED); // 撒下种子

    // 在此确定随机数区间
    std::uniform_real_distribution<double> u(a,b); // 左闭右闭区间[a,b]
    double alpha = u(e);

    return alpha;
}

// 确定3个alpha,参数传入三个alpha的指针地址
void get3alpha(double(*f)(double), double a, double b, double *alpha1, double *alpha2, double *alpha3, double *f1, double *f2, double *f3) {
    while (true) {
        *alpha1 = get_alpha(a, b);
        *alpha2 = get_alpha(*alpha1, b);
        *alpha3 = get_alpha(*alpha2, b);

        *f1 = f(*alpha1);
        *f2 = f(*alpha2);
        *f3 = f(*alpha3);

        if (*f1 > *f2 && *f3 > *f2) break;
    }
}

/*!
 * 三点二次插值法
 * @param f
 * @param a
 * @param b
 * @return
 */
double three_point_interpolation(double(*f)(double), double a, double b) {
    int iteration = 0;
    double epsilon1 = 0.001;
    double epsilon2 = 0.00001;

    // step 0
    double alpha1, alpha2, alpha3, f1, f2, f3;
    get3alpha(f, a, b, &alpha1, &alpha2, &alpha3, &f1, &f2, &f3);

    double alpha_hat, f_hat = 0;
    while (true) {
        // step 1
        alpha_hat = 0.5 * ( (alpha2 * alpha2 - alpha3 * alpha3) * f1 + (alpha3 * alpha3 - alpha1 * alpha1) * f2 + (alpha1 * alpha1 - alpha2 * alpha2) * f3 ) / ( (alpha2 - alpha3) * f1 + (alpha3 - alpha1) * f2 + (alpha1 - alpha2) * f3 );
        f_hat = f(alpha_hat);

        // step 2
        if (alpha_hat > alpha2) {
            // step 3
            if (f_hat <= f2) {
                alpha1 = alpha2;
                alpha2 = alpha_hat;
                f1 = f2;
                f2 = f_hat; // turn to step 5
            } else {
                alpha3 = alpha_hat;
                f3 = f_hat; // turn to step 5
            }
        } else {
            // step 4
            if (f_hat <= f2) {
                alpha3 = alpha2;
                alpha2 = alpha_hat;
                f3 = f2;
                f2 = f_hat; // turn to step 5
            } else {
                alpha1 = alpha_hat;
                f1 = f_hat; // turn to step 5
            }
        }

        // step 5
        if (std::abs(f2) >= epsilon2) {
            if (std::abs(f2 - f_hat) <= epsilon1 * std::abs(f2)) break;
        } else {
            if (std::abs(f2 - f_hat) <= epsilon1) break;
        }
        iteration++; // test
        std::cout << iteration << std::endl; // test
    }

    // step 5
    if (f_hat < f2) return f_hat;
    else return alpha2;
}

int main() {
    double x = three_point_interpolation(f, 0, 1);
    std::cout << "x* = " << x << std::endl;
    std::cout << "f(x*) = " << f(x) << std::endl;
    return 0;
}

结果:

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 13:38:17  更:2021-12-08 13:38:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:44:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码