【MATLAB学习笔记】数值方法——区间消去法

前言

  在数值方法中,区间消去法常常被用来确定迭代的初始区间。确定了初始区间后,可以结合如牛顿法、抛物线法和黄金分割法等等方法进行极小值(点)的计算。

算法流程图

在这里插入图片描述

算法代码

function QJXQ(y,x0,h0,N)
    % y为所求函数, 符号函数
    % x0为初始点,默认为0
    % h0为初始迭代步长, 默认为0.1
    % N为最大迭代次数, 默认为100
    if nargin<4,N=100;end
    if nargin<3,h0=0.1;end
    if nargin<2,x0=0;end

    y = matlabFunction(y);  % 将符号函数转化为匿名函数

    n = 0;  % 当前迭代次数
    % 首次迭代
    n = n + 1;
    h = h0;
    x1 = x0;
    x2 = x1 + h;
    y1 = y(x1);
    y2 = y(x2);

    while true
    
        if y2 > y1 && n == 1
            h = -h;
            x3 = x1;   y3 = y1;
            x1 = x2;   y1 = y2;
            x2 = x3;   y2 = y3;
        elseif n ~= 1
            x1 = x2;   y1 = y2;
            x2 = x3;   y2 = y3;
        end
    
        x3 = x2 + h;
        y3 = y(x3);
    
        if y3 < y2
            h = 2*h;
        else
            fprintf(['第%d次迭代收敛:\nx1=%7.4f, x2=%7.4f, x3=%7.4f\ny1=%7.4f,' ...
                ' y2=%7.4f, y3=%7.4f\n最优区间为[%7.4f,%7.4f]\n'],n, x1, x2, x3, y1, y2, y3, x1, x3)
            break
        end

        n = n + 1;
        if n > N
            fprintf('超过最大迭代次数%d,请调整参数!\n',N)
            break
        end
    end
end

测试

  使用函数y = x^2 - 6*x + 9对算法进行测试。

%% 
syms x
h0 = 0.1; % 步长
x0 = 2; % 初始点
y = x.^2 - 6*x + 9; % 目标函数
N = 100;    % 最大迭代次数  
QJXQ(y,x0,h0,N)

测试结果:

在这里插入图片描述

总代码

clc;clear;close all
%% 
syms x
h0 = 0.1; % 步长
x0 = 2; % 初始点
y = x.^2 - 6*x + 9; % 目标函数
N = 100;    % 最大迭代次数  
QJXQ(y,x0,h0,N)

%% 
function QJXQ(y,x0,h0,N)
    % y为所求函数, 符号函数
    % x0为初始点,默认为0
    % h0为初始迭代步长, 默认为0.1
    % N为最大迭代次数, 默认为100
    if nargin<4,N=100;end
    if nargin<3,h0=0.1;end
    if nargin<2,x0=0;end

    y = matlabFunction(y);  % 将符号函数转化为匿名函数

    n = 0;  % 当前迭代次数
    % 首次迭代
    n = n + 1;
    h = h0;
    x1 = x0;
    x2 = x1 + h;
    y1 = y(x1);
    y2 = y(x2);

    while true
    
        if y2 > y1 && n == 1
            h = -h;
            x3 = x1;   y3 = y1;
            x1 = x2;   y1 = y2;
            x2 = x3;   y2 = y3;
        elseif n ~= 1
            x1 = x2;   y1 = y2;
            x2 = x3;   y2 = y3;
        end
    
        x3 = x2 + h;
        y3 = y(x3);
    
        if y3 < y2
            h = 2*h;
        else
            fprintf(['第%d次迭代收敛:\nx1=%7.4f, x2=%7.4f, x3=%7.4f\ny1=%7.4f,' ...
                ' y2=%7.4f, y3=%7.4f\n最优区间为[%7.4f,%7.4f]\n'],n, x1, x2, x3, y1, y2, y3, x1, x3)
            break
        end

        n = n + 1;
        if n > N
            fprintf('超过最大迭代次数%d,请调整参数!\n',N)
            break
        end
    end
end

总结

  这只是一个基础的示例,实际中还会有更具体的、更细致的要求,这就需要再做额外调整;另外本人也仍在学习中,这只是个人的学习笔记,可能还有一些不足之处,欢迎指正。

参考文献

主编白清顺. 机械优化设计.第6版 [M]. 2017.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Infww

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

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

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

打赏作者

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

抵扣说明:

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

余额充值