class="hljs-ln-code"> class="hljs-ln-line">price = @(t) -0.1*t.^3 + 2*t.^2 - 15*t + 50;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">% 黄金分割法
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">function [xmin, fmin] = golden_section_search(f, a, b, tol)
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line"> phi = (sqrt(5) - 1) / 2; % 黄金分割比
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"> c = b - phi * (b - a);
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line"> d = a + phi * (b - a);
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line"> while (b - a) > tol
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> if f(c) < f(d)
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line"> b = d;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line"> else
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line"> a = c;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line"> end
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line"> c = b - phi * (b - a);
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line"> d = a + phi * (b - a);
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line"> end
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line"> xmin = (a + b) / 2;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line"> fmin = f(xmin);
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">end
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="21"> class="hljs-ln-code"> class="hljs-ln-line">
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="22"> class="hljs-ln-code"> class="hljs-ln-line">% 定义搜索区间和容差
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="23"> class="hljs-ln-code"> class="hljs-ln-line">a = 0;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="24"> class="hljs-ln-code"> class="hljs-ln-line">b = 10;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="25"> class="hljs-ln-code"> class="hljs-ln-line">tol = 1e-5;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="26"> class="hljs-ln-code"> class="hljs-ln-line">
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="27"> class="hljs-ln-code"> class="hljs-ln-line">% 使用黄金分割法找到最佳买入和卖出时机
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="28"> class="hljs-ln-code"> class="hljs-ln-line">[xmin, fmin] = golden_section_search(price, a, b, tol);
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="29"> class="hljs-ln-code"> class="hljs-ln-line">
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="30"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal time to buy/sell: %.5f\n', xmin);
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="31"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal price: %.5f\n', fmin);
  • class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义目标函数:函数 price 表示股票价格随时间的变化。
    2. 黄金分割法实现:函数 golden_section_search 使用黄金分割比 φ 逐步缩小搜索区间,寻找极值点。
    3. 搜索区间和容差:初始化搜索区间为 0 到 10 小时,设置容差为 1e-5。
    4. 求解最优时机:调用 golden_section_search 函数,找到最佳的买入和卖出时机,并打印结果。

    总结:

    黄金分割法在无导数信息的情况下,通过逐步缩小搜索区间,能够高效地找到目标函数的极值点。在股票交易策略优化竞赛中,利用黄金分割法可以有效地确定最佳的买入和卖出时机,以最大化交易利润。

    第二章:线性规划

    线性规划(Simplex 算法)

    应用类型: 资源分配、生产计划、投资组合优化

    算法简介: 线性规划(Linear Programming,LP)是一类求解线性目标函数在一组线性约束条件下的优化问题的算法。Simplex 算法是最经典的线性规划求解算法之一。它通过逐步移动顶点来搜索可行区域,最终找到最优解。Simplex 算法以其高效性和鲁棒性,广泛应用于各种线性优化问题中。

    优势:

    1. 效率高: Simplex 算法在大多数情况下能够高效求解线性规划问题。
    2. 鲁棒性强: 适用于各种线性约束和目标函数。
    3. 全局最优: 线性规划问题的全局最优解能够通过 Simplex 算法求得。

    应用领域: 线性规划广泛应用于资源分配、生产计划、物流调度、金融投资组合优化等领域。

    生产计划优化

    已知数据: 某工厂生产两种产品 P1 和 P2,每种产品的利润分别为 40 美元和 30 美元。生产每种产品需要的资源如下表:

    class="table-box">
    P121
    class="table-box">
    P212

     工厂每天最多有 100 小时的资源1和 80 小时的资源2。目标是通过合理分配资源以最大化利润。

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义目标函数和约束
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">f = [-40; -30]; % 注意:由于 linprog 求解的是最小值,这里取负
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">A = [2, 1; 1, 2];
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">b = [100; 80];
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">lb = [0; 0];
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">ub = [];
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">% 求解线性规划问题
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">[x, fval] = linprog(f, A, b, [], [], lb, ub);
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal production of P1: %.2f units\n', x(1));
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal production of P2: %.2f units\n', x(2));
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Maximum profit: $%.2f\n', -fval);
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义目标函数:向量 f 表示每种产品的单位利润,由于 linprog 求解的是最小化问题,所以取负。
    2. 定义约束条件:矩阵 A 和向量 b 分别表示线性约束条件的系数矩阵和右端项,lbub 表示变量的下界和上界。
    3. 求解线性规划问题:调用 linprog 函数,求解最优生产计划,并打印结果。

    总结:

    线性规划(Simplex 算法)通过高效求解线性目标函数在一组线性约束条件下的最优解,广泛应用于各种资源分配和生产计划优化问题。在生产计划优化竞赛中,利用 Simplex 算法可以有效地确定最优的生产组合,以最大化工厂利润。

    第三章:无约束非线性优化问题

    梯度下降法

    应用类型: 参数优化、机器学习模型训练

    算法简介: 梯度下降法(Gradient Descent)是一种用于无约束非线性优化问题的迭代算法。它通过沿着目标函数梯度的反方向逐步更新变量,从而逼近函数的极小值。梯度下降法因其简单易用和适用广泛,成为机器学习模型训练和参数优化中的常用算法。

    优势:

    1. 简单易用: 算法简单,易于实现。
    2. 适用广泛: 适用于多种无约束非线性优化问题。
    3. 收敛速度可控: 通过调整步长,可以控制收敛速度和精度。

    应用领域: 梯度下降法广泛应用于机器学习模型训练、参数优化、图像处理、信号处理等领域。

    神经网络训练

    已知数据: 假设一个简单的二次函数作为训练误差函数:

    我们希望通过优化权重参数 w使得训练误差最小。

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义训练误差函数及其梯度
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">E = @(w) (w(1) - 3)^2 + (w(2) - 2)^2;
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">grad_E = @(w) [2*(w(1) - 3); 2*(w(2) - 2)];
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">% 梯度下降法
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">function [w, fval] = gradient_descent(E, grad_E, w0, alpha, tol)
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"> w = w0;
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line"> while norm(grad_E(w)) > tol
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line"> w = w - alpha * grad_E(w);
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> end
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line"> fval = E(w);
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">end
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">% 定义初始权重、步长和容差
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">w0 = [0; 0];
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">alpha = 0.1;
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">tol = 1e-5;
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">% 使用梯度下降法优化权重参数
    20. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">[w, fval] = gradient_descent(E, grad_E, w0, alpha, tol);
    21. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="21"> class="hljs-ln-code"> class="hljs-ln-line">
    22. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="22"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal weights: w1 = %.5f, w2 = %.5f\n', w(1), w(2));
    23. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="23"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Minimum error: %.5f\n', fval);
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义目标函数及其梯度:函数 E 表示训练误差函数,grad_E 表示其梯度。
    2. 梯度下降法实现:函数 gradient_descent 使用梯度下降法,通过沿着梯度反方向更新权重参数,逐步逼近极小值。
    3. 初始权重、步长和容差:初始化权重参数为 [0; 0],设置步长为 0.1,容差为 1e-5。
    4. 优化权重参数:调用 gradient_descent 函数,优化权重参数,并打印结果。

    总结:

    梯度下降法通过沿着目标函数梯度的反方向更新变量,能够有效地逼近函数的极小值。在神经网络训练竞赛中,利用梯度下降法可以有效地优化权重参数,以最小化训练误差。

    牛顿法

    应用类型: 参数优化、高精度问题求解

    算法简介: 牛顿法(Newton's Method)是一种用于求解无约束非线性优化问题的迭代算法。它利用目标函数的一阶和二阶导数信息,通过在当前点处近似目标函数为二次函数,逐步逼近函数的极小值。牛顿法因其快速收敛和高精度,常用于高精度问题求解。

    优势:

    1. 收敛速度快: 二次收敛速度使其在接近根时具有极高的精度。
    2. 精度高: 利用一阶和二阶导数信息,提高求解精度。
    3. 适用范围广: 适用于目标函数光滑且二次可导的情况。

    应用领域: 牛顿法广泛应用于数值分析、工程计算、物理模型求解、经济学模型优化等领域。

    非线性系统求解

    已知数据: 假设我们希望求解非线性方程

    实现代码:

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义目标函数及其导数
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">f = @(x) x^3 - 2*x^2 - 5;
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">df = @(x) 3*x^2 - 4*x;
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">% 牛顿法
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">function [x, fval] = newton_method(f, df, x0, tol)
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"> x = x0;
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line"> while abs(f(x)) > tol
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line"> x = x - f(x) / df(x);
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> end
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line"> fval = f(x);
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">end
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">% 定义初始点和容差
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">x0 = 3;
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">tol = 1e-5;
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">% 使用牛顿法求解非线性方程
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">[x, fval] = newton_method(f, df, x0, tol);
    20. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">
    21. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="21"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Root: %.5f\n', x);
    22. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="22"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Function value at root: %.5f\n', fval);
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义目标函数及其导数:函数 f 表示目标非线性方程,df 表示其导数。
    2. 牛顿法实现:函数 newton_method 使用牛顿法,通过在当前点处近似目标函数为二次函数,逐步逼近函数的根。
    3. 初始点和容差:初始化初始点为 3,设置容差为 1e-5。
    4. 求解非线性方程:调用 newton_method 函数,求解非线性方程,并打印结果。

    总结:

    牛顿法通过利用目标函数的一阶和二阶导数信息,能够快速逼近函数的极小值或根。在非线性系统求解竞赛中,利用牛顿法可以高效地求解复杂的非线性方程组。

    第四章:有约束非线性优化问题

    拉格朗日乘数法

    应用类型: 工程优化、经济模型

    算法简介: 拉格朗日乘数法(Lagrange Multiplier Method)是一种用于有约束非线性优化问题的算法。通过引入拉格朗日乘数,将约束条件融入目标函数,形成拉格朗日函数,从而将原问题转化为无约束优化问题进行求解。该方法广泛应用于工程和经济领域的优化问题中。

    优势:

    1. 灵活性高: 可以处理等式和不等式约束。
    2. 理论基础扎实: 基于凸优化理论,能保证求解的准确性。
    3. 适用范围广: 适用于各种非线性约束优化问题。

    应用领域: 拉格朗日乘数法广泛应用于工程设计优化、经济模型求解、资源分配、生产计划等领域。

    机械设计优化

    已知数据: 假设我们希望设计一个机械部件,使其在满足强度约束的同时,最小化成本。

    目标函数为:

    约束条件为:

    实现代码:

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义目标函数及其梯度
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">f = @(x) x(1)^2 + x(2)^2;
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">grad_f = @(x) [2*x(1); 2*x(2)];
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">% 定义约束条件及其梯度
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">g = @(x) 1 - x(1) - x(2);
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">grad_g = @(x) [-1; -1];
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">% 拉格朗日乘数法
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">function [x, lambda, fval] = lagrange_multiplier_method(f, grad_f, g, grad_g, x0, lambda0, tol)
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line"> x = x0;
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line"> lambda = lambda0;
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line"> while norm(grad_f(x) + lambda * grad_g(x)) > tol
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line"> x = x - 0.1 * (grad_f(x) + lambda * grad_g(x));
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line"> lambda = lambda - 0.1 * g(x);
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line"> end
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line"> fval = f(x);
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">end
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">
    20. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">% 定义初始点、初始拉格朗日乘数和容差
    21. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="21"> class="hljs-ln-code"> class="hljs-ln-line">x0 = [0.5; 0.5];
    22. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="22"> class="hljs-ln-code"> class="hljs-ln-line">lambda0 = 0;
    23. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="23"> class="hljs-ln-code"> class="hljs-ln-line">tol = 1e-5;
    24. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="24"> class="hljs-ln-code"> class="hljs-ln-line">
    25. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="25"> class="hljs-ln-code"> class="hljs-ln-line">% 使用拉格朗日乘数法优化
    26. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="26"> class="hljs-ln-code"> class="hljs-ln-line">[x, lambda, fval] = lagrange_multiplier_method(f, grad_f, g, grad_g, x0, lambda0, tol);
    27. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="27"> class="hljs-ln-code"> class="hljs-ln-line">
    28. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="28"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal parameters: x1 = %.5f, x2 = %.5f\n', x(1), x(2));
    29. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="29"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Lagrange multiplier: %.5f\n', lambda);
    30. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="30"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Minimum cost: %.5f\n', fval);
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义目标函数及其梯度:函数 f 表示目标函数,grad_f 表示其梯度。
    2. 定义约束条件及其梯度:函数 g 表示约束条件,grad_g 表示其梯度。
    3. 拉格朗日乘数法实现:函数 lagrange_multiplier_method 使用拉格朗日乘数法,通过引入拉格朗日乘数,将约束条件融入目标函数进行优化。
    4. 初始点、初始拉格朗日乘数和容差:初始化初始点为 [0.5; 0.5],初始拉格朗日乘数为 0,设置容差为 1e-5。
    5. 优化过程:调用 lagrange_multiplier_method 函数,优化参数并打印结果。

    总结:

    拉格朗日乘数法通过将约束条件融入目标函数,能够有效地求解有约束非线性优化问题。在机械设计优化竞赛中,利用拉格朗日乘数法可以找到满足强度约束的最优设计参数,以最小化设计成本。

    第五章:二次规划

    二次规划

    应用类型: 投资组合优化、资源分配、控制系统设计

    算法简介: 二次规划(Quadratic Programming,QP)是一类优化问题,其中目标函数为二次函数,约束条件为线性不等式或等式。二次规划问题可以通过各种优化算法求解,如内点法和信赖域法。该方法在处理具有二次目标函数的优化问题中具有高效性和精度。

    优势:

    1. 精度高: 利用二次函数的性质,提高求解精度。
    2. 收敛速度快: 在二次规划问题中具有良好的收敛性能。
    3. 适用范围广: 适用于具有二次目标函数和线性约束的优化问题。

    应用领域: 二次规划广泛应用于投资组合优化、资源分配、控制系统设计、机械设计等领域。

    投资组合优化

    已知数据: 假设我们有五种投资产品,每种产品的预期收益和风险如下表:

    class="table-box">
    P110%0.05
    class="table-box">
    P215%0.10
    class="table-box">
    P320%0.15
    class="table-box">
    P425%0.20
    class="table-box">
    P530%0.25

    我们希望通过合理分配资金,使得总体收益最大化,同时风险最小。

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义目标函数的系数矩阵和约束条件
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">H = diag([0.05, 0.10, 0.15, 0.20, 0.25]);
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">f = [-0.10; -0.15; -0.20; -0.25; -0.30];
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">Aeq = [1, 1, 1, 1, 1];
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">beq = 1;
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">lb = zeros(5, 1);
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">ub = ones(5, 1);
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">% 求解二次规划问题
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">options = optimoptions('quadprog', 'Display', 'off');
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">[x, fval] = quadprog(H, f, [], [], Aeq, beq, lb, ub, [], options);
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal investment in P1: %.2f%%\n', x(1) * 100);
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal investment in P2: %.2f%%\n', x(2) * 100);
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal investment in P3: %.2f%%\n', x(3) * 100);
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal investment in P4: %.2f%%\n', x(4) * 100);
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal investment in P5: %.2f%%\n', x(5) * 100);
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Minimum risk (variance): %.4f\n', fval);
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

     

    代码解释:

    1. 定义目标函数的系数矩阵和约束条件:矩阵 H 表示二次目标函数的系数矩阵,向量 f 表示一次项系数。矩阵 Aeq 和向量 beq 表示线性等式约束,向量 lbub 表示变量的下界和上界。
    2. 求解二次规划问题:调用 quadprog 函数,求解最优投资组合,并打印结果。

    总结:

    二次规划通过利用二次目标函数的性质,能够高效地求解具有线性约束的优化问题。在投资组合优化竞赛中,利用二次规划可以找到最优的投资组合,以最大化收益和最小化风险。

    第六章:混合整数线性规划

    混合整数线性规划(MILP)

    应用类型: 物流优化、项目调度、供应链管理

    算法简介: 混合整数线性规划(Mixed-Integer Linear Programming,MILP)是一类优化问题,其中目标函数和约束条件均为线性,但部分或全部决策变量必须是整数。MILP 可以通过分支定界法、割平面法等求解。该方法在处理整数和连续变量混合的优化问题中具有独特优势。

    优势:

    1. 精度高: 可以精确求解具有整数约束的优化问题。
    2. 灵活性强: 适用于多种实际应用场景,包含整数和连续变量。
    3. 全局最优: 在给定约束条件下能够找到全局最优解。

    应用领域: 混合整数线性规划广泛应用于物流优化、项目调度、供应链管理、设施选址等领域。

    工厂选址问题

    已知数据: 假设我们有三个潜在的工厂选址点,每个点的建设成本和满足市场需求的能力如下表:

    class="table-box">
    A200 万50%
    class="table-box">
    B300 万70%
    class="table-box">
    C400 万90%

     我们希望通过合理选择工厂选址,使得建设成本最小,同时满足至少 80% 的市场需求。

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义目标函数的系数和约束条件
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">f = [200; 300; 400];
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">intcon = [1, 2, 3];
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">A = [-0.5, -0.7, -0.9];
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">b = -0.8;
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">lb = zeros(3, 1);
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">ub = ones(3, 1);
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">% 求解混合整数线性规划问题
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">options = optimoptions('intlinprog', 'Display', 'off');
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">[x, fval] = intlinprog(f, intcon, A, b, [], [], lb, ub, options);
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Choose location A: %d\n', x(1));
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Choose location B: %d\n', x(2));
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Choose location C: %d\n', x(3));
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Minimum cost: %.2f 万元\n', fval);
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义目标函数的系数和约束条件:向量 f 表示建设成本,向量 intcon 表示整数变量的索引。矩阵 A 和向量 b 表示线性不等式约束,向量 lbub 表示变量的下界和上界。
    2. 求解混合整数线性规划问题:调用 intlinprog 函数,求解最优选址方案,并打印结果。

    总结:

    混合整数线性规划通过精确求解具有整数约束的优化问题,能够找到全局最优解。在工厂选址优化竞赛中,利用 MILP 可以找到最优的工厂选址方案,以最小化建设成本并满足市场需求。

    第七章:多目标规划

    多目标规划(权重法)

    应用类型: 生产计划、工程设计、资源分配

    算法简介: 多目标规划(Multi-Objective Optimization)是一类优化问题,其中需要同时优化多个目标函数。权重法是解决多目标规划问题的一种常用方法,通过为每个目标函数分配权重,将多目标函数合并为单一目标函数进行优化。该方法具有灵活性高、易于实现的特点。

    优势:

    1. 灵活性高: 可以根据实际需求调整目标权重。
    2. 适用范围广: 适用于多种多目标优化问题。
    3. 解决方案易解释: 多目标函数合并为单一目标函数,易于解释。

    应用领域: 多目标规划广泛应用于生产计划、工程设计、资源分配、供应链管理等领域。

    生产计划优化

    已知数据: 某工厂生产两种产品 P1 和 P2,每种产品的利润分别为 40 美元和 30 美元,同时希望最大化产量和利润。生产每种产品需要的资源如下表:

    class="table-box">
    P121
    class="table-box">
    P212

     工厂每天最多有 100 小时的资源1和 80 小时的资源2。

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义目标函数及其权重
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">function F = multi_obj_func(x)
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line"> F = [-x(1) - x(2); -40*x(1) - 30*x(2)];
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">end
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">% 定义初始点、目标值和权重
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">x0 = [0, 0];
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">goals = [0, 0];
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">weights = [1, 1];
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">A = [2, 1; 1, 2];
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">b = [100; 80];
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">lb = [0, 0];
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">ub = [];
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">% 求解多目标规划问题
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">options = optimoptions('fgoalattain', 'Display', 'off');
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">[x, fval] = fgoalattain(@multi_obj_func, x0, goals, weights, A, b, [], [], lb, ub, [], options);
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal production of P1: %.2f units\n', x(1));
    20. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal production of P2: %.2f units\n', x(2));
    21. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="21"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Goal attainment: %.2f, %.2f\n', fval);
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义目标函数及其权重:函数 multi_obj_func 表示多目标函数,目标为最大化产量和利润。向量 goals 表示目标值,向量 weights 表示目标权重。
    2. 定义初始点、目标值和权重:初始化初始点为 [0, 0],设置目标值为 [0, 0],权重为 [1, 1]
    3. 求解多目标规划问题:调用 fgoalattain 函数,求解最优生产计划,并打印结果。

    总结:

    多目标规划(权重法)通过为每个目标函数分配权重,将多目标函数合并为单一目标函数进行优化,能够灵活地处理多目标优化问题。在生产计划优化竞赛中,利用多目标规划可以找到同时最大化产量和利润的最优生产计划。

    第八章:极大最小化

    极大最小化

    应用类型: 决策分析、博弈论、稳健优化

    算法简介: 极大最小化(Maximin Optimization)是一类优化问题,目标是在最坏情况下找到最优解。该方法广泛应用于决策分析、博弈论和稳健优化问题中,通过最大化最小收益或最小化最大损失,寻找最优决策。

    优势:

    1. 稳健性强: 适用于不确定环境中的决策问题。
    2. 全局最优: 寻找到在最坏情况下的最优解。
    3. 应用广泛: 适用于金融、供应链、博弈论等多个领域。

    应用领域: 极大最小化广泛应用于决策分析、博弈论、稳健优化、供应链管理等领域。

    供货中心选址问题

    已知数据: 假设一个公司计划在三个城市中选址供货中心,以最小化最大供货距离。供货距离矩阵如下:

    class="table-box">
    A102030
    class="table-box">
    B201040
    class="table-box">
    C304010

     目标是找到最佳的选址组合,使得最大供货距离最小。

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义损失函数
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">function f = max_loss_func(x)
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line"> D = [10, 20, 30; 20, 10, 40; 30, 40, 10];
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line"> f = max(D * x);
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">end
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">% 定义初始点和约束条件
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">x0 = [0, 0, 0];
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">lb = zeros(3, 1);
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">ub = ones(3, 1);
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">% 求解极大最小化问题
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">options = optimoptions('fminimax', 'Display', 'off');
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">[x, fval] = fminimax(@max_loss_func, x0, [], [], [], [], lb, ub, [], options);
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Choose location A: %.2f\n', x(1));
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Choose location B: %.2f\n', x(2));
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Choose location C: %.2f\n', x(3));
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Minimum maximum loss: %.2f\n', fval);
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义损失函数:函数 max_loss_func 表示最大供货距离。
    2. 定义初始点和约束条件:初始化初始点为 [0, 0, 0],设置变量的下界和上界分别为 01
    3. 求解极大最小化问题:调用 fminimax 函数,求解最优选址方案,并打印结果。

    总结:

    极大最小化通过最大化最小收益或最小化最大损失,能够在不确定环境中找到最优决策。在供货中心选址竞赛中,利用极大最小化可以找到最优的选址方案,以最小化最大供货距离。

    第九章:半无限问题

    半无限优化

    应用类型: 设计优化、资源管理、控制系统

    算法简介: 半无限优化(Semi-Infinite Programming)是一类优化问题,其中目标函数和有限个约束条件为一般形式,而一组约束条件为无限多。该方法广泛应用于设计优化、资源管理和控制系统中,通过处理无穷多约束条件,寻找最优解。

    优势:

    1. 处理复杂约束: 能处理无穷多约束条件的优化问题。
    2. 灵活性高: 适用于多种实际应用场景。
    3. 精度高: 在复杂约束条件下能够找到精确解。

    应用领域: 半无限优化广泛应用于设计优化、资源管理、控制系统、金融工程等领域。

    天线设计优化

    已知数据: 假设我们需要设计一个天线,使其在特定频段内的性能最佳化。天线性能可以用一个函数 P(x) 表示,设计变量 x 需要满足某些约束条件。

    实现代码:

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义目标函数
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">function f = antenna_design_func(x)
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line"> f = x(1)^2 + x(2)^2 + x(1)*x(2);
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">end
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">% 定义约束条件
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">function [c, ceq] = antenna_constraints(x)
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line"> c = x(1) + x(2) - 1;
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line"> ceq = [];
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">end
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">% 定义初始点和约束条件
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">x0 = [0, 0];
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">% 求解半无限优化问题
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">options = optimoptions('fmincon', 'Display', 'off');
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">[x, fval] = fmincon(@antenna_design_func, x0, [], [], [], [], [], [], @antenna_constraints, options);
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal antenna design: x1 = %.2f, x2 = %.2f\n', x(1), x(2));
    20. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Minimum value: %.2f\n', fval);
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义目标函数:函数 antenna_design_func 表示天线性能目标函数。
    2. 定义约束条件:函数 antenna_constraints 表示天线设计约束条件。
    3. 定义初始点和约束条件:初始化初始点为 [0, 0]
    4. 求解半无限优化问题:调用 fmincon 函数,求解最优天线设计方案,并打印结果。

    总结:

    半无限优化通过处理无穷多约束条件,能够在复杂约束条件下找到精确解。在天线设计优化竞赛中,利用半无限优化可以找到满足特定频段性能的最优天线设计参数。

    第十章:最小二乘问题

    线性最小二乘法

    应用类型: 数据拟合、参数估计、信号处理

    算法简介: 线性最小二乘法(Linear Least Squares)是一种用于数据拟合和参数估计的优化方法,通过最小化目标函数与观测数据之间的平方误差,找到最佳拟合参数。该方法在处理线性模型和数据拟合问题中具有高效性和精度。

    优势:

    1. 计算速度快: 线性最小二乘法具有闭式解。
    2. 精度高: 能有效地处理线性模型。
    3. 适用广泛: 适用于各种数据拟合和参数估计问题。

    应用领域: 线性最小二乘法广泛应用于数据拟合、参数估计、信号处理、图像处理等领域。

    数据拟合

    已知数据: 假设我们有以下实验数据,需要拟合一个二次函数:

    x=[1,2,3,4,5]                y=[2.2,2.8,3.6,4.5,5.1]

    实现代码:

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义数据点
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">xdata = [1, 2, 3, 4, 5];
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">ydata = [2.2, 2.8, 3.6, 4.5, 5.1];
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">% 使用polyfit进行二次拟合
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">p = polyfit(xdata, ydata, 2);
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">yfit = polyval(p, xdata);
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">% 绘制数据和拟合曲线
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">figure;
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">plot(xdata, ydata, 'o', xdata, yfit, '-');
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">legend('Data', 'Fit');
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">title('Least Squares Fit');
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Optimal coefficients: a = %.5f, b = %.5f, c = %.5f\n', p(1), p(2), p(3));
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义数据点:向量 xdataydata 表示实验数据。
    2. 二次拟合:使用 polyfit 函数进行二次拟合,得到拟合参数 p
    3. 计算拟合值:使用 polyval 函数计算拟合曲线 yfit
    4. 绘制数据和拟合曲线:绘制实验数据和拟合曲线,并打印拟合参数。

    总结:

    线性最小二乘法通过最小化目标函数与观测数据之间的平方误差,能够高效地处理数据拟合和参数估计问题。在数据拟合竞赛中,利用线性最小二乘法可以找到最佳拟合参数,以准确地描述实验数据。

    第十一章:非线性方程(组)的求解

    牛顿法

    应用类型: 数值分析、工程计算、非线性系统求解

    算法简介: 牛顿法(Newton's Method)是一种用于求解非线性方程组的迭代算法。通过利用目标函数的一阶和二阶导数信息,在当前点处近似目标函数为二次函数,逐步逼近函数的根。牛顿法因其快速收敛和高精度,常用于高精度问题求解。

    优势:

    1. 收敛速度快: 二次收敛速度使其在接近根时具有极高的精度。
    2. 精度高: 利用一阶和二阶导数信息,提高求解精度。
    3. 适用范围广: 适用于目标函数光滑且二次可导的情况。

    应用领域: 牛顿法广泛应用于数值分析、工程计算、物理模型求解、经济学模型优化等领域。

    非线性系统求解

    已知数据: 假设我们需要求解以下非线性方程组:

    实现代码:

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义非线性方程组及其雅可比矩阵
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">F = @(x) [x(1)^2 + x(2)^2 - 4;
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line"> x(1) * x(2) - 1];
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">J = @(x) [2*x(1), 2*x(2);
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line"> x(2), x(1)];
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">% 牛顿法
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">function [x, fval] = newton_method(F, J, x0, tol)
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line"> x = x0;
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> while norm(F(x)) > tol
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line"> x = x - J(x)\F(x);
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line"> end
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line"> fval = F(x);
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">end
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">% 定义初始点和容差
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">x0 = [1, 1];
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">tol = 1e-5;
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">
    20. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">% 使用牛顿法求解非线性方程组
    21. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="21"> class="hljs-ln-code"> class="hljs-ln-line">[x, fval] = newton_method(F, J, x0, tol);
    22. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="22"> class="hljs-ln-code"> class="hljs-ln-line">
    23. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="23"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Solution: x1 = %.5f, x2 = %.5f\n', x(1), x(2));
    24. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="24"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Function value: fval1 = %.5f, fval2 = %.5f\n', fval(1), fval(2));
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    代码解释:

    1. 定义非线性方程组及其雅可比矩阵:函数 F 表示非线性方程组,J 表示雅可比矩阵。
    2. 牛顿法实现:函数 newton_method 使用牛顿法,通过在当前点处近似目标函数为二次函数,逐步逼近函数的根。
    3. 初始点和容差:初始化初始点为 [1, 1],设置容差为 1e-5。
    4. 求解非线性方程组:调用 newton_method 函数,求解非线性方程组,并打印结果。

    总结:

    牛顿法通过利用目标函数的一阶和二阶导数信息,能够快速逼近函数的根。在非线性系统求解竞赛中,利用牛顿法可以高效地求解复杂的非线性方程组。

    割线法

    应用类型: 数值分析、工程计算、非线性系统求解

    算法简介: 割线法(Secant Method)是一种用于求解非线性方程的迭代算法,通过利用两个初始猜测点,逐步逼近方程的根。与牛顿法不同,割线法不需要计算目标函数的导数,因此在目标函数不易求导或不可导的情况下具有优势。

    优势:

    1. 无需导数信息: 适用于目标函数不易求导或不可导的情况。
    2. 收敛速度快: 相比于直接求解方法,收敛速度较快。
    3. 适用范围广: 适用于多种非线性方程组求解问题。

    应用领域: 割线法广泛应用于数值分析、工程计算、物理模型求解、经济学模型优化等领域。

    非线性方程求解

    已知数据:

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">% 定义目标函数
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">f = @(x) x^3 - 2*x^2 - 5;
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">% 割线法
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">function root = secant_method(f, x0, x1, tol)
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line"> while abs(x1 - x0) > tol
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"> f0 = f(x0);
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line"> f1 = f(x1);
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line"> x2 = x1 - f1 * (x1 - x0) / (f1 - f0);
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> x0 = x1;
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line"> x1 = x2;
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line"> end
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line"> root = x1;
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">end
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">% 定义初始点和容差
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">x0 = 2;
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">x1 = 3;
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">tol = 1e-5;
    20. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">
    21. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="21"> class="hljs-ln-code"> class="hljs-ln-line">% 使用割线法求解非线性方程
    22. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="22"> class="hljs-ln-code"> class="hljs-ln-line">root = secant_method(f, x0, x1, tol);
    23. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="23"> class="hljs-ln-code"> class="hljs-ln-line">
    24. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="24"> class="hljs-ln-code"> class="hljs-ln-line">fprintf('Root: %.5f\n', root);
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

     

    代码解释:

    1. 定义目标函数:函数 f 表示非线性方程。
    2. 割线法实现:函数 secant_method 使用割线法,通过两个初始猜测点,逐步逼近方程的根。
    3. 初始点和容差:初始化初始点为 [2, 3],设置容差为 1e-5。
    4. 求解非线性方程:调用 secant_method 函数,求解非线性方程,并打印结果。

    总结:

    割线法通过利用两个初始猜测点,逐步逼近非线性方程的根,能够在无需导数信息的情况下高效求解。在非线性方程求解竞赛中,利用割线法可以找到方程的精确解。

    总结

    从一维搜索问题到非线性方程求解的各种优化算法,包括黄金分割法、线性规划、梯度下降法、拉格朗日乘数法、二次规划、混合整数线性规划、多目标规划、极大最小化、半无限优化、线性最小二乘法和牛顿法等。这些算法在实际竞赛环境中的应用有强大功能和解决问题的能力。

    data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://xiaolihenzhizhuo.blog.csdn.net/article/details/140818409","extend1":"pc","ab":"new"}">> id="blogVoteBox" style="width:400px;margin:auto;margin-top:12px" class="blog-vote-box"> class="vote-box csdn-vote"> class="pos-box pt0"> id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type2" id="blog_extension"> class="extension_official" data-report-click="{"spm":"1001.2101.3001.6471"}" data-report-view="{"spm":"1001.2101.3001.6471"}"> class="blog_extension_card_cont"> 我们一起相互学习呀!!! class="blog_extension_card_cont_r"> 微信名片
    注:本文转载自blog.csdn.net的小李很执着的文章"https://blog.csdn.net/2303_77720864/article/details/140818409"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
    复制链接

    评论记录:

    未查询到任何数据!